@@ -476,6 +476,8 @@ FramesPerSecondCounter fps_;
476476
477477constexpr uint32_t kNumBufferedFrames = 3 ;
478478
479+ uint32_t mtlBufIndex = 0 ;
480+
479481std::unique_ptr<lvk::IContext> ctx_;
480482lvk::Framebuffer fbMain_; // swapchain
481483lvk::Framebuffer fbOffscreen_;
@@ -502,7 +504,7 @@ lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Shadow_;
502504lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Skybox_;
503505lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Fullscreen_;
504506lvk::Holder<lvk::BufferHandle> vb0_, ib0_; // buffers for vertices and indices
505- lvk::Holder<lvk::BufferHandle> sbMaterials_; // storage buffer for materials
507+ std::vector< lvk::Holder<lvk::BufferHandle> > sbMaterials_; // storage buffer for materials
506508std::vector<lvk::Holder<lvk::BufferHandle>> ubPerFrame_, ubPerFrameShadow_, ubPerObject_;
507509lvk::Holder<lvk::SamplerHandle> sampler_;
508510lvk::Holder<lvk::SamplerHandle> samplerShadow_;
@@ -775,7 +777,7 @@ void destroy() {
775777
776778 vb0_ = nullptr ;
777779 ib0_ = nullptr ;
778- sbMaterials_ = nullptr ;
780+ sbMaterials_. clear () ;
779781 ubPerFrame_.clear ();
780782 ubPerFrameShadow_.clear ();
781783 ubPerObject_.clear ();
@@ -1001,12 +1003,15 @@ bool initModel() {
10011003 textureDummyWhite_.index (),
10021004 textureDummyWhite_.index ()});
10031005 }
1004- sbMaterials_ = ctx_->createBuffer ({.usage = lvk::BufferUsageBits_Storage,
1005- .storage = lvk::StorageType_Device,
1006- .size = sizeof (GPUMaterial) * materials_.size (),
1007- .data = materials_.data (),
1008- .debugName = " Buffer: materials" },
1009- nullptr );
1006+
1007+ for (uint32_t i = 0 ; i != kNumBufferedFrames ; i++) {
1008+ sbMaterials_.push_back (ctx_->createBuffer ({.usage = lvk::BufferUsageBits_Storage,
1009+ .storage = lvk::StorageType_Device,
1010+ .size = sizeof (GPUMaterial) * materials_.size (),
1011+ .data = materials_.data (),
1012+ .debugName = " Buffer: materials" },
1013+ nullptr ));
1014+ }
10101015
10111016 vb0_ = ctx_->createBuffer ({.usage = lvk::BufferUsageBits_Vertex,
10121017 .storage = lvk::StorageType_Device,
@@ -1374,7 +1379,7 @@ void render(double delta, uint32_t frameIndex) {
13741379 } bindings = {
13751380 .perFrame = ctx_->gpuAddress (ubPerFrame_[frameIndex]),
13761381 .perObject = ctx_->gpuAddress (ubPerObject_[frameIndex]),
1377- .materials = ctx_->gpuAddress (sbMaterials_),
1382+ .materials = ctx_->gpuAddress (sbMaterials_[mtlBufIndex] ),
13781383 };
13791384 buffer.cmdPushConstants (bindings);
13801385 buffer.cmdBindIndexBuffer (ib0_, lvk::IndexFormat_UI32);
@@ -1938,7 +1943,8 @@ void processLoadedMaterials() {
19381943 LVK_ASSERT (materials_[mtl.idx ].texAmbient >= 0 );
19391944 LVK_ASSERT (materials_[mtl.idx ].texDiffuse >= 0 );
19401945 LVK_ASSERT (materials_[mtl.idx ].texAlpha >= 0 );
1941- ctx_->upload (sbMaterials_, materials_.data (), sizeof (GPUMaterial) * materials_.size ());
1946+ mtlBufIndex = (mtlBufIndex + 1 ) % sbMaterials_.size ();
1947+ ctx_->upload (sbMaterials_[mtlBufIndex], materials_.data (), sizeof (GPUMaterial) * materials_.size ());
19421948}
19431949
19441950inline ImVec4 toVec4 (const vec4& c) {
0 commit comments