From 8e3aac57449b9ab73dabef187807528a597e837a Mon Sep 17 00:00:00 2001
From: Thomas Quante
Date: Fri, 27 Jun 2025 15:52:39 +0200
Subject: [PATCH] Backends: Vulkan: use nonCoherentAtomSize to align
upload_size, fixing validation error on some setups. (#8743, #8744)
---
backends/imgui_impl_vulkan.cpp | 10 +++++++++-
docs/CHANGELOG.txt | 2 ++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/backends/imgui_impl_vulkan.cpp b/backends/imgui_impl_vulkan.cpp
index 5546a59ff..059e8c9ed 100644
--- a/backends/imgui_impl_vulkan.cpp
+++ b/backends/imgui_impl_vulkan.cpp
@@ -27,6 +27,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
+// 2025-06-27: Vulkan: Fixed validation errors during texture upload/update by aligning upload size to 'nonCoherentAtomSize'. (#8743, #8744)
// 2025-06-11: Vulkan: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas. Removed ImGui_ImplVulkan_CreateFontsTexture() and ImGui_ImplVulkan_DestroyFontsTexture().
// 2025-05-07: Vulkan: Fixed validation errors during window detach in multi-viewport mode. (#8600, #8176)
// 2025-05-07: Vulkan: Load dynamic rendering functions using vkGetDeviceProcAddr() + try both non-KHR and KHR versions. (#8600, #8326, #8365)
@@ -244,6 +245,7 @@ struct ImGui_ImplVulkan_Data
{
ImGui_ImplVulkan_InitInfo VulkanInitInfo;
VkDeviceSize BufferMemoryAlignment;
+ VkDeviceSize NonCoherentAtomSize;
VkPipelineCreateFlags PipelineCreateFlags;
VkDescriptorSetLayout DescriptorSetLayout;
VkPipelineLayout PipelineLayout;
@@ -264,6 +266,7 @@ struct ImGui_ImplVulkan_Data
{
memset((void*)this, 0, sizeof(*this));
BufferMemoryAlignment = 256;
+ NonCoherentAtomSize = 64;
}
};
@@ -751,7 +754,7 @@ void ImGui_ImplVulkan_UpdateTexture(ImTextureData* tex)
VkBuffer upload_buffer;
VkDeviceSize upload_pitch = upload_w * tex->BytesPerPixel;
- VkDeviceSize upload_size = upload_h * upload_pitch;
+ VkDeviceSize upload_size = AlignBufferSize(upload_h * upload_pitch, bd->NonCoherentAtomSize);
{
VkBufferCreateInfo buffer_info = {};
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -1225,6 +1228,11 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info)
IM_ASSERT(info->RenderPass != VK_NULL_HANDLE);
bd->VulkanInitInfo = *info;
+
+ VkPhysicalDeviceProperties properties;
+ vkGetPhysicalDeviceProperties(info->PhysicalDevice, &properties);
+ bd->NonCoherentAtomSize = properties.limits.nonCoherentAtomSize;
+
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
if (v->PipelineRenderingCreateInfo.pColorAttachmentFormats != NULL)
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index bdd06a7c3..5666a03cc 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -45,6 +45,8 @@ Other changes:
- Backends: OSX: added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress
mouse cursor support. (#8739) [@cfillion]
+- Backends: Vulkan: use nonCoherentAtomSize to align upload_size, fixing
+ validation error on some setups. (#8743, #8744) [@tquante]
-----------------------------------------------------------------------