summaryrefslogtreecommitdiff
path: root/src/vk/graphics_pipeline_2d_wired.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vk/graphics_pipeline_2d_wired.cpp')
-rw-r--r--src/vk/graphics_pipeline_2d_wired.cpp222
1 files changed, 198 insertions, 24 deletions
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<VkVertexInputAttributeDescription, 1> 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<uint32_t>(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<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_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<VkDescriptorSet, 2> 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.