diff options
| -rw-r--r-- | include/vk-api.hpp | 37 | ||||
| -rw-r--r-- | include/vk-renderer.hpp | 30 | ||||
| -rw-r--r-- | src/main.cpp | 16 | ||||
| -rw-r--r-- | src/vk-api.cpp | 229 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 250 |
5 files changed, 311 insertions, 251 deletions
diff --git a/include/vk-api.hpp b/include/vk-api.hpp index 690b91f..52ebef6 100644 --- a/include/vk-api.hpp +++ b/include/vk-api.hpp @@ -1,6 +1,8 @@ #ifndef __VK_API_HPP_ #define __VK_API_HPP_ +#include <vector> + #include "vk-context.hpp" struct Buffer { @@ -9,16 +11,47 @@ struct Buffer { void* mapped_ptr; }; +struct ComputePipeline { + VkShaderModule shader_module; + VkDescriptorSetLayout descriptor_set_layout; + VkPipelineLayout layout; + VkPipeline vkpipeline; +}; + class vkapi { public: - vkapi() = default; + vkapi(); + ~vkapi(); Buffer create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage mem_usage); void destroy_buffer(Buffer& buffer); + VkFence create_fence(); + void destroy_fence(VkFence fence); + std::vector<VkFence> create_fences(size_t fences_count); + void destroy_fences(std::vector<VkFence> fences); + + VkSemaphore create_semaphore(); + void destroy_semaphore(VkSemaphore semaphore); + std::vector<VkSemaphore> create_semaphores(size_t semaphores_count); + void destroy_semaphores(std::vector<VkSemaphore> &semaphores); + + std::vector<VkCommandBuffer> create_command_buffers(size_t command_buffers_count); + void destroy_command_buffers(std::vector<VkCommandBuffer> command_buffers); + + ComputePipeline create_compute_pipeline(const char* shader_path, std::vector<VkDescriptorSetLayoutBinding> bindings); + void destroy_compute_pipeline(ComputePipeline &pipeline); + + std::vector<VkDescriptorSet> create_descriptor_sets(VkDescriptorSetLayout descriptor_sets_layout, size_t descriptor_sets_count); + void destroy_descriptor_sets(std::vector<VkDescriptorSet> descriptor_sets); + + // private: - vkcontext context; + vkcontext context; + + VkCommandPool command_pool; + VkDescriptorPool descriptor_pool; }; diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index 7a2a118..c28049c 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -19,41 +19,21 @@ class vkrenderer { void recreate_swapchain(); - struct input_data* mapped_data; + Buffer compute_shader_buffer; private: void create_surface(window& wnd); void create_swapchain(); - void create_pipeline(); - - void create_command_buffers(); - - void create_descriptor_sets(); - - void create_fences(); - - void create_semaphores(); - void destroy_surface(); void destroy_swapchain(); void destroy_swapchain_images(); - void destroy_pipeline(); - - void destroy_command_buffers(); - void destroy_descriptor_sets(); - void destroy_fences(); - - void destroy_semaphores(); - - void destroy_input_buffer(); - void update_descriptors_buffer(); void update_descriptors_image(); @@ -64,18 +44,12 @@ class vkrenderer { uint64_t frame_index = 0; - Buffer compute_shader_buffer; - - VkCommandPool command_pool; std::vector<VkCommandBuffer> command_buffers; VkDescriptorPool descriptor_pool; std::vector<VkDescriptorSet> compute_shader_sets; - VkShaderModule compute_shader_module; - VkDescriptorSetLayout compute_shader_layout; - VkPipelineLayout compute_pipeline_layout; - VkPipeline compute_pipeline; + ComputePipeline compute_pipeline; std::vector<VkFence> submission_fences; std::vector<VkSemaphore> execution_semaphores; diff --git a/src/main.cpp b/src/main.cpp index 24d4c53..390df41 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -68,15 +68,15 @@ int main() { for (auto event: wnd.events) { switch(event.type) { case EVENT_TYPES::RESIZE: { - renderer.mapped_data->width = event.width; - renderer.mapped_data->height = event.height; + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->width = event.width; + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->height = event.height; if (event.width == 0 && event.height == 0) { canRender = false; } else { canRender = true; renderer.recreate_swapchain(); - renderer.mapped_data->cam.set_aspect_ratio((float)event.width / (float)event.height); + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.set_aspect_ratio((float)event.width / (float)event.height); } break; } @@ -90,26 +90,26 @@ int main() { switch (event.key) { case KEYS::W: { - move_vec = renderer.mapped_data->cam.forward.unit() * move_speed; + move_vec = ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.forward.unit() * move_speed; break; } case KEYS::S: { - move_vec = -renderer.mapped_data->cam.forward.unit() * move_speed; + move_vec = -((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.forward.unit() * move_speed; break; } case KEYS::D: { - move_vec = renderer.mapped_data->cam.right.unit() * move_speed; + move_vec = ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.right.unit() * move_speed; break; } case KEYS::A: { - move_vec = -renderer.mapped_data->cam.right.unit() * move_speed; + move_vec = -((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.right.unit() * move_speed; break; } default: break; } - renderer.mapped_data->cam.move(move_vec); + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->cam.move(move_vec); break; } diff --git a/src/vk-api.cpp b/src/vk-api.cpp index a8897dd..03532e0 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -2,10 +2,49 @@ #include <memory> #include "vk-api.hpp" +#include "utils.hpp" #define VKRESULT(result) assert(result == VK_SUCCESS); +vkapi::vkapi() { + VkCommandPoolCreateInfo cmd_pool_create_info = {}; + cmd_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + cmd_pool_create_info.pNext = nullptr; + cmd_pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + cmd_pool_create_info.queueFamilyIndex = context.queue_index; + + VKRESULT(vkCreateCommandPool(context.device, &cmd_pool_create_info, nullptr, &command_pool)) + + + std::vector<VkDescriptorPoolSize> descriptor_pools_sizes = { + { + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .descriptorCount = (uint32_t)0xff, + }, + { + .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = (uint32_t)0xff, + } + }; + + VkDescriptorPoolCreateInfo descriptor_pool_create_info = {}; + descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + descriptor_pool_create_info.pNext = nullptr; + descriptor_pool_create_info.flags = 0; + descriptor_pool_create_info.maxSets = 0xff; + descriptor_pool_create_info.poolSizeCount = descriptor_pools_sizes.size(); + descriptor_pool_create_info.pPoolSizes = descriptor_pools_sizes.data(); + + VKRESULT(vkCreateDescriptorPool(context.device, &descriptor_pool_create_info, nullptr, &descriptor_pool)) +} + +vkapi::~vkapi() { + vkDestroyCommandPool(context.device, command_pool, nullptr); + vkDestroyDescriptorPool(context.device, descriptor_pool, nullptr); +} + + Buffer vkapi::create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage mem_usage) { Buffer buffer = {}; @@ -28,3 +67,193 @@ void vkapi::destroy_buffer(Buffer& buffer) { vmaUnmapMemory(context.allocator, buffer.alloc); vmaDestroyBuffer(context.allocator, buffer.vkbuffer, buffer.alloc); } + + +VkFence vkapi::create_fence() { + VkFence fence; + VkFenceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = VK_FENCE_CREATE_SIGNALED_BIT; + + VKRESULT(vkCreateFence(context.device, &create_info, nullptr, &fence)) + + return fence; +} + +void vkapi::destroy_fence(VkFence fence) { + vkDestroyFence(context.device, fence, nullptr); +} + +std::vector<VkFence> vkapi::create_fences(size_t fences_count) { + std::vector<VkFence> fences { fences_count }; + + for(auto &fence: fences) { + VkFenceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = VK_FENCE_CREATE_SIGNALED_BIT; + + VKRESULT(vkCreateFence(context.device, &create_info, nullptr, &fence)) + } + + return std::move(fences); +} + +void vkapi::destroy_fences(std::vector<VkFence> fences) { + for(auto &fence: fences) { + vkDestroyFence(context.device, fence, nullptr); + } +} + + +VkSemaphore vkapi::create_semaphore() { + VkSemaphore semaphore; + VkSemaphoreCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = 0; + + VKRESULT(vkCreateSemaphore(context.device, &create_info, nullptr, &semaphore)) + + return semaphore; +} + +void vkapi::destroy_semaphore(VkSemaphore semaphore) { + vkDestroySemaphore(context.device, semaphore, nullptr); +} + +std::vector<VkSemaphore> vkapi::create_semaphores(size_t semaphores_count) { + std::vector<VkSemaphore> semaphores { semaphores_count }; + + for (auto &semaphore: semaphores) { + VkSemaphoreCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = 0; + + VKRESULT(vkCreateSemaphore(context.device, &create_info, nullptr, &semaphore)) + } + + return std::move(semaphores); +} + +void vkapi::destroy_semaphores(std::vector<VkSemaphore> &semaphores) { + for (auto &semaphore: semaphores) { + vkDestroySemaphore(context.device, semaphore, nullptr); + } +} + + +std::vector<VkCommandBuffer> vkapi::create_command_buffers(size_t command_buffers_count) { + VkCommandBufferAllocateInfo cmd_buf_allocate_info = {}; + cmd_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + cmd_buf_allocate_info.pNext = nullptr; + cmd_buf_allocate_info.commandPool = command_pool; + cmd_buf_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + cmd_buf_allocate_info.commandBufferCount = command_buffers_count; + + std::vector<VkCommandBuffer> command_buffers { command_buffers_count }; + vkAllocateCommandBuffers(context.device, &cmd_buf_allocate_info, command_buffers.data()); + + return std::move(command_buffers); +} + +void vkapi::destroy_command_buffers(std::vector<VkCommandBuffer> command_buffers) { + vkFreeCommandBuffers(context.device, command_pool, command_buffers.size(), command_buffers.data()); +} + + +ComputePipeline vkapi::create_compute_pipeline(const char* shader_path, std::vector<VkDescriptorSetLayoutBinding> bindings) { + ComputePipeline pipeline; + + std::vector<uint8_t> shader_code = get_shader_code(shader_path); + if (shader_code.size() == 0) { + exit(1); + } + + VkShaderModuleCreateInfo shader_create_info = {}; + shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + shader_create_info.pNext = nullptr; + shader_create_info.flags = 0; + shader_create_info.codeSize = shader_code.size(); + shader_create_info.pCode = (uint32_t*)shader_code.data(); + + VKRESULT(vkCreateShaderModule(context.device, &shader_create_info, nullptr, &pipeline.shader_module)) + + VkPipelineShaderStageCreateInfo stage_create_info = {}; + stage_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + stage_create_info.pNext = nullptr; + stage_create_info.flags = 0; + stage_create_info.stage = VK_SHADER_STAGE_COMPUTE_BIT; + stage_create_info.module = pipeline.shader_module; + stage_create_info.pName = "main"; + stage_create_info.pSpecializationInfo = nullptr; + + + VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = {}; + descriptor_set_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptor_set_layout_create_info.pNext = nullptr; + descriptor_set_layout_create_info.flags = 0; + descriptor_set_layout_create_info.bindingCount = bindings.size(); + descriptor_set_layout_create_info.pBindings = bindings.data(); + + VKRESULT(vkCreateDescriptorSetLayout(context.device, &descriptor_set_layout_create_info, nullptr, &pipeline.descriptor_set_layout)) + + VkPipelineLayoutCreateInfo layout_create_info = {}; + layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + layout_create_info.pNext = nullptr; + layout_create_info.flags = 0; + layout_create_info.setLayoutCount = 1; + layout_create_info.pSetLayouts = &pipeline.descriptor_set_layout; + layout_create_info.pushConstantRangeCount = 0; + layout_create_info.pPushConstantRanges = nullptr; + + VKRESULT(vkCreatePipelineLayout(context.device, &layout_create_info, nullptr, &pipeline.layout)) + + VkComputePipelineCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = 0; + create_info.stage = stage_create_info; + create_info.layout = pipeline.layout; + + VKRESULT(vkCreateComputePipelines( + context.device, + VK_NULL_HANDLE, + 1, + &create_info, + nullptr, + &pipeline.vkpipeline + )) + + return std::move(pipeline); +} + +void vkapi::destroy_compute_pipeline(ComputePipeline &pipeline) { + vkDestroyShaderModule(context.device, pipeline.shader_module, nullptr); + vkDestroyDescriptorSetLayout(context.device, pipeline.descriptor_set_layout, nullptr); + vkDestroyPipelineLayout(context.device, pipeline.layout, nullptr); + vkDestroyPipeline(context.device, pipeline.vkpipeline, nullptr); +} + + +std::vector<VkDescriptorSet> vkapi::create_descriptor_sets(VkDescriptorSetLayout descriptor_sets_layout, size_t descriptor_sets_count) { + std::vector<VkDescriptorSetLayout> sets_layouts = { descriptor_sets_count, descriptor_sets_layout }; + + VkDescriptorSetAllocateInfo descriptor_set_allocate_info = {}; + descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + descriptor_set_allocate_info.pNext = nullptr; + descriptor_set_allocate_info.descriptorPool = descriptor_pool; + descriptor_set_allocate_info.descriptorSetCount = sets_layouts.size(); + descriptor_set_allocate_info.pSetLayouts = sets_layouts.data(); + + std::vector<VkDescriptorSet> descriptor_sets { descriptor_sets_count }; + vkAllocateDescriptorSets(context.device, &descriptor_set_allocate_info, descriptor_sets.data()); + + return std::move(descriptor_sets); +} + +void vkapi::destroy_descriptor_sets(std::vector<VkDescriptorSet> descriptor_sets) { + vkFreeDescriptorSets(context.device, descriptor_pool, descriptor_sets.size(), descriptor_sets.data()); +} diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index cf458fa..0fe2a8d 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -14,12 +14,35 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { create_surface(wnd); - create_pipeline(); + + std::vector<VkDescriptorSetLayoutBinding> bindings { + { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + .pImmutableSamplers = VK_NULL_HANDLE, + }, + { + .binding = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + .pImmutableSamplers = VK_NULL_HANDLE, + } + }; + + compute_pipeline = api.create_compute_pipeline("./shaders/compute.comp.spv", bindings); + create_swapchain(); - create_command_buffers(); - create_descriptor_sets(); - create_fences(); - create_semaphores(); + + command_buffers = api.create_command_buffers(swapchain_images_count); + + compute_shader_sets = api.create_descriptor_sets(compute_pipeline.descriptor_set_layout, swapchain_images_count); + + submission_fences = api.create_fences(swapchain_images_count); + execution_semaphores = api.create_semaphores(swapchain_images_count); + acquire_semaphores = api.create_semaphores(swapchain_images_count); compute_shader_buffer = api.create_buffer(sizeof(inputs), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); std::memcpy(compute_shader_buffer.mapped_ptr, &inputs, sizeof(inputs)); @@ -32,11 +55,14 @@ vkrenderer::~vkrenderer() { VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) api.destroy_buffer(compute_shader_buffer); - destroy_fences(); - destroy_semaphores(); + api.destroy_fences(submission_fences); + api.destroy_semaphores(execution_semaphores); + api.destroy_semaphores(acquire_semaphores); + destroy_descriptor_sets(); - destroy_command_buffers(); - destroy_pipeline(); + + api.destroy_command_buffers(command_buffers); + destroy_swapchain(); destroy_surface(); } @@ -88,9 +114,9 @@ void vkrenderer::compute(uint32_t width, uint32_t height) { &undefined_to_general_barrier ); - vkCmdBindDescriptorSets(command_buffers[frame_index], VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout, 0, 1, &compute_shader_sets[current_image_index], 0, nullptr); + vkCmdBindDescriptorSets(command_buffers[frame_index], VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.layout, 0, 1, &compute_shader_sets[current_image_index], 0, nullptr); - vkCmdBindPipeline(command_buffers[frame_index], VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline); + vkCmdBindPipeline(command_buffers[frame_index], VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.vkpipeline); vkCmdDispatch(command_buffers[frame_index], width / 8, height / 8, 1); @@ -282,173 +308,6 @@ void vkrenderer::create_swapchain() { } } -void vkrenderer::create_pipeline() { - std::vector<uint8_t> shader_code = get_shader_code("./shaders/compute.comp.spv"); - if (shader_code.size() == 0) { - exit(1); - } - - VkShaderModuleCreateInfo shader_create_info = {}; - shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - shader_create_info.pNext = nullptr; - shader_create_info.flags = 0; - shader_create_info.codeSize = shader_code.size(); - shader_create_info.pCode = (uint32_t*)shader_code.data(); - - VKRESULT(vkCreateShaderModule(api.context.device, &shader_create_info, nullptr, &compute_shader_module)) - - VkPipelineShaderStageCreateInfo stage_create_info = {}; - stage_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - stage_create_info.pNext = nullptr; - stage_create_info.flags = 0; - stage_create_info.stage = VK_SHADER_STAGE_COMPUTE_BIT; - stage_create_info.module = compute_shader_module; - stage_create_info.pName = "main"; - stage_create_info.pSpecializationInfo = nullptr; - - - - std::vector<VkDescriptorSetLayoutBinding> bindings { - { - .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - .pImmutableSamplers = VK_NULL_HANDLE, - }, - { - .binding = 1, - .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - .pImmutableSamplers = VK_NULL_HANDLE, - } - }; - - VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = {}; - descriptor_set_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptor_set_layout_create_info.pNext = nullptr; - descriptor_set_layout_create_info.flags = 0; - descriptor_set_layout_create_info.bindingCount = bindings.size(); - descriptor_set_layout_create_info.pBindings = bindings.data(); - - VKRESULT(vkCreateDescriptorSetLayout(api.context.device, &descriptor_set_layout_create_info, nullptr, &compute_shader_layout)) - - VkPipelineLayoutCreateInfo layout_create_info = {}; - layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - layout_create_info.pNext = nullptr; - layout_create_info.flags = 0; - layout_create_info.setLayoutCount = 1; - layout_create_info.pSetLayouts = &compute_shader_layout; - layout_create_info.pushConstantRangeCount = 0; - layout_create_info.pPushConstantRanges = nullptr; - - VKRESULT(vkCreatePipelineLayout(api.context.device, &layout_create_info, nullptr, &compute_pipeline_layout)) - - VkComputePipelineCreateInfo create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; - create_info.pNext = nullptr; - create_info.flags = 0; - create_info.stage = stage_create_info; - create_info.layout = compute_pipeline_layout; - - VKRESULT(vkCreateComputePipelines( - api.context.device, - VK_NULL_HANDLE, - 1, - &create_info, - nullptr, - &compute_pipeline - )) - - std::cerr << "Compute pipeline ready" << std::endl; -} - -void vkrenderer::create_command_buffers() { - VkCommandPoolCreateInfo cmd_pool_create_info = {}; - cmd_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - cmd_pool_create_info.pNext = nullptr; - cmd_pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - cmd_pool_create_info.queueFamilyIndex = api.context.queue_index; - - VKRESULT(vkCreateCommandPool(api.context.device, &cmd_pool_create_info, nullptr, &command_pool)) - - VkCommandBufferAllocateInfo cmd_buf_allocate_info = {}; - cmd_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - cmd_buf_allocate_info.pNext = nullptr; - cmd_buf_allocate_info.commandPool = command_pool; - cmd_buf_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - cmd_buf_allocate_info.commandBufferCount = swapchain_images_count; - - command_buffers = std::vector<VkCommandBuffer> { swapchain_images_count }; - vkAllocateCommandBuffers(api.context.device, &cmd_buf_allocate_info, command_buffers.data()); -} -void vkrenderer::create_descriptor_sets() { - std::vector<VkDescriptorPoolSize> descriptor_pools_sizes = { - { - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - .descriptorCount = (uint32_t)swapchain_images_count, - }, - { - .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .descriptorCount = (uint32_t)swapchain_images_count, - } - }; - - VkDescriptorPoolCreateInfo descriptor_pool_create_info = {}; - descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptor_pool_create_info.pNext = nullptr; - descriptor_pool_create_info.flags = 0; - descriptor_pool_create_info.maxSets = swapchain_images_count; - descriptor_pool_create_info.poolSizeCount = descriptor_pools_sizes.size(); - descriptor_pool_create_info.pPoolSizes = descriptor_pools_sizes.data(); - - VKRESULT(vkCreateDescriptorPool(api.context.device, &descriptor_pool_create_info, nullptr, &descriptor_pool)) - - std::vector<VkDescriptorSetLayout> sets_layouts = { swapchain_images_count, compute_shader_layout }; - - VkDescriptorSetAllocateInfo descriptor_set_allocate_info = {}; - descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptor_set_allocate_info.pNext = nullptr; - descriptor_set_allocate_info.descriptorPool = descriptor_pool; - descriptor_set_allocate_info.descriptorSetCount = sets_layouts.size(); - descriptor_set_allocate_info.pSetLayouts = sets_layouts.data(); - - compute_shader_sets = std::vector<VkDescriptorSet> { swapchain_images_count }; - vkAllocateDescriptorSets(api.context.device, &descriptor_set_allocate_info, compute_shader_sets.data()); -} - -void vkrenderer::create_fences() { - for (size_t fence_index = 0; fence_index < swapchain_images_count; fence_index++) { - VkFence submission_fence; - VkFenceCreateInfo create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - create_info.pNext = nullptr; - create_info.flags = VK_FENCE_CREATE_SIGNALED_BIT; - - VKRESULT(vkCreateFence(api.context.device, &create_info, nullptr, &submission_fence)) - - submission_fences.push_back(submission_fence); - } -} - -void vkrenderer::create_semaphores() { - for (size_t semaphore_index = 0; semaphore_index < swapchain_images_count; semaphore_index++) { - VkSemaphore execution_semaphore; - VkSemaphore acquire_semaphore; - VkSemaphoreCreateInfo create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - create_info.pNext = nullptr; - create_info.flags = 0; - - VKRESULT(vkCreateSemaphore(api.context.device, &create_info, nullptr, &execution_semaphore)) - VKRESULT(vkCreateSemaphore(api.context.device, &create_info, nullptr, &acquire_semaphore)) - - execution_semaphores.push_back(execution_semaphore); - acquire_semaphores.push_back(acquire_semaphore); - } -} - void vkrenderer::destroy_surface() { vkDestroySurfaceKHR(api.context.instance, platform_surface, nullptr); } @@ -468,47 +327,12 @@ void vkrenderer::destroy_swapchain_images() { swapchain_images.clear(); } -void vkrenderer::destroy_pipeline() { - vkDestroyShaderModule(api.context.device, compute_shader_module, nullptr); - vkDestroyDescriptorSetLayout(api.context.device, compute_shader_layout, nullptr); - vkDestroyPipelineLayout(api.context.device, compute_pipeline_layout, nullptr); - vkDestroyPipeline(api.context.device, compute_pipeline, nullptr); -} - -void vkrenderer::destroy_command_buffers() { - vkFreeCommandBuffers(api.context.device, command_pool, swapchain_images_count, command_buffers.data()); - - vkDestroyCommandPool(api.context.device, command_pool, nullptr); -} - void vkrenderer::destroy_descriptor_sets() { // vkFreeDescriptorSets(device, descriptor_pool, swapchain_images_count, compute_shader_sets.data()); vkDestroyDescriptorPool(api.context.device, descriptor_pool, nullptr); } -void vkrenderer::destroy_fences() { - for (auto fence: submission_fences) { - vkDestroyFence(api.context.device, fence, nullptr); - } - - submission_fences.clear(); -} - -void vkrenderer::destroy_semaphores() { - for (auto semaphore: acquire_semaphores) { - vkDestroySemaphore(api.context.device, semaphore, nullptr); - } - - acquire_semaphores.clear(); - - for (auto semaphore: execution_semaphores) { - vkDestroySemaphore(api.context.device, semaphore, nullptr); - } - - execution_semaphores.clear(); -} - void vkrenderer::update_descriptors_buffer() { std::vector<VkDescriptorBufferInfo> descriptors_buf_info { swapchain_images_count }; std::vector<VkWriteDescriptorSet> write_descriptors { swapchain_images_count }; |
