Compare commits

...

3 commits

Author SHA1 Message Date
604ee5e6a1 fix(renderer/vk/raii): special member function issues
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-10-30 13:45:48 +03:30
7ee4381bbf feat(renderer/vk): add some vulkan functions 2025-10-30 13:45:48 +03:30
8730d31e2f refactor(renderer/vk/gpu): quality of life modifications 2025-10-30 13:45:48 +03:30
5 changed files with 98 additions and 27 deletions

View file

@ -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 *>(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<VkQueueFamilyProperties>
{
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<VkQueueFamilyProperties>(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

View file

@ -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<VkQueueFamilyProperties>;
[[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<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:
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

View file

@ -29,7 +29,7 @@ PFN_vkGetPhysicalDeviceQueueFamilyProperties vk_get_physical_device_queue_family
PFN_vkCreateDevice vk_create_device {};
PFN_vkGetDeviceProcAddr vk_get_device_proc_address {};
PFN_vkDestroyDevice vk_destroy_device {};
PFN_vkGetPhysicalDeviceFeatures vk_get_physical_device_features {};
PFN_vkGetPhysicalDeviceFeatures2 vk_get_physical_device_features {};
PFN_vkEnumerateDeviceExtensionProperties vk_enumerate_device_extension_properties {};
PFN_vkGetPhysicalDeviceMemoryProperties vk_get_physical_device_memory_properties {};
@ -88,6 +88,14 @@ PFN_vkCmdDraw vk_cmd_draw {};
PFN_vkCmdSetViewport vk_cmd_set_viewport {};
PFN_vkCmdSetScissor vk_cmd_set_scissors {};
PFN_vkCmdPushConstants vk_cmd_push_constants {};
PFN_vkCmdCopyBuffer vk_cmd_copy_buffer {};
PFN_vkCreateDescriptorSetLayout vk_create_descriptor_set_layout {};
PFN_vkDestroyDescriptorSetLayout vk_destroy_descriptor_set_layout {};
PFN_vkCreateDescriptorPool vk_create_descriptor_pool {};
PFN_vkDestroyDescriptorPool vk_destroy_descriptor_pool {};
PFN_vkAllocateDescriptorSets vk_allocate_descriptor_sets {};
PFN_vkFreeDescriptorSets vk_free_descriptor_sets {};
PFN_vkCreateBuffer vk_create_buffer {};
PFN_vkDestroyBuffer vk_destroy_buffer {};
@ -142,6 +150,7 @@ void Instance::initialize_instance()
VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
};
const char *layer_name = "VK_LAYER_KHRONOS_validation";
@ -387,6 +396,13 @@ void Instance::load_device_functions_impl(VkDevice device)
load_fn(vk_cmd_set_viewport, "vkCmdSetViewport");
load_fn(vk_cmd_set_scissors, "vkCmdSetScissor");
load_fn(vk_cmd_push_constants, "vkCmdPushConstants");
load_fn(vk_cmd_copy_buffer, "vkCmdCopyBuffer");
load_fn(vk_create_descriptor_set_layout, "vkCreateDescriptorSetLayout");
load_fn(vk_destroy_descriptor_set_layout, "vkDestroyDescriptorSetLayout");
load_fn(vk_create_descriptor_pool, "vkCreateDescriptorPool");
load_fn(vk_destroy_descriptor_pool, "vkDestroyDescriptorPool");
load_fn(vk_allocate_descriptor_sets, "vkAllocateDescriptorSets");
load_fn(vk_free_descriptor_sets, "vkFreeDescriptorSets");
load_fn(vk_create_buffer, "vkCreateBuffer");
load_fn(vk_destroy_buffer, "vkDestroyBuffer");
load_fn(vk_allocate_memory, "vkAllocateMemory");

View file

@ -4,7 +4,7 @@
#include <renderer/backend/vk/vulkan.hpp>
namespace lt::renderer::vk::raii { // NOLINTBEGIN(cppcoreguidelines-special-member-functions)
namespace lt::renderer::vk::raii {
class DebugMessenger
{
@ -23,13 +23,20 @@ public:
}
}
DebugMessenger(DebugMessenger &&) = default;
DebugMessenger(const DebugMessenger &) = delete;
auto operator=(DebugMessenger &&) -> DebugMessenger & = default;
auto operator=(const DebugMessenger &) -> DebugMessenger & = delete;
private:
memory::NullOnMove<Instance *> m_instance {};
VkDebugUtilsMessengerEXT m_object;
};
// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
class Buffer
{
public:
@ -47,6 +54,14 @@ public:
}
}
Buffer(Buffer &&) = default;
Buffer(const Buffer &) = delete;
auto operator=(Buffer &&) -> Buffer & = default;
auto operator=(const Buffer &) -> Buffer & = delete;
[[nodiscard]] auto operator*() const -> VkBuffer
{
return m_object;
@ -81,6 +96,14 @@ public:
}
}
Memory(Memory &&) = default;
Memory(const Memory &) = delete;
auto operator=(Memory &&) -> Memory & = default;
auto operator=(const Memory &) -> Memory & = delete;
[[nodiscard]] auto operator*() const -> VkDeviceMemory
{
return m_object;
@ -98,5 +121,4 @@ private:
};
// NOLINTEND(cppcoreguidelines-special-member-functions)
} // namespace lt::renderer::vk::raii

View file

@ -13,7 +13,7 @@ extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vk_get_physical_device_queue
extern PFN_vkCreateDevice vk_create_device;
extern PFN_vkGetDeviceProcAddr vk_get_device_proc_address;
extern PFN_vkDestroyDevice vk_destroy_device;
extern PFN_vkGetPhysicalDeviceFeatures vk_get_physical_device_features;
extern PFN_vkGetPhysicalDeviceFeatures2 vk_get_physical_device_features;
extern PFN_vkEnumerateDeviceExtensionProperties vk_enumerate_device_extension_properties;
extern PFN_vkGetPhysicalDeviceMemoryProperties vk_get_physical_device_memory_properties;
@ -77,6 +77,14 @@ extern PFN_vkCmdDraw vk_cmd_draw;
extern PFN_vkCmdSetViewport vk_cmd_set_viewport;
extern PFN_vkCmdSetScissor vk_cmd_set_scissors;
extern PFN_vkCmdPushConstants vk_cmd_push_constants;
extern PFN_vkCmdCopyBuffer vk_cmd_copy_buffer;
extern PFN_vkCreateDescriptorSetLayout vk_create_descriptor_set_layout;
extern PFN_vkDestroyDescriptorSetLayout vk_destroy_descriptor_set_layout;
extern PFN_vkCreateDescriptorPool vk_create_descriptor_pool;
extern PFN_vkDestroyDescriptorPool vk_destroy_descriptor_pool;
extern PFN_vkAllocateDescriptorSets vk_allocate_descriptor_sets;
extern PFN_vkFreeDescriptorSets vk_free_descriptor_sets;
extern PFN_vkCreateBuffer vk_create_buffer;
extern PFN_vkDestroyBuffer vk_destroy_buffer;