diff --git a/src/PBRPathTracer.cpp b/src/PBRPathTracer.cpp index c6ec8ebe..74b0f240 100644 --- a/src/PBRPathTracer.cpp +++ b/src/PBRPathTracer.cpp @@ -68,8 +68,6 @@ PBRPathTracer::PBRPathTracer(const DevicePtr &device, const PBRPathTracer::creat for(auto &frame_context: m_frame_contexts) { - frame_context.semaphore = vierkant::Semaphore(m_device); - frame_context.denoise_computable = denoise_computable; frame_context.composition_ubo = @@ -81,22 +79,11 @@ PBRPathTracer::PBRPathTracer(const DevicePtr &device, const PBRPathTracer::creat frame_context.ray_miss_ubo = vierkant::Buffer::create(device, &frame_context.settings.environment_factor, sizeof(float), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + frame_context.cmd_pre_render = vierkant::CommandBuffer(m_device, m_command_pool.get()); - vierkant::CommandBuffer::create_info_t cmd_buffer_info = {}; - cmd_buffer_info.device = m_device; - cmd_buffer_info.command_pool = m_command_pool.get(); - - cmd_buffer_info.name = "cmd_pre_render"; - frame_context.cmd_pre_render = vierkant::CommandBuffer(cmd_buffer_info); - - cmd_buffer_info.name = "cmd_trace"; - frame_context.cmd_trace = vierkant::CommandBuffer(cmd_buffer_info); - - cmd_buffer_info.name = "cmd_denoise"; - frame_context.cmd_denoise = vierkant::CommandBuffer(cmd_buffer_info); - - cmd_buffer_info.name = "cmd_post_fx"; - frame_context.cmd_post_fx = vierkant::CommandBuffer(cmd_buffer_info); + frame_context.cmd_trace = vierkant::CommandBuffer(m_device, m_command_pool.get()); + frame_context.cmd_denoise = vierkant::CommandBuffer(m_device, m_command_pool.get()); + frame_context.cmd_post_fx = vierkant::CommandBuffer(m_device, m_command_pool.get()); frame_context.scene_acceleration_context = m_ray_builder.create_scene_acceleration_context(); @@ -160,8 +147,8 @@ SceneRenderer::render_result_t PBRPathTracer::render_scene(Rasterizer &renderer, frame_context.statistics.timestamp = std::chrono::steady_clock::now(); // sync and reset semaphore - frame_context.semaphore.wait(frame_context.semaphore_value + frame_context.semaphore_value_done); - frame_context.semaphore_value += frame_context.semaphore_value_done; + frame_context.semaphore.wait(frame_context.semaphore_value_done); + frame_context.semaphore = vierkant::Semaphore(m_device); // timing/query-pool, resize storage-assets pre_render(frame_context); @@ -182,7 +169,7 @@ SceneRenderer::render_result_t PBRPathTracer::render_scene(Rasterizer &renderer, // increase batch index m_batch_index = std::min(m_batch_index + 1, frame_context.settings.max_num_batches); } - else { frame_context.semaphore.signal(frame_context.semaphore_value + SemaphoreValue::RAYTRACING); } + else { frame_context.semaphore.signal(SemaphoreValue::RAYTRACING); } // edge-aware atrous-wavelet denoiser denoise_pass(frame_context); @@ -191,7 +178,6 @@ SceneRenderer::render_result_t PBRPathTracer::render_scene(Rasterizer &renderer, post_fx_pass(frame_context); // stage final output - // TODO: add depth-buffer m_draw_context.draw_image_fullscreen(renderer, frame_context.out_image, frame_context.out_depth, true, !frame_context.settings.draw_skybox); @@ -208,7 +194,7 @@ SceneRenderer::render_result_t PBRPathTracer::render_scene(Rasterizer &renderer, // pass semaphore wait/signal information vierkant::semaphore_submit_info_t semaphore_submit_info = {}; semaphore_submit_info.semaphore = frame_context.semaphore.handle(); - semaphore_submit_info.wait_value = frame_context.semaphore_value + frame_context.semaphore_value_done; + semaphore_submit_info.wait_value = frame_context.semaphore_value_done; semaphore_submit_info.wait_stage = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT; ret.semaphore_infos = {semaphore_submit_info}; return ret; @@ -291,7 +277,7 @@ void PBRPathTracer::path_trace_pass(frame_context_t &frame_context, const vierka // wait for raybuilder, signal main semaphore vierkant::semaphore_submit_info_t semaphore_info = {}; semaphore_info.semaphore = frame_context.semaphore.handle(); - semaphore_info.signal_value = frame_context.semaphore_value + SemaphoreValue::RAYTRACING; + semaphore_info.signal_value = SemaphoreValue::RAYTRACING; frame_context.cmd_trace.submit(m_queue, false, VK_NULL_HANDLE, {frame_context.scene_ray_acceleration.semaphore_info, semaphore_info}); frame_context.semaphore_value_done = SemaphoreValue::RAYTRACING; @@ -327,8 +313,8 @@ void PBRPathTracer::denoise_pass(PBRPathTracer::frame_context_t &frame_context) vierkant::semaphore_submit_info_t semaphore_info = {}; semaphore_info.semaphore = frame_context.semaphore.handle(); semaphore_info.wait_stage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - semaphore_info.wait_value = frame_context.semaphore_value + SemaphoreValue::RAYTRACING; - semaphore_info.signal_value = frame_context.semaphore_value + SemaphoreValue::DENOISER; + semaphore_info.wait_value = SemaphoreValue::RAYTRACING; + semaphore_info.signal_value = SemaphoreValue::DENOISER; vkCmdWriteTimestamp2(frame_context.cmd_denoise.handle(), VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT, frame_context.query_pool.get(), 2 * SemaphoreValue::DENOISER + 1); @@ -371,9 +357,9 @@ void PBRPathTracer::post_fx_pass(frame_context_t &frame_context) vierkant::semaphore_submit_info_t tonemap_semaphore_info = {}; tonemap_semaphore_info.semaphore = frame_context.semaphore.handle(); - tonemap_semaphore_info.wait_value = frame_context.semaphore_value + SemaphoreValue::DENOISER; + tonemap_semaphore_info.wait_value = SemaphoreValue::DENOISER; tonemap_semaphore_info.wait_stage = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT; - tonemap_semaphore_info.signal_value = frame_context.semaphore_value + SemaphoreValue::TONEMAP; + tonemap_semaphore_info.signal_value = SemaphoreValue::TONEMAP; frame_context.out_image = frame_context.post_fx_ping_pongs[0].color_attachment();