From 2db8873f92a17a342072e57ab4f9d7736a0283b5 Mon Sep 17 00:00:00 2001 From: redstrate <54911369+redstrate@users.noreply.github.com> Date: Tue, 1 Jun 2021 12:02:38 -0400 Subject: [PATCH] Fix imgui validation errors on Vulkan * Eventually, get_buffer_contents() will be removed --- engine/gfx/vulkan/src/gfx_vulkan.cpp | 8 ++++++++ engine/renderer/src/imguipass.cpp | 25 ++++++++++++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/engine/gfx/vulkan/src/gfx_vulkan.cpp b/engine/gfx/vulkan/src/gfx_vulkan.cpp index e2ad15a..65b3519 100755 --- a/engine/gfx/vulkan/src/gfx_vulkan.cpp +++ b/engine/gfx/vulkan/src/gfx_vulkan.cpp @@ -337,6 +337,14 @@ void* GFXVulkan::get_buffer_contents(GFXBuffer* buffer) { void GFXVulkan::release_buffer_contents(GFXBuffer* buffer, void* handle) { GFXVulkanBuffer* vulkanBuffer = (GFXVulkanBuffer*)buffer; + + VkMappedMemoryRange range = {}; + range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range.memory = vulkanBuffer->memory; + range.size = VK_WHOLE_SIZE; + + vkFlushMappedMemoryRanges(device, 1, &range); + vkUnmapMemory(device, vulkanBuffer->memory); } diff --git a/engine/renderer/src/imguipass.cpp b/engine/renderer/src/imguipass.cpp index 0888905..619554a 100755 --- a/engine/renderer/src/imguipass.cpp +++ b/engine/renderer/src/imguipass.cpp @@ -204,16 +204,23 @@ void ImGuiPass::update_buffers(RenderTarget& target, const ImDrawData& draw_data target.index_buffer[target.current_frame] = engine->get_gfx()->create_buffer(nullptr, new_index_size, true, GFXBufferUsage::Index); target.current_index_size[target.current_frame] = new_index_size; } - - int vertex_offset = 0; - int index_offset = 0; + + auto vtx_map = engine->get_gfx()->get_buffer_contents(target.vertex_buffer[target.current_frame]); + auto idx_map = engine->get_gfx()->get_buffer_contents(target.index_buffer[target.current_frame]); + + auto vtx_dst = (ImDrawVert*)vtx_map; + auto idx_dst = (ImDrawIdx*)idx_map; + for(int i = 0; i < draw_data.CmdListsCount; i++) { const ImDrawList* cmd_list = draw_data.CmdLists[i]; - - engine->get_gfx()->copy_buffer(target.vertex_buffer[target.current_frame], cmd_list->VtxBuffer.Data, vertex_offset, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); - engine->get_gfx()->copy_buffer(target.index_buffer[target.current_frame], cmd_list->IdxBuffer.Data, index_offset, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); - - vertex_offset += cmd_list->VtxBuffer.Size * sizeof(ImDrawVert); - index_offset += cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx); + + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; } + + engine->get_gfx()->release_buffer_contents(target.vertex_buffer[target.current_frame], vtx_map); + engine->get_gfx()->release_buffer_contents(target.index_buffer[target.current_frame], idx_map); }