From e4c24757a15a8a33019e4e2c28302b583b9366b7 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Tue, 9 Mar 2021 22:06:34 +0100 Subject: Render ui on top of path tracer result --- include/vk-api.hpp | 3 ++- include/vk-renderer.hpp | 2 +- src/main.cpp | 15 +++++++++------ src/vk-api.cpp | 18 +++++++++++------- src/vk-renderer.cpp | 33 +++++++++++++++++---------------- 5 files changed, 40 insertions(+), 31 deletions(-) diff --git a/include/vk-api.hpp b/include/vk-api.hpp index 78d7068..284f75c 100644 --- a/include/vk-api.hpp +++ b/include/vk-api.hpp @@ -19,6 +19,7 @@ struct Pipeline { VkDescriptorSetLayout descriptor_set_layout; VkPipelineLayout layout; VkPipeline handle; + VkPipelineBindPoint bind_point; }; struct Image { @@ -76,7 +77,7 @@ class vkapi { void destroy_command_buffers(std::vector &command_buffers); - VkRenderPass create_render_pass(std::vector& color_attachments_format); + VkRenderPass create_render_pass(std::vector& color_attachments_format, VkImageLayout initial_layout, VkImageLayout final_layout); VkRenderPass create_render_pass(std::vector& color_attachments_format, VkFormat depth_attachement_format); void destroy_render_pass(VkRenderPass render_pass); diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index 199900e..5dc6c97 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -19,7 +19,7 @@ class vkrenderer { void ui(); - void compute(uint32_t width, uint32_t height, bool clear); + void compute(uint32_t width, uint32_t height, bool clear, bool render_sample); void finish_frame(); diff --git a/src/main.cpp b/src/main.cpp index 9d201a1..d581c9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -178,14 +178,17 @@ int main() { if (canRender) { renderer.begin_frame(); - renderer.ui(); - // if (((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index < samples_per_pixel) { - // bool clear = ((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index == 0; - // renderer.compute(width, height, clear); + if (((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index < samples_per_pixel) { + bool clear = ((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index == 0; + renderer.compute(width, height, clear, true); + + ((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index++; + } else { + renderer.compute(width, height, false, false); + } - // ((input_data*) renderer.compute_shader_buffer.alloc_info.pMappedData)->sample_index++; - // } + renderer.ui(); renderer.finish_frame(); } diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 5dbe010..440af02 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -270,7 +270,7 @@ void vkapi::destroy_command_buffers(std::vector &command_buffer // TODO: attachment structure -VkRenderPass vkapi::create_render_pass(std::vector& color_attachments_format) { +VkRenderPass vkapi::create_render_pass(std::vector& color_attachments_format, VkImageLayout initial_layout, VkImageLayout final_layout) { std::vector attachments_description = {}; std::vector attachments_reference = {}; @@ -280,12 +280,12 @@ VkRenderPass vkapi::create_render_pass(std::vector& color_attachments_ attachment_description.flags = 0; attachment_description.format = format; attachment_description.samples = VK_SAMPLE_COUNT_1_BIT; - attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; attachment_description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachment_description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachment_description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; // TODO: Change this - attachment_description.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + attachment_description.initialLayout = initial_layout; + attachment_description.finalLayout = final_layout; attachments_description.push_back(attachment_description); @@ -371,7 +371,9 @@ void vkapi::destroy_framebuffers(std::vector& framebuffers) { Pipeline vkapi::create_compute_pipeline(const char* shader_name, std::vector& bindings) { - Pipeline pipeline; + Pipeline pipeline { + .bind_point = VK_PIPELINE_BIND_POINT_COMPUTE + }; char shader_path[256] = {}; sprintf(shader_path, "%s%s%s", "./shaders/", shader_name, ".comp.spv"); @@ -441,7 +443,9 @@ Pipeline vkapi::create_compute_pipeline(const char* shader_name, std::vector& bindings, VkShaderStageFlagBits shader_stages, VkRenderPass render_pass, std::vector dynamic_states) { - Pipeline pipeline; + Pipeline pipeline { + .bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS + }; std::vector stages_create_info = {}; @@ -897,7 +901,7 @@ void vkapi::begin_render_pass(VkCommandBuffer command_buffer, VkRenderPass rende render_pass_begin_info.pClearValues = &clear_value; vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle); + vkCmdBindPipeline(command_buffer, pipeline.bind_point, pipeline.handle); } void vkapi::end_render_pass(VkCommandBuffer command_buffer) { diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index 5843309..d8c84cf 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -83,7 +83,7 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { } std::vector attachments_format { swapchain.surface_format.format }; - render_pass = api.create_render_pass(attachments_format); + render_pass = api.create_render_pass(attachments_format, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); for (auto& image : swapchain.images) { std::vector attachments { image }; @@ -333,35 +333,36 @@ void vkrenderer::ui() { api.end_render_pass(cmd_buf); } -void vkrenderer::compute(uint32_t width, uint32_t height, bool clear) { +void vkrenderer::compute(uint32_t width, uint32_t height, bool clear, bool render_sample) { auto cmd_buf = command_buffers[frame_index]; auto output_image = accumulation_images[0]; auto accumulation_image = accumulation_images[1]; - if (clear) { - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, accumulation_image); + if (render_sample) { + if (clear) { + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, accumulation_image); - VkClearColorValue color = { 0.f, 0.f, 0.f, 1.f }; - vkCmdClearColorImage(cmd_buf, accumulation_image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &accumulation_image.subresource_range); + VkClearColorValue color = { 0.f, 0.f, 0.f, 1.f }; + vkCmdClearColorImage(cmd_buf, accumulation_image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &accumulation_image.subresource_range); - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, accumulation_image); + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, accumulation_image); - 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, output_image); - } else { - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, accumulation_image); - 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, output_image); - } + 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, output_image); + } else { + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, accumulation_image); + 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, output_image); + } - api.run_compute_pipeline(cmd_buf, compute_pipeline, compute_shader_sets[swapchain_image_index], width / 8, height / 8, 1); + api.run_compute_pipeline(cmd_buf, compute_pipeline, compute_shader_sets[swapchain_image_index], width / 8, height / 8, 1); - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, output_image); + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, output_image); + + } api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, swapchain.images[swapchain_image_index]); api.blit_full(cmd_buf, output_image, swapchain.images[swapchain_image_index]); - - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, swapchain.images[swapchain_image_index]); } void vkrenderer::finish_frame() { -- cgit v1.3