refactor(renderer/vk/gpu): quality of life modifications

This commit is contained in:
light7734 2025-10-28 16:02:11 +03:30
parent f50208653e
commit 8730d31e2f
2 changed files with 47 additions and 22 deletions

View file

@ -5,35 +5,38 @@
namespace lt::renderer::vk { namespace lt::renderer::vk {
Gpu::Gpu(IInstance *instance) Gpu::Gpu(IInstance *instance)
: m_descriptor_indexing_features(
{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES }
)
{ {
auto gpus = static_cast<Instance *>(instance)->enumerate_gpus(); auto gpus = static_cast<Instance *>(instance)->enumerate_gpus();
for (auto &gpu : gpus) for (auto &gpu : gpus)
{ {
auto properties = VkPhysicalDeviceProperties {}; auto properties = VkPhysicalDeviceProperties {};
auto features = VkPhysicalDeviceFeatures {}; auto features = VkPhysicalDeviceFeatures2 {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
.pNext = &m_descriptor_indexing_features
};
vk_get_physical_device_properties(gpu, &properties); vk_get_physical_device_properties(gpu, &properties);
vk_get_physical_device_features(gpu, &features); vk_get_physical_device_features(gpu, &features);
if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
&& features.geometryShader) && features.features.geometryShader)
{ {
m_gpu = gpu; m_gpu = gpu;
} }
} }
ensure(m_gpu, "Failed to find any suitable Vulkan physical device"); ensure(m_gpu, "Failed to find any suitable Vulkan physical device");
}
[[nodiscard]] auto Gpu::get_queue_family_properties() const -> std::vector<VkQueueFamilyProperties>
{ vk_get_physical_device_memory_properties(m_gpu, &m_memory_properties);
auto count = uint32_t { 0u }; auto count = uint32_t { 0u };
vk_get_physical_device_queue_family_properties(m_gpu, &count, nullptr); vk_get_physical_device_queue_family_properties(m_gpu, &count, nullptr);
m_queue_family_properties.resize(count);
auto properties = std::vector<VkQueueFamilyProperties>(count); vk_get_physical_device_queue_family_properties(m_gpu, &count, m_queue_family_properties.data());
vk_get_physical_device_queue_family_properties(m_gpu, &count, properties.data());
return properties;
} }
[[nodiscard]] auto Gpu::queue_family_supports_presentation( [[nodiscard]] auto Gpu::queue_family_supports_presentation(
@ -67,11 +70,11 @@ Gpu::Gpu(IInstance *instance)
return formats; return formats;
} }
[[nodiscard]] auto Gpu::get_memory_properties() const -> VkPhysicalDeviceMemoryProperties [[nodiscard]] auto Gpu::create_device(VkDeviceCreateInfo info) const -> VkDevice
{ {
auto memory_properties = VkPhysicalDeviceMemoryProperties {}; auto *device = VkDevice {};
vk_get_physical_device_memory_properties(m_gpu, &memory_properties); vkc(vk_create_device(m_gpu, &info, nullptr, &device));
return memory_properties; return device;
} }
} // namespace lt::renderer::vk } // namespace lt::renderer::vk

View file

@ -12,13 +12,6 @@ class Gpu: public IGpu
public: public:
Gpu(IInstance *instance); Gpu(IInstance *instance);
[[nodiscard]] auto vk() const -> VkPhysicalDevice
{
return m_gpu;
}
[[nodiscard]] auto get_queue_family_properties() const -> std::vector<VkQueueFamilyProperties>;
[[nodiscard]] auto queue_family_supports_presentation( [[nodiscard]] auto queue_family_supports_presentation(
VkSurfaceKHR surface, VkSurfaceKHR surface,
uint32_t queue_family_idx uint32_t queue_family_idx
@ -30,10 +23,39 @@ public:
[[nodiscard]] auto get_surface_formats(VkSurfaceKHR surface) const [[nodiscard]] auto get_surface_formats(VkSurfaceKHR surface) const
-> std::vector<VkSurfaceFormatKHR>; -> std::vector<VkSurfaceFormatKHR>;
[[nodiscard]] auto get_memory_properties() const -> VkPhysicalDeviceMemoryProperties; [[nodiscard]] auto create_device(VkDeviceCreateInfo info) const -> VkDevice;
[[nodiscard]] auto get_properties() const -> VkPhysicalDeviceProperties
{
return m_properties;
}
[[nodiscard]] auto get_descriptor_indexing_features() const
-> VkPhysicalDeviceDescriptorIndexingFeatures
{
return m_descriptor_indexing_features;
}
[[nodiscard]] auto get_memory_properties() const -> VkPhysicalDeviceMemoryProperties
{
return m_memory_properties;
}
[[nodiscard]] auto get_queue_family_properties() const -> std::vector<VkQueueFamilyProperties>
{
return m_queue_family_properties;
}
private: private:
memory::NullOnMove<VkPhysicalDevice> m_gpu = VK_NULL_HANDLE; memory::NullOnMove<VkPhysicalDevice> m_gpu = VK_NULL_HANDLE;
VkPhysicalDeviceProperties m_properties {};
VkPhysicalDeviceDescriptorIndexingFeatures m_descriptor_indexing_features;
VkPhysicalDeviceMemoryProperties m_memory_properties {};
std::vector<VkQueueFamilyProperties> m_queue_family_properties;
}; };
} // namespace lt::renderer::vk } // namespace lt::renderer::vk