aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2021-03-09 22:06:34 +0100
committerladevieq <ladevie.quentin@gmail.com>2021-03-09 22:06:34 +0100
commite4c24757a15a8a33019e4e2c28302b583b9366b7 (patch)
treeb5196dcd51428df4371cc612016a18127350e516
parent14b00bdd8d0f3a6bdbc5623a964177cc6df2f4cc (diff)
Render ui on top of path tracer result
-rw-r--r--include/vk-api.hpp3
-rw-r--r--include/vk-renderer.hpp2
-rw-r--r--src/main.cpp15
-rw-r--r--src/vk-api.cpp18
-rw-r--r--src/vk-renderer.cpp33
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<VkCommandBuffer> &command_buffers);
- VkRenderPass create_render_pass(std::vector<VkFormat>& color_attachments_format);
+ VkRenderPass create_render_pass(std::vector<VkFormat>& color_attachments_format, VkImageLayout initial_layout, VkImageLayout final_layout);
VkRenderPass create_render_pass(std::vector<VkFormat>& 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<VkCommandBuffer> &command_buffer
// TODO: attachment structure
-VkRenderPass vkapi::create_render_pass(std::vector<VkFormat>& color_attachments_format) {
+VkRenderPass vkapi::create_render_pass(std::vector<VkFormat>& color_attachments_format, VkImageLayout initial_layout, VkImageLayout final_layout) {
std::vector<VkAttachmentDescription> attachments_description = {};
std::vector<VkAttachmentReference> attachments_reference = {};
@@ -280,12 +280,12 @@ VkRenderPass vkapi::create_render_pass(std::vector<VkFormat>& 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<VkFramebuffer>& framebuffers) {
Pipeline vkapi::create_compute_pipeline(const char* shader_name, std::vector<VkDescriptorSetLayoutBinding>& 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<VkD
}
Pipeline vkapi::create_graphics_pipeline(const char* shader_name, std::vector<VkDescriptorSetLayoutBinding>& bindings, VkShaderStageFlagBits shader_stages, VkRenderPass render_pass, std::vector<VkDynamicState> dynamic_states) {
- Pipeline pipeline;
+ Pipeline pipeline {
+ .bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS
+ };
std::vector<VkPipelineShaderStageCreateInfo> 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<VkFormat> 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<Image> 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() {