diff options
Diffstat (limited to 'src/vk/graphics_pipeline_3d.cpp')
-rw-r--r-- | src/vk/graphics_pipeline_3d.cpp | 160 |
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); |