light/modules/renderer/vk/pass.cppm

126 lines
3.2 KiB
Text
Raw Permalink Normal View History

export module renderer.vk.pass;
2026-01-20 09:58:35 +03:30
import preliminary;
import renderer.data;
import renderer.vk.api_wrapper;
import renderer.vk.device;
import renderer.vk.swapchain;
import assets.shader;
import assets.metadata;
import memory.null_on_move;
import renderer.frontend;
2026-01-20 09:58:35 +03:30
export namespace lt::renderer::vkb {
2026-01-20 09:58:35 +03:30
class Pass: public IPass
{
public:
Pass(
class IDevice *device,
const lt::assets::ShaderAsset &vertex_shader,
const lt::assets::ShaderAsset &fragment_shader
);
[[nodiscard]] auto get_pipeline() -> vk::Pipeline &
{
return m_pipeline;
}
[[nodiscard]] auto get_pipeline_layout() -> vk::PipelineLayout &
{
return m_layout;
}
[[nodiscard]] auto get_descriptor_set_layout() -> vk::DescriptorSetLayout &
{
return m_descriptor_set_layout;
}
private:
Device *m_device {};
vk::DescriptorSetLayout m_descriptor_set_layout;
vk::DescriptorPool m_descriptor_pool;
vk::DescriptorSet m_vertices_descriptor_set;
vk::PipelineLayout m_layout;
vk::Pipeline m_pipeline;
};
} // namespace lt::renderer::vkb
module :private;
2026-01-20 09:58:35 +03:30
namespace lt::renderer::vkb {
using enum vk::DescriptorSetLayout::Binding::FlagBits;
Pass::Pass(
IDevice *device,
const lt::assets::ShaderAsset &vertex_shader,
const lt::assets::ShaderAsset &fragment_shader
)
: m_device(static_cast<Device *>(device))
, m_descriptor_set_layout(m_device->vk(),{
.flags = vk::DescriptorSetLayout::CreateInfo::FlagBits::update_after_bind_pool,
.bindings = {
{
.flags = 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,
},
}}),
m_layout(vk::PipelineLayout(m_device->vk(),{
.descriptor_set_layouts = { &m_descriptor_set_layout },
.push_constant_ranges = { { vk::ShaderStageFlags::vertex_bit, 0u, sizeof(FrameConstants) } }
}))
{
auto shaders = std::vector<std::pair<vk::ShaderModule, vk::ShaderStageFlags::T>> {};
shaders.emplace_back(
vk::ShaderModule(
m_device->vk(),
vk::ShaderModule::CreateInfo {
.code = vertex_shader.unpack(lt::assets::ShaderAsset::BlobTag::code),
}
),
vk::ShaderStageFlags::vertex_bit
);
shaders.emplace_back(
vk::ShaderModule(
m_device->vk(),
vk::ShaderModule::CreateInfo {
.code = fragment_shader.unpack(lt::assets::ShaderAsset::BlobTag::code),
}
),
vk::ShaderStageFlags::fragment_bit
);
m_pipeline = vk::Pipeline(
m_device->vk(),
m_layout,
vk::Pipeline::CreateInfo {
.shaders = std::move(shaders),
.input_assembly_state = {
.topology = vk::PrimitiveTopology::triangle_strip,
.primitive_restart_enabled = true,
},
.viewport_state = {
.viewport_count = 1u,
.scissor_count = 1u,
},
.rasterization_state = vk::Pipeline::RasterizationState {},
.multisampling_state = vk::Pipeline::MultisamplingState {},
.attachment_state = vk::
Pipeline::AttachmentState {},
.debug_name = "abcdefgh"
}
);
}
2026-01-20 09:58:35 +03:30
} // namespace lt::renderer::vkb