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.cpp233
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.