diff options
Diffstat (limited to 'src/vk/graphics_pipeline_2d.cpp')
-rw-r--r-- | src/vk/graphics_pipeline_2d.cpp | 147 |
1 files changed, 18 insertions, 129 deletions
diff --git a/src/vk/graphics_pipeline_2d.cpp b/src/vk/graphics_pipeline_2d.cpp index bc1eca1..61cfe3f 100644 --- a/src/vk/graphics_pipeline_2d.cpp +++ b/src/vk/graphics_pipeline_2d.cpp @@ -25,119 +25,6 @@ namespace { void -load_descriptor_set_layout_projection(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2D*>(obj); - - std::array<VkDescriptorSetLayoutBinding, 1> 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; - - 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_projection) != VK_SUCCESS) - throw CommandError{ - "Failed to create Vulkan descriptor set layout for projection."}; -} - -void -unload_descriptor_set_layout_projection(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2D*>(obj); - - vkDestroyDescriptorSetLayout( - cg_core.vk_device_with_swapchain->device, - self->descriptor_set_layout_projection, nullptr); -} - -void -load_descriptor_set_layout_sprite(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2D*>(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_sprite) != VK_SUCCESS) - throw CommandError{ - "Failed to create Vulkan descriptor set layout for sprites."}; -} - -void -unload_descriptor_set_layout_sprite(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2D*>(obj); - - vkDestroyDescriptorSetLayout( - cg_core.vk_device_with_swapchain->device, - self->descriptor_set_layout_sprite, nullptr); -} - -void -load_pipeline_layout(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2D*>(obj); - - std::array<VkDescriptorSetLayout, 2> set_layouts{ - self->descriptor_set_layout_projection, - self->descriptor_set_layout_sprite - }; - - 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::GraphicsPipeline2D*>(obj); - - vkDestroyPipelineLayout( - cg_core.vk_device_with_swapchain->device, self->pipeline_layout, nullptr); -} - -void load_projection_uniform_buffer(void *obj) { auto self = static_cast<VK::GraphicsPipeline2D*>(obj); @@ -181,8 +68,8 @@ load_descriptor_pool(void *obj) 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."}; } @@ -192,7 +79,8 @@ unload_descriptor_pool(void *obj) auto self = static_cast<VK::GraphicsPipeline2D*>(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 @@ -202,7 +90,7 @@ load_projection_descriptor_sets(void *obj) std::vector<VkDescriptorSetLayout> layouts( self->ub_projection.size(), - self->descriptor_set_layout_projection); + cg_core.vk_graphics_pipeline_2d_layout->descriptor_set_projection); VkDescriptorSetAllocateInfo alloc_info{}; alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; @@ -267,7 +155,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_2d; + framebuffer_info.renderPass = + cg_core.vk_graphics_pipeline_2d_layout->render_pass; framebuffer_info.attachmentCount = attachments.size(); framebuffer_info.pAttachments = attachments.data(); framebuffer_info.width = cg_core.screen_width; @@ -276,7 +165,8 @@ load_framebuffer(void *obj) if(vkCreateFramebuffer( cg_core.vk_device_with_swapchain->device, &framebuffer_info, nullptr, - &self->swapchain_framebuffers[i]) != VK_SUCCESS) + &self->swapchain_framebuffers[i]) + != VK_SUCCESS) throw CommandError{"Failed to create Vulkan Framebuffer."}; } } @@ -454,15 +344,17 @@ load_pipeline(void *obj) pipeline_info.pDepthStencilState = nullptr; 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_2d; + pipeline_info.layout = cg_core.vk_graphics_pipeline_2d_layout->pipeline; + pipeline_info.renderPass = + cg_core.vk_graphics_pipeline_2d_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."}; } @@ -476,10 +368,6 @@ unload_pipeline(void *obj) } const CommandChain loader{ - {&load_descriptor_set_layout_projection, - &unload_descriptor_set_layout_projection}, - {&load_descriptor_set_layout_sprite, &unload_descriptor_set_layout_sprite}, - {&load_pipeline_layout, &unload_pipeline_layout}, {&load_projection_uniform_buffer, &unload_projection_uniform_buffer}, {&load_descriptor_pool, &unload_descriptor_pool}, // By destroying the pool the sets are also destroyed. @@ -515,7 +403,8 @@ GraphicsPipeline2D::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_2d; + render_pass_begin.renderPass = + cg_core.vk_graphics_pipeline_2d_layout->render_pass; render_pass_begin.framebuffer = this->swapchain_framebuffers[image_index]; render_pass_begin.renderArea.offset = {0, 0}; render_pass_begin.renderArea.extent = { @@ -552,8 +441,8 @@ GraphicsPipeline2D::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_2d_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); |