From 2f60b837c92365082e6842ae490ba24fb6c023ba Mon Sep 17 00:00:00 2001 From: light7734 Date: Mon, 10 Nov 2025 23:16:03 +0330 Subject: [PATCH] wip: convert from include style to module import style :D --- modules/CMakeLists.txt | 1 + modules/renderer/data.cppm | 3 +- modules/renderer/vk/api_wrapper.cppm | 154 ++++++++++++++++++++++++--- modules/renderer/vk/pass.cppm | 108 +++++++++---------- 4 files changed, 198 insertions(+), 68 deletions(-) diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index d45142a..22aa8d0 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -150,6 +150,7 @@ add_library_module( NAME renderer INTERFACES + data.cppm frontends.cppm factory.cppm vk/api_wrapper.cppm diff --git a/modules/renderer/data.cppm b/modules/renderer/data.cppm index 89bb6a0..6b19f09 100644 --- a/modules/renderer/data.cppm +++ b/modules/renderer/data.cppm @@ -1,6 +1,7 @@ export module renderer.data; -#include +import math.mat4; + namespace lt::renderer { diff --git a/modules/renderer/vk/api_wrapper.cppm b/modules/renderer/vk/api_wrapper.cppm index 0f9eaf2..7616e9d 100644 --- a/modules/renderer/vk/api_wrapper.cppm +++ b/modules/renderer/vk/api_wrapper.cppm @@ -36,6 +36,7 @@ struct overloads: Ts... export namespace lt::renderer::vk { using Bool32 = VkBool32; +using Flags = VkFlags; namespace constants { @@ -1826,6 +1827,105 @@ private: VkShaderModule m_shader_module {}; }; +class DescriptorPool +{ +}; + + +class DescriptorSet +{ +public: + enum class Type : std::underlying_type_t + { + sampler = VK_DESCRIPTOR_TYPE_SAMPLER, + combined_image_sampler = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + sampled_image = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + storage_image = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + uniform_texel_buffer = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, + storage_texel_buffer = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, + uniform_buffer = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + storage_buffer = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + uniform_buffer_dynamic = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + storage_buffer_dynamic = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, + input_attachment = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, + inline_uniform_block = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, + acceleration_structure = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, + acceleration_structure_nv = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, + sample_weight_image_qcom = VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM, + block_match_image_qcom = VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM, + tensor_arm = VK_DESCRIPTOR_TYPE_TENSOR_ARM, + _mutable = VK_DESCRIPTOR_TYPE_MUTABLE_EXT, + partitioned_acceleration_structure_nv + = VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV, + }; +}; + +class DescriptorSetLayout +{ +public: + static constexpr auto object_type = VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT; + + struct Binding + { + enum FlagBits : std::underlying_type_t + { + update_after_bind = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, + update_unused_while_pending = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, + partially_bound = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT, + variable_descriptor_count = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, + }; + + Flags flags; + + std::uint32_t idx; + + std::uint32_t count; + + DescriptorSet::Type type; + + ShaderStageFlags::T shader_stages; + }; + + struct CreateInfo + { + enum FlagBits : std::underlying_type_t + { + update_after_bind_pool = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, + push_descriptor = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT, + descriptor_buffer = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, + embedded_immutable_samplers + = VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT, + indirect_bindable_nv = VK_DESCRIPTOR_SET_LAYOUT_CREATE_INDIRECT_BINDABLE_BIT_NV, + host_only_pool = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT, + per_stage_nv = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PER_STAGE_BIT_NV, + }; + + Flags flags; + + std::vector bindings; + }; + + DescriptorSetLayout() = default; + + DescriptorSetLayout(Device &device, CreateInfo info); + + DescriptorSetLayout(DescriptorSetLayout &&) = default; + + DescriptorSetLayout(const DescriptorSetLayout &) = delete; + + auto operator=(DescriptorSetLayout &&) -> DescriptorSetLayout & = default; + + auto operator=(const DescriptorSetLayout &) -> DescriptorSetLayout & = delete; + + ~DescriptorSetLayout(); + + +private: + memory::NullOnMove m_device; + + VkDescriptorSetLayout m_layout; +}; + class Pipeline { public: @@ -1955,8 +2055,18 @@ public: static constexpr auto object_type = VK_OBJECT_TYPE_PIPELINE_LAYOUT; + struct PushConstantRange + { + ShaderStageFlags::T shader_stages; + std::uint32_t offset; + std::uint32_t size; + }; + struct CreateInfo { + std::vector descriptor_set_layouts; + + std::vector push_constant_ranges; }; PipelineLayout() = default; @@ -1973,7 +2083,6 @@ public: ~PipelineLayout(); - private: [[nodiscard]] auto get_vk_handle() -> VkPipelineLayout { @@ -1985,17 +2094,6 @@ private: VkPipelineLayout m_layout {}; }; -class DescriptorPool -{ -}; - -class DescriptorSetLayout -{ -}; - -class DescriptorSet -{ -}; } // namespace lt::renderer::vk @@ -3670,3 +3768,35 @@ auto enumerate_instance_extension_properties() -> std::vectorcreate_descriptor_set_layout( +// { +// .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, +// .pNext = &descriptor_binding_flags_info, +// .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT, +// .bindingCount = 1u, +// .pBindings = &binding, +// +// } +// ); diff --git a/modules/renderer/vk/pass.cppm b/modules/renderer/vk/pass.cppm index f323860..b57756f 100644 --- a/modules/renderer/vk/pass.cppm +++ b/modules/renderer/vk/pass.cppm @@ -1,5 +1,6 @@ export module renderer.vk.pass; +import renderer.data; import renderer.backend.vk.library_wrapper; import renderer.backend.vk.device; import renderer.backend.vk.swapchain; @@ -33,15 +34,15 @@ public: private: Device *m_device {}; - vk::PipelineLayout m_layout; - - vk::Pipeline m_pipeline; + vk::DescriptorSetLayout m_descriptor_set_layout; vk::DescriptorPool m_descriptor_pool; - vk::DescriptorSetLayout m_vertices_descriptor_set_layout; - vk::DescriptorSet m_vertices_descriptor_set; + + vk::PipelineLayout m_layout; + + vk::Pipeline m_pipeline; }; } // namespace lt::renderer::vkb @@ -57,41 +58,54 @@ Pass::Pass( const lt::assets::ShaderAsset &fragment_shader ) : m_device(static_cast(device)) + { - // auto binding = VkDescriptorSetLayoutBinding { - // .binding = 0, - // .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - // .descriptorCount = 1'000, - // .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, - // }; - // - // const auto descriptor_binding_flags = VkDescriptorBindingFlagsEXT { - // VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT - // | VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT - // | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT - // | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, - // }; - // - // constexpr auto descriptor_count = uint32_t { 1'000 }; - // - // auto descriptor_binding_flags_info = VkDescriptorSetLayoutBindingFlagsCreateInfoEXT { - // .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, - // .bindingCount = 1, - // .pBindingFlags = &descriptor_binding_flags, - // }; - // - // - // m_vertices_descriptor_set_layout = m_device->create_descriptor_set_layout( - // { - // .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - // .pNext = &descriptor_binding_flags_info, - // .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT, - // .bindingCount = 1u, - // .pBindings = &binding, - // - // } - // ); - // + using enum vk::DescriptorSetLayout::Binding::FlagBits; + auto bindings = std::vector { + { + .flags = variable_descriptor_count | partially_bound | update_after_bind + | update_unused_while_pending, + .idx = 0u, + .count = 1'000u, + .type = vk::DescriptorSet::Type::storage_buffer, + .shader_stages = vk::ShaderStageFlags::vertex_bit, + }, + }; + + using enum vk::DescriptorSetLayout::CreateInfo::FlagBits; + m_descriptor_set_layout = vk::DescriptorSetLayout( + m_device->vk(), + vk::DescriptorSetLayout::CreateInfo { + .flags = update_after_bind_pool, + .bindings = { + vk::DescriptorSetLayout::Binding { + .flags = variable_descriptor_count | partially_bound | update_after_bind | update_unused_while_pending, + .idx = 0u, + .count = 1'000u, + .type = vk::DescriptorSet::Type::storage_buffer, + .shader_stages = vk::ShaderStageFlags::vertex_bit, + }, + }, + } + ); + + auto push_constant_ranges = std::vector { + { + .shader_stages = vk::ShaderStageFlags::vertex_bit, + .offset = 0u, + .size = sizeof(FrameConstants), + }, + }; + m_layout = vk::PipelineLayout( + m_device->vk(), + vk::PipelineLayout::CreateInfo { + .descriptor_set_layouts = { + &m_descriptor_set_layout, + }, + .push_constant_ranges = push_constant_ranges, + } + ); + // auto pool_size = VkDescriptorPoolSize { // .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // .descriptorCount = descriptor_count, @@ -122,22 +136,6 @@ Pass::Pass( // } // ); - m_layout = vk::PipelineLayout( - m_device->vk(), - vk::PipelineLayout::CreateInfo { - // std::vector { - // m_vertices_descriptor_set_layout, - // }, - // - // std::vector { - // VkPushConstantRange { - // .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, - // .offset = 0u, - // .size = sizeof(FrameConstants), - // }, - // }, - } - ); auto shaders = std::vector> {}; shaders.emplace_back(