From 1cd2d838bf1682e125d52d12ac6f2960df65c7e0 Mon Sep 17 00:00:00 2001 From: Frederico Linhares Date: Wed, 21 Dec 2022 14:46:09 -0300 Subject: refa Merge Rectangle into Vector4D --- src/vk/graphics_pipeline_2d_wired.cpp | 222 ++++++++++++++++++++++++++++++---- 1 file changed, 198 insertions(+), 24 deletions(-) (limited to 'src/vk/graphics_pipeline_2d_wired.cpp') diff --git a/src/vk/graphics_pipeline_2d_wired.cpp b/src/vk/graphics_pipeline_2d_wired.cpp index 2b416c2..34b6a1b 100644 --- a/src/vk/graphics_pipeline_2d_wired.cpp +++ b/src/vk/graphics_pipeline_2d_wired.cpp @@ -21,6 +21,7 @@ #include "../core.hpp" #include "rectangle.hpp" #include "sprite.hpp" +#include "uniform_buffer_object.hpp" namespace { @@ -97,27 +98,15 @@ load_pipeline(void *obj) frag_shader_stage_info }; - VkVertexInputBindingDescription vertex_input_binding{}; - vertex_input_binding.binding = 0; - vertex_input_binding.stride = sizeof(glm::vec2); - vertex_input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - - std::array vertex_attribute{}; - vertex_attribute[0].location = 0; - vertex_attribute[0].binding = 0; - vertex_attribute[0].format = VK_FORMAT_R32G32_SFLOAT; - vertex_attribute[0].offset = 0; - VkPipelineVertexInputStateCreateInfo vertex_input_info = {}; vertex_input_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; vertex_input_info.pNext = nullptr; vertex_input_info.flags = 0; - vertex_input_info.vertexBindingDescriptionCount = 1; - vertex_input_info.pVertexBindingDescriptions = &vertex_input_binding; - vertex_input_info.vertexAttributeDescriptionCount = - static_cast(vertex_attribute.size()); - vertex_input_info.pVertexAttributeDescriptions = vertex_attribute.data(); + vertex_input_info.vertexBindingDescriptionCount = 0; + vertex_input_info.pVertexBindingDescriptions = nullptr; + vertex_input_info.vertexAttributeDescriptionCount = 0; + vertex_input_info.pVertexAttributeDescriptions = nullptr; VkPipelineInputAssemblyStateCreateInfo input_assembly = {}; input_assembly.sType = @@ -250,9 +239,182 @@ unload_pipeline(void *obj) cg_core.vk_device_with_swapchain->device, self->graphic_pipeline, nullptr); } +void +load_indexes(void *obj) +{ + auto self = static_cast(obj); + + self->queue_family = + cg_core.vk_device_with_swapchain->get_queue_family_with_graphics(); + + std::array 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(obj); + + delete self->index_buffer; +} + +void +load_uniform_rectangles_buffers(void *obj) +{ + auto self = static_cast(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(obj); + + self->ub_rectangles.clear(); +} + +void +load_uniform_rectangle_colors_buffers(void *obj) +{ + auto self = static_cast(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(obj); + + self->ub_rectangle_colors.clear(); +} + +void +load_descriptor_set_pool(void *obj) +{ + auto self = static_cast(obj); + + std::array 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(obj); + + vkDestroyDescriptorPool( + self->queue_family->device->device, self->descriptor_pool, nullptr); +} + +void +load_descriptor_sets(void *obj) +{ + auto self = static_cast(obj); + + std::vector 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(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 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_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} }; } @@ -296,11 +458,10 @@ GraphicsPipeline2DWired::draw( } // Draw rectangles - for(auto& rectangle: view->rectangles_to_draw[current_frame]) { std::array vk_descriptor_sets{ view->descriptor_sets_2d[image_index], - rectangle->descriptor_sets[image_index]}; + this->descriptor_sets[image_index]}; VkDeviceSize offsets[]{0}; vkCmdBindDescriptorSets( @@ -310,11 +471,24 @@ GraphicsPipeline2DWired::draw( vkCmdBindPipeline( draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, this->graphic_pipeline); - vkCmdBindVertexBuffers( - draw_command_buffer, 0, 1, - &rectangle->vertex_buffers[image_index].buffer, offsets); - vkCmdDraw( - draw_command_buffer, Rectangle::vertex_count, 1, 0, 0); + 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; + } + 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. -- cgit v1.2.3