diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-01-30 21:46:39 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-01-30 21:46:39 +0100 |
| commit | d7fdab1113623478fecf509c3fd81268d9459b84 (patch) | |
| tree | 9635a6d07534dde1d3c29ee8dbc1c49eb1c4fb90 /src | |
| parent | f24c2bba8159e5a42397ecfc82a669a94f5ad4b3 (diff) | |
Add record commands and image barrier functions to api
Diffstat (limited to 'src')
| -rw-r--r-- | src/vk-api.cpp | 43 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 75 |
2 files changed, 52 insertions, 66 deletions
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, ¤t_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; |
