@@ -51,6 +51,23 @@ bool ImGuiSystem::Initialize(Renderer* renderer, uint32_t width, uint32_t height
5151 return false ;
5252 }
5353
54+ // Initialize per-frame buffers containers
55+ if (renderer) {
56+ uint32_t frames = renderer->GetMaxFramesInFlight ();
57+ vertexBuffers.clear (); vertexBuffers.reserve (frames);
58+ vertexBufferMemories.clear (); vertexBufferMemories.reserve (frames);
59+ indexBuffers.clear (); indexBuffers.reserve (frames);
60+ indexBufferMemories.clear (); indexBufferMemories.reserve (frames);
61+ for (uint32_t i = 0 ; i < frames; ++i) {
62+ vertexBuffers.emplace_back (nullptr );
63+ vertexBufferMemories.emplace_back (nullptr );
64+ indexBuffers.emplace_back (nullptr );
65+ indexBufferMemories.emplace_back (nullptr );
66+ }
67+ vertexCounts.assign (frames, 0 );
68+ indexCounts.assign (frames, 0 );
69+ }
70+
5471 initialized = true ;
5572 return true ;
5673}
@@ -368,7 +385,7 @@ void ImGuiSystem::NewFrame() {
368385 ImGui::End ();
369386}
370387
371- void ImGuiSystem::Render (vk::raii::CommandBuffer & commandBuffer) {
388+ void ImGuiSystem::Render (vk::raii::CommandBuffer & commandBuffer, uint32_t frameIndex ) {
372389 if (!initialized) {
373390 return ;
374391 }
@@ -377,8 +394,8 @@ void ImGuiSystem::Render(vk::raii::CommandBuffer & commandBuffer) {
377394 // End the frame and prepare for rendering
378395 ImGui::Render ();
379396
380- // Update vertex and index buffers
381- updateBuffers ();
397+ // Update vertex and index buffers for this frame
398+ updateBuffers (frameIndex );
382399
383400 // Record rendering commands
384401 ImDrawData* drawData = ImGui::GetDrawData ();
@@ -411,11 +428,11 @@ void ImGuiSystem::Render(vk::raii::CommandBuffer & commandBuffer) {
411428
412429 commandBuffer.pushConstants <PushConstBlock>(pipelineLayout, vk::ShaderStageFlagBits::eVertex, 0 , pushConstBlock);
413430
414- // Bind vertex and index buffers
415- std::array vertexBuffers = {*vertexBuffer };
431+ // Bind vertex and index buffers for this frame
432+ std::array<vk::Buffer, 1 > vertexBuffersArr = {*vertexBuffers[frameIndex] };
416433 std::array<vk::DeviceSize, 1 > offsets = {};
417- commandBuffer.bindVertexBuffers (0 , vertexBuffers , offsets);
418- commandBuffer.bindIndexBuffer (*indexBuffer , 0 , vk::IndexType::eUint16);
434+ commandBuffer.bindVertexBuffers (0 , vertexBuffersArr , offsets);
435+ commandBuffer.bindIndexBuffer (*indexBuffers[frameIndex] , 0 , vk::IndexType::eUint16);
419436
420437 // Render command lists
421438 int vertexOffset = 0 ;
@@ -906,7 +923,7 @@ bool ImGuiSystem::createPipeline() {
906923 }
907924}
908925
909- void ImGuiSystem::updateBuffers () {
926+ void ImGuiSystem::updateBuffers (uint32_t frameIndex ) {
910927 ImDrawData* drawData = ImGui::GetDrawData ();
911928 if (!drawData || drawData->CmdListsCount == 0 ) {
912929 return ;
@@ -919,60 +936,62 @@ void ImGuiSystem::updateBuffers() {
919936 vk::DeviceSize vertexBufferSize = drawData->TotalVtxCount * sizeof (ImDrawVert);
920937 vk::DeviceSize indexBufferSize = drawData->TotalIdxCount * sizeof (ImDrawIdx);
921938
922- // Resize buffers if needed
923- if (drawData->TotalVtxCount > vertexCount) {
924- // Clean up old buffer - RAII will handle this automatically
925- vertexBuffer = nullptr ;
926- vertexBufferMemory = nullptr ;
939+ // Resize buffers if needed for this frame
940+ if (frameIndex >= vertexCounts.size ()) return ; // Safety
941+
942+ if (drawData->TotalVtxCount > vertexCounts[frameIndex]) {
943+ // Clean up old buffer
944+ vertexBuffers[frameIndex] = vk::raii::Buffer (nullptr );
945+ vertexBufferMemories[frameIndex] = vk::raii::DeviceMemory (nullptr );
927946
928947 // Create new vertex buffer
929948 vk::BufferCreateInfo bufferInfo;
930949 bufferInfo.size = vertexBufferSize;
931950 bufferInfo.usage = vk::BufferUsageFlagBits::eVertexBuffer;
932951 bufferInfo.sharingMode = vk::SharingMode::eExclusive;
933952
934- vertexBuffer = vk::raii::Buffer (device, bufferInfo);
953+ vertexBuffers[frameIndex] = vk::raii::Buffer (device, bufferInfo);
935954
936- vk::MemoryRequirements memRequirements = vertexBuffer .getMemoryRequirements ();
955+ vk::MemoryRequirements memRequirements = vertexBuffers[frameIndex] .getMemoryRequirements ();
937956
938957 vk::MemoryAllocateInfo allocInfo;
939958 allocInfo.allocationSize = memRequirements.size ;
940959 allocInfo.memoryTypeIndex = renderer->FindMemoryType (memRequirements.memoryTypeBits ,
941960 vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
942961
943- vertexBufferMemory = vk::raii::DeviceMemory (device, allocInfo);
944- vertexBuffer .bindMemory (*vertexBufferMemory , 0 );
945- vertexCount = drawData->TotalVtxCount ;
962+ vertexBufferMemories[frameIndex] = vk::raii::DeviceMemory (device, allocInfo);
963+ vertexBuffers[frameIndex] .bindMemory (*vertexBufferMemories[frameIndex] , 0 );
964+ vertexCounts[frameIndex] = drawData->TotalVtxCount ;
946965 }
947966
948- if (drawData->TotalIdxCount > indexCount ) {
949- // Clean up old buffer - RAII will handle this automatically
950- indexBuffer = nullptr ;
951- indexBufferMemory = nullptr ;
967+ if (drawData->TotalIdxCount > indexCounts[frameIndex] ) {
968+ // Clean up old buffer
969+ indexBuffers[frameIndex] = vk::raii::Buffer ( nullptr ) ;
970+ indexBufferMemories[frameIndex] = vk::raii::DeviceMemory ( nullptr ) ;
952971
953972 // Create new index buffer
954973 vk::BufferCreateInfo bufferInfo;
955974 bufferInfo.size = indexBufferSize;
956975 bufferInfo.usage = vk::BufferUsageFlagBits::eIndexBuffer;
957976 bufferInfo.sharingMode = vk::SharingMode::eExclusive;
958977
959- indexBuffer = vk::raii::Buffer (device, bufferInfo);
978+ indexBuffers[frameIndex] = vk::raii::Buffer (device, bufferInfo);
960979
961- vk::MemoryRequirements memRequirements = indexBuffer .getMemoryRequirements ();
980+ vk::MemoryRequirements memRequirements = indexBuffers[frameIndex] .getMemoryRequirements ();
962981
963982 vk::MemoryAllocateInfo allocInfo;
964983 allocInfo.allocationSize = memRequirements.size ;
965984 allocInfo.memoryTypeIndex = renderer->FindMemoryType (memRequirements.memoryTypeBits ,
966985 vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
967986
968- indexBufferMemory = vk::raii::DeviceMemory (device, allocInfo);
969- indexBuffer .bindMemory (*indexBufferMemory , 0 );
970- indexCount = drawData->TotalIdxCount ;
987+ indexBufferMemories[frameIndex] = vk::raii::DeviceMemory (device, allocInfo);
988+ indexBuffers[frameIndex] .bindMemory (*indexBufferMemories[frameIndex] , 0 );
989+ indexCounts[frameIndex] = drawData->TotalIdxCount ;
971990 }
972991
973- // Upload data to buffers
974- void * vtxMappedMemory = vertexBufferMemory .mapMemory (0 , vertexBufferSize);
975- void * idxMappedMemory = indexBufferMemory .mapMemory (0 , indexBufferSize);
992+ // Upload data to buffers for this frame
993+ void * vtxMappedMemory = vertexBufferMemories[frameIndex] .mapMemory (0 , vertexBufferSize);
994+ void * idxMappedMemory = indexBufferMemories[frameIndex] .mapMemory (0 , indexBufferSize);
976995
977996 ImDrawVert* vtxDst = static_cast <ImDrawVert*>(vtxMappedMemory);
978997 ImDrawIdx* idxDst = static_cast <ImDrawIdx*>(idxMappedMemory);
@@ -985,8 +1004,8 @@ void ImGuiSystem::updateBuffers() {
9851004 idxDst += cmdList->IdxBuffer .Size ;
9861005 }
9871006
988- vertexBufferMemory .unmapMemory ();
989- indexBufferMemory .unmapMemory ();
1007+ vertexBufferMemories[frameIndex] .unmapMemory ();
1008+ indexBufferMemories[frameIndex] .unmapMemory ();
9901009 } catch (const std::exception& e) {
9911010 std::cerr << " Failed to update buffers: " << e.what () << std::endl;
9921011 }
0 commit comments