mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Backends: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize. (#3957)
If using Vulkan backend and either vertex_size or index_size is not aligned to VkPhysicalDeviceLimits::nonCoherentAtomSize, then the call to vkFlushMappedMemoryRanges in ImGui_ImplVulkan_RenderDrawData will result to validation error.
This commit is contained in:
		| @@ -22,6 +22,7 @@ | |||||||
|  |  | ||||||
| // CHANGELOG | // CHANGELOG | ||||||
| // (minor and older changes stripped away, please see git history for details) | // (minor and older changes stripped away, please see git history for details) | ||||||
|  | //  2021-03-22: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize. | ||||||
| //  2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer. | //  2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer. | ||||||
| //  2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions(). | //  2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions(). | ||||||
| //  2020-11-11: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation. | //  2020-11-11: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation. | ||||||
| @@ -343,7 +344,7 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory | |||||||
|  |  | ||||||
|     err = vkBindBufferMemory(v->Device, buffer, buffer_memory, 0); |     err = vkBindBufferMemory(v->Device, buffer, buffer_memory, 0); | ||||||
|     check_vk_result(err); |     check_vk_result(err); | ||||||
|     p_buffer_size = new_size; |     p_buffer_size = req.size; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height) | static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height) | ||||||
| @@ -429,9 +430,9 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm | |||||||
|         // Upload vertex/index data into a single contiguous GPU buffer |         // Upload vertex/index data into a single contiguous GPU buffer | ||||||
|         ImDrawVert* vtx_dst = NULL; |         ImDrawVert* vtx_dst = NULL; | ||||||
|         ImDrawIdx* idx_dst = NULL; |         ImDrawIdx* idx_dst = NULL; | ||||||
|         VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, vertex_size, 0, (void**)(&vtx_dst)); |         VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, rb->VertexBufferSize, 0, (void**)(&vtx_dst)); | ||||||
|         check_vk_result(err); |         check_vk_result(err); | ||||||
|         err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, index_size, 0, (void**)(&idx_dst)); |         err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, rb->IndexBufferSize, 0, (void**)(&idx_dst)); | ||||||
|         check_vk_result(err); |         check_vk_result(err); | ||||||
|         for (int n = 0; n < draw_data->CmdListsCount; n++) |         for (int n = 0; n < draw_data->CmdListsCount; n++) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -46,6 +46,8 @@ Other Changes: | |||||||
| - DragScalar: Add default value for v_speed argument to match higher-level functions. (#3922) [@eliasdaler] | - DragScalar: Add default value for v_speed argument to match higher-level functions. (#3922) [@eliasdaler] | ||||||
| - Backends: DirectX9: calling IDirect3DStateBlock9::Capture() after CreateStateBlock() which appears to | - Backends: DirectX9: calling IDirect3DStateBlock9::Capture() after CreateStateBlock() which appears to | ||||||
|   workaround/fix state restoring issues. Unknown exactly why so, but bit of a cargo-cult fix. (#3857) |   workaround/fix state restoring issues. Unknown exactly why so, but bit of a cargo-cult fix. (#3857) | ||||||
|  | - Backends: Vulkan: Fix mapped memory Vulkan validation error when buffer sizes are not multiple of | ||||||
|  |   VkPhysicalDeviceLimits::nonCoherentAtomSize. (#3957) [@AgentX1994] | ||||||
| - Examples: Vulkan: Rebuild swapchain on VK_SUBOPTIMAL_KHR. (#3881) | - Examples: Vulkan: Rebuild swapchain on VK_SUBOPTIMAL_KHR. (#3881) | ||||||
| - Docs: Improvements to minor mistakes in documentation comments (#3923) [@ANF-Studios] | - Docs: Improvements to minor mistakes in documentation comments (#3923) [@ANF-Studios] | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user