Skip to content

Commit b2c9ba1

Browse files
Fixed overwriting materials storage buffer
1 parent 2057c3c commit b2c9ba1

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

samples/Tiny_MeshLarge.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ FramesPerSecondCounter fps_;
476476

477477
constexpr uint32_t kNumBufferedFrames = 3;
478478

479+
uint32_t mtlBufIndex = 0;
480+
479481
std::unique_ptr<lvk::IContext> ctx_;
480482
lvk::Framebuffer fbMain_; // swapchain
481483
lvk::Framebuffer fbOffscreen_;
@@ -502,7 +504,7 @@ lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Shadow_;
502504
lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Skybox_;
503505
lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Fullscreen_;
504506
lvk::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
506508
std::vector<lvk::Holder<lvk::BufferHandle>> ubPerFrame_, ubPerFrameShadow_, ubPerObject_;
507509
lvk::Holder<lvk::SamplerHandle> sampler_;
508510
lvk::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

19441950
inline ImVec4 toVec4(const vec4& c) {

0 commit comments

Comments
 (0)