Skip to content

Commit 625eb71

Browse files
committed
addressing more comments.
1 parent 92c7f7d commit 625eb71

File tree

4 files changed

+64
-41
lines changed

4 files changed

+64
-41
lines changed

attachments/simple_engine/imgui_system.cpp

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

attachments/simple_engine/imgui_system.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ImGuiSystem {
5353
* @brief Render the ImGui frame.
5454
* @param commandBuffer The command buffer to record rendering commands to.
5555
*/
56-
void Render(vk::raii::CommandBuffer & commandBuffer);
56+
void Render(vk::raii::CommandBuffer & commandBuffer, uint32_t frameIndex);
5757

5858
/**
5959
* @brief Handle mouse input.
@@ -146,12 +146,13 @@ class ImGuiSystem {
146146
vk::raii::Image fontImage = nullptr;
147147
vk::raii::DeviceMemory fontMemory = nullptr;
148148
vk::raii::ImageView fontView = nullptr;
149-
vk::raii::Buffer vertexBuffer = nullptr;
150-
vk::raii::DeviceMemory vertexBufferMemory = nullptr;
151-
vk::raii::Buffer indexBuffer = nullptr;
152-
vk::raii::DeviceMemory indexBufferMemory = nullptr;
153-
uint32_t vertexCount = 0;
154-
uint32_t indexCount = 0;
149+
// Per-frame dynamic buffers to avoid GPU/CPU contention when frames are in flight
150+
std::vector<vk::raii::Buffer> vertexBuffers;
151+
std::vector<vk::raii::DeviceMemory> vertexBufferMemories;
152+
std::vector<vk::raii::Buffer> indexBuffers;
153+
std::vector<vk::raii::DeviceMemory> indexBufferMemories;
154+
std::vector<uint32_t> vertexCounts;
155+
std::vector<uint32_t> indexCounts;
155156

156157
// Window dimensions
157158
uint32_t width = 0;
@@ -217,5 +218,5 @@ class ImGuiSystem {
217218
/**
218219
* @brief Update vertex and index buffers.
219220
*/
220-
void updateBuffers();
221+
void updateBuffers(uint32_t frameIndex);
221222
};

attachments/simple_engine/renderer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ class Renderer {
180180
*/
181181
vk::Device GetDevice() const { return *device; }
182182

183+
// Expose max frames in flight for per-frame resource duplication
184+
uint32_t GetMaxFramesInFlight() const { return MAX_FRAMES_IN_FLIGHT; }
185+
183186
/**
184187
* @brief Get the Vulkan RAII device.
185188
* @return The Vulkan RAII device.

attachments/simple_engine/renderer_rendering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ void Renderer::Render(const std::vector<Entity*>& entities, CameraComponent* cam
767767

768768
// Render ImGui if provided
769769
if (imguiSystem) {
770-
imguiSystem->Render(commandBuffers[currentFrame]);
770+
imguiSystem->Render(commandBuffers[currentFrame], currentFrame);
771771
}
772772

773773
// End dynamic rendering

0 commit comments

Comments
 (0)