summaryrefslogtreecommitdiff
path: root/src/vk/graphics_pipeline_3d.cpp
diff options
context:
space:
mode:
authorFrederico Linhares <fred@linhares.blue>2022-09-08 13:59:17 -0300
committerFrederico Linhares <fred@linhares.blue>2022-09-08 13:59:17 -0300
commite386b9fd4ebc13a6a04def65585e795f4d39335d (patch)
tree76b37c85cba4730fefa3f14c8fcb72d1625175b2 /src/vk/graphics_pipeline_3d.cpp
parent2c60f5d4e44fec3b74d78dffe074416aec8a169f (diff)
refa Move layouts away from graphics pipelines
Diffstat (limited to 'src/vk/graphics_pipeline_3d.cpp')
-rw-r--r--src/vk/graphics_pipeline_3d.cpp160
1 files changed, 22 insertions, 138 deletions
diff --git a/src/vk/graphics_pipeline_3d.cpp b/src/vk/graphics_pipeline_3d.cpp
index de5adde..31e9365 100644
--- a/src/vk/graphics_pipeline_3d.cpp
+++ b/src/vk/graphics_pipeline_3d.cpp
@@ -28,123 +28,6 @@ namespace
{
void
-load_descriptor_set_layout_model_instance(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- std::array<VkDescriptorSetLayoutBinding, 2> layout_bindings{};
-
- layout_bindings[0].binding = 0;
- layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- layout_bindings[0].descriptorCount = 1;
- layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
- layout_bindings[0].pImmutableSamplers = nullptr;
-
- layout_bindings[1].binding = 1;
- layout_bindings[1].descriptorType =
- VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- layout_bindings[1].descriptorCount = 1;
- layout_bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
- layout_bindings[1].pImmutableSamplers = nullptr;
-
- VkDescriptorSetLayoutCreateInfo layout_info{};
- layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
- layout_info.pNext = nullptr;
- layout_info.flags = 0;
- layout_info.bindingCount = static_cast<uint32_t>(layout_bindings.size());
- layout_info.pBindings = layout_bindings.data();
-
- if(vkCreateDescriptorSetLayout(
- cg_core.vk_device_with_swapchain->device, &layout_info, nullptr,
- &self->descriptor_set_layout_model_instance) != VK_SUCCESS)
- throw CommandError{
- "Failed to create Vulkan descriptor set layout for model instance."};
-}
-
-void
-unload_descriptor_set_layout_model_instance(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- vkDestroyDescriptorSetLayout(
- cg_core.vk_device_with_swapchain->device,
- self->descriptor_set_layout_model_instance, nullptr);
-}
-
-void
-load_descriptor_set_layout_world_view(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- std::array<VkDescriptorSetLayoutBinding, 2> set_layouts{};
- set_layouts[0].binding = 0;
- set_layouts[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- set_layouts[0].descriptorCount = 1;
- set_layouts[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
- set_layouts[0].pImmutableSamplers = nullptr;
-
- set_layouts[1].binding = 1;
- set_layouts[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- set_layouts[1].descriptorCount = 1;
- set_layouts[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
- set_layouts[1].pImmutableSamplers = nullptr;
-
- VkDescriptorSetLayoutCreateInfo layout_info{};
- layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
- layout_info.pNext = nullptr;
- layout_info.flags = 0;
- layout_info.bindingCount = set_layouts.size();
- layout_info.pBindings = set_layouts.data();
-
- if(vkCreateDescriptorSetLayout(
- cg_core.vk_device_with_swapchain->device, &layout_info, nullptr,
- &self->descriptor_set_layout_world_view) != VK_SUCCESS)
- throw CommandError{
- "Failed to create Vulkan descriptor set layout for world view."};
-}
-
-void
-unload_descriptor_set_layout_world_view(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- vkDestroyDescriptorSetLayout(
- cg_core.vk_device_with_swapchain->device,
- self->descriptor_set_layout_world_view, nullptr);
-}
-
-void
-load_pipeline_layout(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- std::array<VkDescriptorSetLayout, 2> set_layouts{
- self->descriptor_set_layout_world_view,
- self->descriptor_set_layout_model_instance};
-
- VkPipelineLayoutCreateInfo pipeline_layout_info{};
- pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
- pipeline_layout_info.setLayoutCount = set_layouts.size();
- pipeline_layout_info.pSetLayouts = set_layouts.data();
- pipeline_layout_info.pushConstantRangeCount = 0;
- pipeline_layout_info.pPushConstantRanges = nullptr;
-
- if(vkCreatePipelineLayout(
- cg_core.vk_device_with_swapchain->device,
- &pipeline_layout_info, nullptr, &self->pipeline_layout) != VK_SUCCESS)
- throw CommandError{"Failed to create Vulkan pipeline layout."};
-}
-
-void
-unload_pipeline_layout(void *obj)
-{
- auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
-
- vkDestroyPipelineLayout(
- cg_core.vk_device_with_swapchain->device, self->pipeline_layout, nullptr);
-}
-
-void
load_view_projection_uniform_buffer(void *obj)
{
auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
@@ -210,14 +93,14 @@ load_descriptor_pool(void *obj)
pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
pool_info.pNext = nullptr;
pool_info.flags = 0;
- pool_info.maxSets =
- self->ub_view_projection.size() + self->ub_directional_light.size();
+ pool_info.maxSets = self->ub_view_projection.size() +
+ self->ub_directional_light.size();
pool_info.poolSizeCount = 1;
pool_info.pPoolSizes = &descriptor_pool_size;
if(vkCreateDescriptorPool(
- cg_core.vk_device_with_swapchain->device,
- &pool_info, nullptr, &self->descriptor_pool) != VK_SUCCESS)
+ cg_core.vk_device_with_swapchain->device, &pool_info, nullptr,
+ &self->descriptor_pool) != VK_SUCCESS)
throw CommandError{"Failed to create a Vulkan descriptor pool."};
}
@@ -227,7 +110,8 @@ unload_descriptor_pool(void *obj)
auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
vkDestroyDescriptorPool(
- cg_core.vk_device_with_swapchain->device, self->descriptor_pool, nullptr);
+ cg_core.vk_device_with_swapchain->device, self->descriptor_pool,
+ nullptr);
}
void
@@ -237,7 +121,7 @@ load_world_view_descriptor_sets(void *obj)
std::vector<VkDescriptorSetLayout> layouts(
cg_core.vk_swapchain->images_count,
- self->descriptor_set_layout_world_view);
+ cg_core.vk_graphics_pipeline_3d_layout->descriptor_set_world_view);
VkDescriptorSetAllocateInfo alloc_info{};
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
@@ -334,10 +218,11 @@ unload_depth_image(void *obj)
auto self = static_cast<VK::GraphicsPipeline3D*>(obj);
vkDestroyImage(
- cg_core.vk_device_with_swapchain->device, self->depth_image, nullptr);
- vkFreeMemory(
- cg_core.vk_device_with_swapchain->device, self->depth_image_memory,
+ cg_core.vk_device_with_swapchain->device, self->depth_image,
nullptr);
+ vkFreeMemory(
+ cg_core.vk_device_with_swapchain->device,
+ self->depth_image_memory, nullptr);
}
void
@@ -384,7 +269,8 @@ load_framebuffer(void *obj)
VkFramebufferCreateInfo framebuffer_info{};
framebuffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
- framebuffer_info.renderPass = cg_core.vk_render_pass_3d;
+ framebuffer_info.renderPass =
+ cg_core.vk_graphics_pipeline_3d_layout->render_pass;
framebuffer_info.attachmentCount = attachments.size();
framebuffer_info.pAttachments = attachments.data();
framebuffer_info.width = cg_core.screen_width;
@@ -595,15 +481,17 @@ load_pipeline(void *obj)
pipeline_info.pDepthStencilState = &depth_stencil;
pipeline_info.pColorBlendState = &color_blending;
pipeline_info.pDynamicState = &dynamic_state_info;
- pipeline_info.layout = self->pipeline_layout;
- pipeline_info.renderPass = cg_core.vk_render_pass_3d;
+ pipeline_info.layout = cg_core.vk_graphics_pipeline_3d_layout->pipeline;
+ pipeline_info.renderPass =
+ cg_core.vk_graphics_pipeline_3d_layout->render_pass;
pipeline_info.subpass = 0;
pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
pipeline_info.basePipelineIndex = -1;
if(vkCreateGraphicsPipelines(
cg_core.vk_device_with_swapchain->device, VK_NULL_HANDLE, 1,
- &pipeline_info, nullptr, &self->graphic_pipeline) != VK_SUCCESS)
+ &pipeline_info, nullptr, &self->graphic_pipeline)
+ != VK_SUCCESS)
throw CommandError{"Failed to create graphics pipeline."};
}
@@ -617,11 +505,6 @@ unload_pipeline(void *obj)
}
const CommandChain loader{
- {&load_descriptor_set_layout_model_instance,
- &unload_descriptor_set_layout_model_instance},
- {&load_descriptor_set_layout_world_view,
- &unload_descriptor_set_layout_world_view},
- {&load_pipeline_layout, &unload_pipeline_layout},
{&load_view_projection_uniform_buffer,
&unload_view_projection_uniform_buffer},
{&load_directional_light_uniform_buffer,
@@ -669,7 +552,8 @@ GraphicsPipeline3D::draw(
VkRenderPassBeginInfo render_pass_begin{};
render_pass_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
render_pass_begin.pNext = nullptr;
- render_pass_begin.renderPass = cg_core.vk_render_pass_3d;
+ render_pass_begin.renderPass =
+ cg_core.vk_graphics_pipeline_3d_layout->render_pass;
render_pass_begin.framebuffer = this->swapchain_framebuffers[image_index];
render_pass_begin.renderArea.offset = {0, 0};
render_pass_begin.renderArea.extent = {
@@ -707,8 +591,8 @@ GraphicsPipeline3D::draw(
vkCmdBindDescriptorSets(
draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
- this->pipeline_layout, 0, vk_descriptor_sets.size(),
- vk_descriptor_sets.data(), 0, nullptr);
+ cg_core.vk_graphics_pipeline_3d_layout->pipeline, 0,
+ vk_descriptor_sets.size(), vk_descriptor_sets.data(), 0, nullptr);
vkCmdBindPipeline(
draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
this->graphic_pipeline);