180 lines
5 KiB
C++
180 lines
5 KiB
C++
export module renderer.vk.pass;
|
|
import renderer.data;
|
|
import renderer.backend.vk.library_wrapper;
|
|
import renderer.backend.vk.device;
|
|
import renderer.backend.vk.swapchain;
|
|
import assets.shader;
|
|
import assets.metadata;
|
|
import memory.null_on_move;
|
|
import renderer.frontend;
|
|
import std;
|
|
|
|
namespace lt::renderer::vkb {
|
|
|
|
export 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_layout() -> vk::PipelineLayout &
|
|
{
|
|
return m_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;
|
|
using namespace ::lt::renderer::vkb;
|
|
using namespace ::lt::renderer;
|
|
|
|
Pass::Pass(
|
|
IDevice *device,
|
|
const lt::assets::ShaderAsset &vertex_shader,
|
|
const lt::assets::ShaderAsset &fragment_shader
|
|
)
|
|
: m_device(static_cast<Device *>(device))
|
|
|
|
{
|
|
using enum vk::DescriptorSetLayout::Binding::FlagBits;
|
|
auto bindings = std::vector<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,
|
|
},
|
|
};
|
|
|
|
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<vk::PipelineLayout::PushConstantRange> {
|
|
{
|
|
.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,
|
|
// };
|
|
//
|
|
// m_descriptor_pool = m_device->create_desscriptor_pool(
|
|
// {
|
|
// .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
|
// .poolSizeCount = 1u,
|
|
// .pPoolSizes = &pool_size,
|
|
// }
|
|
// );
|
|
//
|
|
// auto descriptor_set_variable_descriptor_count_info
|
|
// = VkDescriptorSetVariableDescriptorCountAllocateInfo {
|
|
// .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
|
|
// .descriptorSetCount = 1u,
|
|
// .pDescriptorCounts = &descriptor_count,
|
|
// };
|
|
//
|
|
// m_vertices_descriptor_set = m_device->allocate_descriptor_set(
|
|
// VkDescriptorSetAllocateInfo {
|
|
// .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
|
// .pNext = &descriptor_set_variable_descriptor_count_info,
|
|
// .descriptorPool = m_descriptor_pool,
|
|
// .descriptorSetCount = 1u,
|
|
// .pSetLayouts = &m_vertices_descriptor_set_layout,
|
|
// }
|
|
// );
|
|
|
|
|
|
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_list,
|
|
.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"
|
|
}
|
|
);
|
|
}
|