diff options
Diffstat (limited to 'src/vk/graphics_pipeline_2d_wired.cpp')
-rw-r--r-- | src/vk/graphics_pipeline_2d_wired.cpp | 233 |
1 files changed, 45 insertions, 188 deletions
diff --git a/src/vk/graphics_pipeline_2d_wired.cpp b/src/vk/graphics_pipeline_2d_wired.cpp index 34b6a1b..3247b78 100644 --- a/src/vk/graphics_pipeline_2d_wired.cpp +++ b/src/vk/graphics_pipeline_2d_wired.cpp @@ -21,12 +21,38 @@ #include "../core.hpp" #include "rectangle.hpp" #include "sprite.hpp" -#include "uniform_buffer_object.hpp" +#include "uniform_data_object.hpp" namespace { void +load_indexes(void *obj) +{ + auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); + + self->queue_family = + cg_core.vk_device_with_swapchain->get_queue_family_with_graphics(); + + std::array<uint32_t, 4> indexes{0, 1, 2, 3}; + void *indexes_data{indexes.data()}; + size_t indexes_size{sizeof(indexes[0]) * indexes.size()}; + VK::SourceBuffer source_index_buffer{ + self->queue_family->device, indexes_data, indexes_size}; + self->index_buffer = new VK::DestinationBuffer{ + self->queue_family, &source_index_buffer, + VK_BUFFER_USAGE_INDEX_BUFFER_BIT}; +} + +void +unload_indexes(void *obj) +{ + auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); + + delete self->index_buffer; +} + +void load_framebuffer(void *obj) { auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); @@ -239,182 +265,10 @@ unload_pipeline(void *obj) cg_core.vk_device_with_swapchain->device, self->graphic_pipeline, nullptr); } -void -load_indexes(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - self->queue_family = - cg_core.vk_device_with_swapchain->get_queue_family_with_graphics(); - - std::array<uint32_t, 4> indexes{0, 1, 2, 3}; - void *indexes_data{indexes.data()}; - size_t indexes_size{sizeof(indexes[0]) * indexes.size()}; - VK::SourceBuffer source_index_buffer{ - self->queue_family->device, indexes_data, indexes_size}; - self->index_buffer = new VK::DestinationBuffer{ - self->queue_family, &source_index_buffer, - VK_BUFFER_USAGE_INDEX_BUFFER_BIT}; -} - -void -unload_indexes(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - delete self->index_buffer; -} - -void -load_uniform_rectangles_buffers(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - self->ub_rectangles.reserve( - cg_core.vk_swapchain->images_count); - for(auto i{0}; i < cg_core.vk_swapchain->images_count; i++) - self->ub_rectangles.emplace_back( - cg_core.vk_device_with_swapchain, sizeof(VK::UBOVectors4D)); -} - -void -unload_uniform_rectangles_buffers(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - self->ub_rectangles.clear(); -} - -void -load_uniform_rectangle_colors_buffers(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - self->ub_rectangle_colors.reserve( - cg_core.vk_swapchain->images_count); - for(auto i{0}; i < cg_core.vk_swapchain->images_count; i++) - self->ub_rectangle_colors.emplace_back( - cg_core.vk_device_with_swapchain, sizeof(VK::UBOVectors3D)); -} - -void -unload_uniform_rectangle_colors_buffers(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - self->ub_rectangle_colors.clear(); -} - -void -load_descriptor_set_pool(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - std::array<VkDescriptorPoolSize, 1> descriptor_pool_sizes{}; - descriptor_pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - descriptor_pool_sizes[0].descriptorCount = - self->ub_rectangles.size() + self->ub_rectangle_colors.size(); - - VkDescriptorPoolCreateInfo pool_info{}; - pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - pool_info.pNext = nullptr; - pool_info.flags = 0; - pool_info.maxSets = - self->ub_rectangles.size() + self->ub_rectangle_colors.size(); - pool_info.poolSizeCount = descriptor_pool_sizes.size(); - pool_info.pPoolSizes = descriptor_pool_sizes.data(); - - if(vkCreateDescriptorPool( - self->queue_family->device->device, &pool_info, nullptr, - &self->descriptor_pool) != VK_SUCCESS) - throw CommandError{"Failed to create a Vulkan descriptor pool."}; -} - -void -unload_descriptor_set_pool(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - vkDestroyDescriptorPool( - self->queue_family->device->device, self->descriptor_pool, nullptr); -} - -void -load_descriptor_sets(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - std::vector<VkDescriptorSetLayout> layouts( - cg_core.vk_swapchain->images_count, - cg_core.vk_graphics_pipeline_2d_wired_layout->descriptor_set_instance); - - VkDescriptorSetAllocateInfo alloc_info{}; - alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - alloc_info.descriptorPool = self->descriptor_pool; - alloc_info.descriptorSetCount = layouts.size(); - alloc_info.pSetLayouts = layouts.data(); - - self->descriptor_sets.resize(layouts.size()); - if(vkAllocateDescriptorSets( - self->queue_family->device->device, &alloc_info, - self->descriptor_sets.data()) != VK_SUCCESS) - CommandError{"Failed to create Vulkan descriptor set."}; -} - -void -load_data_to_descriptor_sets(void *obj) -{ - auto self = static_cast<VK::GraphicsPipeline2DWired*>(obj); - - for(auto i{0}; i < self->ub_rectangles.size(); i++) - { - VkDescriptorBufferInfo rectangles_buffer_info{}; - rectangles_buffer_info.buffer = self->ub_rectangles[i].buffer; - rectangles_buffer_info.offset = 0; - rectangles_buffer_info.range = sizeof(VK::UBOVectors4D); - - VkDescriptorBufferInfo colors_buffer_info{}; - colors_buffer_info.buffer = self->ub_rectangle_colors[i].buffer; - colors_buffer_info.offset = 0; - colors_buffer_info.range = sizeof(VK::UBOVectors3D); - - std::array<VkWriteDescriptorSet, 2> write_descriptors{}; - write_descriptors[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_descriptors[0].dstSet = self->descriptor_sets[i]; - write_descriptors[0].dstBinding = 0; - write_descriptors[0].dstArrayElement = 0; - write_descriptors[0].descriptorCount = 1; - write_descriptors[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - write_descriptors[0].pBufferInfo = &rectangles_buffer_info; - write_descriptors[0].pImageInfo = nullptr; - write_descriptors[0].pTexelBufferView = nullptr; - - write_descriptors[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_descriptors[1].dstSet = self->descriptor_sets[i]; - write_descriptors[1].dstBinding = 1; - write_descriptors[1].dstArrayElement = 0; - write_descriptors[1].descriptorCount = 1; - write_descriptors[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - write_descriptors[1].pBufferInfo = &colors_buffer_info; - write_descriptors[1].pImageInfo = nullptr; - write_descriptors[1].pTexelBufferView = nullptr; - - vkUpdateDescriptorSets( - cg_core.vk_device_with_swapchain->device, write_descriptors.size(), - write_descriptors.data(), 0, nullptr); - } -} - const CommandChain loader{ {&load_indexes, &unload_indexes}, {&load_framebuffer, &unload_framebuffer}, - {&load_pipeline, &unload_pipeline}, - {&load_uniform_rectangles_buffers, &unload_uniform_rectangles_buffers}, - {&load_uniform_rectangle_colors_buffers, - &unload_uniform_rectangle_colors_buffers}, - {&load_descriptor_set_pool, &unload_descriptor_set_pool}, - {&load_descriptor_sets, nullptr}, - {&load_data_to_descriptor_sets, nullptr} + {&load_pipeline, &unload_pipeline} }; } @@ -459,9 +313,8 @@ GraphicsPipeline2DWired::draw( // Draw rectangles { - std::array<VkDescriptorSet, 2> vk_descriptor_sets{ - view->descriptor_sets_2d[image_index], - this->descriptor_sets[image_index]}; + std::array<VkDescriptorSet, 1> vk_descriptor_sets{ + view->descriptor_sets_2d[image_index]}; VkDeviceSize offsets[]{0}; vkCmdBindDescriptorSets( @@ -474,21 +327,25 @@ GraphicsPipeline2DWired::draw( vkCmdBindIndexBuffer( draw_command_buffer, this->index_buffer->buffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed( - draw_command_buffer, Rectangle::VertexCount, - view->rectangles_to_draw[current_frame].size(), - 0, 0, 0); - UBOVectors4D ubo_rectangle_positions; - UBOVectors3D ubo_rectangle_colors; for(auto i{0}; i < view->rectangles_to_draw[current_frame].size(); i++) { - auto &rect = view->rectangles_to_draw[current_frame][i]; - ubo_rectangle_positions.vectors[i] = rect.position; - ubo_rectangle_colors.vectors[i] = rect.color; + auto &rect{view->rectangles_to_draw[current_frame][i]}; + + ODOVector4D position{rect.position}; + ODOVector3D color{rect.color}; + vkCmdPushConstants( + draw_command_buffer, + cg_core.vk_graphics_pipeline_2d_wired_layout->pipeline, + VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(ODOVector4D), &position); + vkCmdPushConstants( + draw_command_buffer, + cg_core.vk_graphics_pipeline_2d_wired_layout->pipeline, + VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(ODOVector4D), sizeof(ODOVector3D), + &color); + vkCmdDrawIndexed( + draw_command_buffer, Rectangle::VertexCount, 1, 0, 0, 0); } - this->ub_rectangles[image_index].copy_data(&ubo_rectangle_positions); - this->ub_rectangle_colors[image_index].copy_data(&ubo_rectangle_colors); } // Prepare for the next frame. |