@@ -3213,14 +3213,15 @@ void Device::RecordCommandBuffer(
32133213 {
32143214 return ;
32153215 }
3216- if (!buffer_resources_->GetUniformBuffer ())
3217- {
3218- return ;
3219- }
3220- auto block = MakeUniformBlock (
3221- state, elapsed_time_seconds_);
3222- buffer_resources_->UpdateUniform (
3223- &block, sizeof (UniformBlock));
3216+ if (!buffer_resources_->GetUniformBuffer (current_frame_))
3217+ {
3218+ return ;
3219+ }
3220+ auto block = MakeUniformBlock (
3221+ state, elapsed_time_seconds_);
3222+ buffer_resources_->UpdateUniform (
3223+ current_frame_,
3224+ &block, sizeof (UniformBlock));
32243225 };
32253226 update_uniform_buffer (scene_state);
32263227
@@ -3310,13 +3311,27 @@ void Device::RecordCommandBuffer(
33103311 compute_output_in_shader_read_ = false ;
33113312 }
33123313
3313- if (use_raytracing_pipeline_ &&
3314- raytracing_pipeline_ &&
3315- raytracing_pipeline_layout_)
3316- {
3317- command_buffer.bindPipeline (
3318- vk::PipelineBindPoint::eRayTracingKHR,
3319- *raytracing_pipeline_);
3314+ if (use_raytracing_pipeline_ &&
3315+ raytracing_pipeline_ &&
3316+ raytracing_pipeline_layout_)
3317+ {
3318+ if (use_hardware_raytracing_)
3319+ {
3320+ vk::MemoryBarrier acceleration_structure_barrier (
3321+ vk::AccessFlagBits::eAccelerationStructureWriteKHR,
3322+ vk::AccessFlagBits::eAccelerationStructureReadKHR |
3323+ vk::AccessFlagBits::eShaderRead);
3324+ command_buffer.pipelineBarrier (
3325+ vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR,
3326+ vk::PipelineStageFlagBits::eRayTracingShaderKHR,
3327+ {},
3328+ acceleration_structure_barrier,
3329+ nullptr ,
3330+ nullptr );
3331+ }
3332+ command_buffer.bindPipeline (
3333+ vk::PipelineBindPoint::eRayTracingKHR,
3334+ *raytracing_pipeline_);
33203335 command_buffer.bindDescriptorSets (
33213336 vk::PipelineBindPoint::eRayTracingKHR,
33223337 *raytracing_pipeline_layout_,
@@ -4987,18 +5002,28 @@ void Device::CreateDescriptorResources()
49875002 }
49885003
49895004
4990- const BufferResource* uniform = nullptr ;
4991- if (!uniform_bindings.empty ())
4992- {
4993- buffer_resources_->BuildUniformBuffer (
4994- static_cast <vk::DeviceSize>(sizeof (UniformBlock)));
4995- uniform = buffer_resources_->GetUniformBuffer ();
4996- if (!uniform)
4997- {
4998- logger_->error (" Failed to allocate Vulkan uniform buffer." );
4999- return ;
5000- }
5001- }
5005+ std::array<const BufferResource*, kMaxFramesInFlight > uniforms = {};
5006+ if (!uniform_bindings.empty ())
5007+ {
5008+ buffer_resources_->BuildUniformBuffers (
5009+ kMaxFramesInFlight ,
5010+ static_cast <vk::DeviceSize>(sizeof (UniformBlock)));
5011+ bool have_uniforms = true ;
5012+ for (std::size_t frame = 0 ; frame < uniforms.size (); ++frame)
5013+ {
5014+ uniforms[frame] = buffer_resources_->GetUniformBuffer (frame);
5015+ if (!uniforms[frame])
5016+ {
5017+ have_uniforms = false ;
5018+ break ;
5019+ }
5020+ }
5021+ if (!have_uniforms)
5022+ {
5023+ logger_->error (" Failed to allocate Vulkan uniform buffers." );
5024+ return ;
5025+ }
5026+ }
50025027
50035028 std::vector<vk::DescriptorImageInfo> texture_infos;
50045029 if (!texture_ids.empty ())
@@ -5211,12 +5236,12 @@ void Device::CreateDescriptorResources()
52115236 &storage_infos.back ());
52125237 }
52135238
5214- if (uniform && !uniform_bindings.empty ())
5239+ if (uniforms[frame] && !uniform_bindings.empty ())
52155240 {
52165241 uniform_infos.emplace_back (
5217- *uniform ->buffer ,
5242+ *uniforms[frame] ->buffer ,
52185243 0 ,
5219- uniform ->size );
5244+ uniforms[frame] ->size );
52205245 descriptor_writes.emplace_back (
52215246 descriptor_set,
52225247 uniform_bindings.front (),
0 commit comments