aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2021-01-30 21:46:39 +0100
committerladevieq <ladevie.quentin@gmail.com>2021-01-30 21:46:39 +0100
commitd7fdab1113623478fecf509c3fd81268d9459b84 (patch)
tree9635a6d07534dde1d3c29ee8dbc1c49eb1c4fb90
parentf24c2bba8159e5a42397ecfc82a669a94f5ad4b3 (diff)
Add record commands and image barrier functions to api
-rw-r--r--include/vk-api.hpp7
-rw-r--r--src/vk-api.cpp43
-rw-r--r--src/vk-renderer.cpp75
3 files changed, 59 insertions, 66 deletions
diff --git a/include/vk-api.hpp b/include/vk-api.hpp
index c4b51aa..761b91d 100644
--- a/include/vk-api.hpp
+++ b/include/vk-api.hpp
@@ -82,6 +82,13 @@ class vkapi {
void update_descriptor_set_buffer(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, Buffer& buffer);
void update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, VkImageView view);
+
+
+ void start_record(VkCommandBuffer command_buffer);
+
+ void image_barrier(VkCommandBuffer command_buffer, VkImageLayout src_layout, VkImageLayout dst_layout, VkPipelineStageFlagBits src_stage, VkPipelineStageFlagBits dst_stage, VkAccessFlags src_access, VkAccessFlags dst_access, Image image);
+
+ void end_record(VkCommandBuffer command_buffer);
// private:
vkcontext context;
diff --git a/src/vk-api.cpp b/src/vk-api.cpp
index c81927e..063aafb 100644
--- a/src/vk-api.cpp
+++ b/src/vk-api.cpp
@@ -504,3 +504,46 @@ void vkapi::update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayo
vkUpdateDescriptorSets(context.device, 1, &write_descriptor, 0, nullptr);
}
+
+
+void vkapi::start_record(VkCommandBuffer command_buffer) {
+ VkCommandBufferBeginInfo cmd_buf_begin_info = {};
+ cmd_buf_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ cmd_buf_begin_info.pNext = nullptr;
+ cmd_buf_begin_info.flags = 0;
+ cmd_buf_begin_info.pInheritanceInfo = nullptr;
+
+ vkBeginCommandBuffer(command_buffer, &cmd_buf_begin_info);
+}
+
+void vkapi::image_barrier(VkCommandBuffer command_buffer, VkImageLayout src_layout, VkImageLayout dst_layout, VkPipelineStageFlagBits src_stage, VkPipelineStageFlagBits dst_stage, VkAccessFlags src_access, VkAccessFlags dst_access, Image image) {
+ VkImageMemoryBarrier undefined_to_general_barrier = {};
+ undefined_to_general_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ undefined_to_general_barrier.pNext = nullptr;
+ undefined_to_general_barrier.srcAccessMask = src_access;
+ undefined_to_general_barrier.dstAccessMask = dst_access;
+ undefined_to_general_barrier.oldLayout = src_layout;
+ undefined_to_general_barrier.newLayout = dst_layout;
+ undefined_to_general_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ undefined_to_general_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ undefined_to_general_barrier.image = image.handle;
+ undefined_to_general_barrier.subresourceRange = image.subresource_range;
+
+ // api.image_barrier(cmd_buffer, src_stage, dst_stage, image);
+ vkCmdPipelineBarrier(
+ command_buffer,
+ src_stage,
+ dst_stage,
+ 0,
+ 0,
+ nullptr,
+ 0,
+ nullptr,
+ 1,
+ &undefined_to_general_barrier
+ );
+}
+
+void vkapi::end_record(VkCommandBuffer command_buffer) {
+ VKRESULT(vkEndCommandBuffer(command_buffer))
+}
diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp
index 63694f2..cc1df8b 100644
--- a/src/vk-renderer.cpp
+++ b/src/vk-renderer.cpp
@@ -80,7 +80,7 @@ void vkrenderer::compute(uint32_t width, uint32_t height) {
auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, &current_image_index);
handle_swapchain_result(acquire_result);
- // API
+ // API frame skeleton
// api.start_record(cmd_buffer);
// api.command_barrier();
// bind pipeline
@@ -91,77 +91,20 @@ void vkrenderer::compute(uint32_t width, uint32_t height) {
// api.execute(cmd_buffer, wait_semaphore, signal_semaphore);
// api.present(swapchain, img_index, wait_semaphore);
- VkCommandBufferBeginInfo cmd_buf_begin_info = {};
- cmd_buf_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- cmd_buf_begin_info.pNext = nullptr;
- cmd_buf_begin_info.flags = 0;
- cmd_buf_begin_info.pInheritanceInfo = nullptr;
+ auto cmd_buf = command_buffers[frame_index];
+ api.start_record(cmd_buf);
+ api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, VK_ACCESS_SHADER_WRITE_BIT, swapchain.images[current_image_index]);
- vkBeginCommandBuffer(command_buffers[frame_index], &cmd_buf_begin_info);
- VkImageSubresourceRange image_subresource_range = {};
- image_subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- image_subresource_range.baseMipLevel = 0;
- image_subresource_range.levelCount = 1;
- image_subresource_range.baseArrayLayer = 0;
- image_subresource_range.layerCount = 1;
- VkImageMemoryBarrier undefined_to_general_barrier = {};
- undefined_to_general_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- undefined_to_general_barrier.pNext = nullptr;
- undefined_to_general_barrier.srcAccessMask = 0;
- undefined_to_general_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
- undefined_to_general_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- undefined_to_general_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
- undefined_to_general_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- undefined_to_general_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- undefined_to_general_barrier.image = swapchain.images[current_image_index].handle;
- undefined_to_general_barrier.subresourceRange = image_subresource_range;
+ vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.layout, 0, 1, &compute_shader_sets[current_image_index], 0, nullptr);
- vkCmdPipelineBarrier(
- command_buffers[frame_index],
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
- 0,
- 0,
- nullptr,
- 0,
- nullptr,
- 1,
- &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);
-
- vkCmdBindPipeline(command_buffers[frame_index], VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.handle);
+ vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.handle);
- vkCmdDispatch(command_buffers[frame_index], width / 8, height / 8, 1);
+ vkCmdDispatch(cmd_buf, width / 8, height / 8, 1);
- VkImageMemoryBarrier general_to_present_barrier = {};
- general_to_present_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- general_to_present_barrier.pNext = nullptr;
- general_to_present_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
- general_to_present_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
- general_to_present_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
- general_to_present_barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
- general_to_present_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- general_to_present_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- general_to_present_barrier.image = swapchain.images[current_image_index].handle;
- general_to_present_barrier.subresourceRange = image_subresource_range;
-
- vkCmdPipelineBarrier(
- command_buffers[frame_index],
- VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
- 0,
- 0,
- nullptr,
- 0,
- nullptr,
- 1,
- &general_to_present_barrier
- );
- VKRESULT(vkEndCommandBuffer(command_buffers[frame_index]))
+ api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, swapchain.images[current_image_index]);
+ api.end_record(cmd_buf);
VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;