From 8730d31e2f1ebb01e9b0b1ff77ec0587376e7ef7 Mon Sep 17 00:00:00 2001 From: light7734 Date: Tue, 28 Oct 2025 16:02:11 +0330 Subject: [PATCH] refactor(renderer/vk/gpu): quality of life modifications --- .../private/backend/vk/context/gpu.cpp | 31 ++++++++------- .../private/backend/vk/context/gpu.hpp | 38 +++++++++++++++---- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/modules/renderer/private/backend/vk/context/gpu.cpp b/modules/renderer/private/backend/vk/context/gpu.cpp index 84cb5d3..1644cf1 100644 --- a/modules/renderer/private/backend/vk/context/gpu.cpp +++ b/modules/renderer/private/backend/vk/context/gpu.cpp @@ -5,35 +5,38 @@ namespace lt::renderer::vk { Gpu::Gpu(IInstance *instance) + : m_descriptor_indexing_features( + { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES } + ) { auto gpus = static_cast(instance)->enumerate_gpus(); for (auto &gpu : gpus) { 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_features(gpu, &features); if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU - && features.geometryShader) + && features.features.geometryShader) { m_gpu = gpu; } } ensure(m_gpu, "Failed to find any suitable Vulkan physical device"); -} -[[nodiscard]] auto Gpu::get_queue_family_properties() const -> std::vector -{ + + vk_get_physical_device_memory_properties(m_gpu, &m_memory_properties); + auto count = uint32_t { 0u }; vk_get_physical_device_queue_family_properties(m_gpu, &count, nullptr); - - auto properties = std::vector(count); - vk_get_physical_device_queue_family_properties(m_gpu, &count, properties.data()); - - return properties; + m_queue_family_properties.resize(count); + vk_get_physical_device_queue_family_properties(m_gpu, &count, m_queue_family_properties.data()); } [[nodiscard]] auto Gpu::queue_family_supports_presentation( @@ -67,11 +70,11 @@ Gpu::Gpu(IInstance *instance) return formats; } -[[nodiscard]] auto Gpu::get_memory_properties() const -> VkPhysicalDeviceMemoryProperties +[[nodiscard]] auto Gpu::create_device(VkDeviceCreateInfo info) const -> VkDevice { - auto memory_properties = VkPhysicalDeviceMemoryProperties {}; - vk_get_physical_device_memory_properties(m_gpu, &memory_properties); - return memory_properties; + auto *device = VkDevice {}; + vkc(vk_create_device(m_gpu, &info, nullptr, &device)); + return device; } } // namespace lt::renderer::vk diff --git a/modules/renderer/private/backend/vk/context/gpu.hpp b/modules/renderer/private/backend/vk/context/gpu.hpp index e6a5d40..ff8e035 100644 --- a/modules/renderer/private/backend/vk/context/gpu.hpp +++ b/modules/renderer/private/backend/vk/context/gpu.hpp @@ -12,13 +12,6 @@ class Gpu: public IGpu public: Gpu(IInstance *instance); - [[nodiscard]] auto vk() const -> VkPhysicalDevice - { - return m_gpu; - } - - [[nodiscard]] auto get_queue_family_properties() const -> std::vector; - [[nodiscard]] auto queue_family_supports_presentation( VkSurfaceKHR surface, uint32_t queue_family_idx @@ -30,10 +23,39 @@ public: [[nodiscard]] auto get_surface_formats(VkSurfaceKHR surface) const -> std::vector; - [[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 + { + return m_queue_family_properties; + } private: memory::NullOnMove m_gpu = VK_NULL_HANDLE; + + VkPhysicalDeviceProperties m_properties {}; + + VkPhysicalDeviceDescriptorIndexingFeatures m_descriptor_indexing_features; + + VkPhysicalDeviceMemoryProperties m_memory_properties {}; + + std::vector m_queue_family_properties; }; } // namespace lt::renderer::vk