From 59858360dacbb3dcb0ef14acc766d7d00a0416b4 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 10 Mar 2022 02:01:00 +0800 Subject: [PATCH] fixed a bug at AMD hardware that vkFlushMappedMemoryRanges need align to nonCoherentAtomSize --- inc/hgl/graph/VKMemory.h | 3 ++- src/SceneGraph/Vulkan/VKMemory.cpp | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/inc/hgl/graph/VKMemory.h b/inc/hgl/graph/VKMemory.h index 32399b91..87f084d7 100644 --- a/inc/hgl/graph/VKMemory.h +++ b/inc/hgl/graph/VKMemory.h @@ -12,12 +12,13 @@ class GPUMemory uint32_t properties; VkMappedMemoryRange memory_range; + VkDeviceSize nonCoherentAtomSize; private: friend class GPUDevice; - GPUMemory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements &mr,const uint32 i,const uint32_t p); + GPUMemory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements &mr,const uint32 i,const uint32_t p,const VkDeviceSize cas); public: diff --git a/src/SceneGraph/Vulkan/VKMemory.cpp b/src/SceneGraph/Vulkan/VKMemory.cpp index 0d7aee34..0c1cfdf1 100644 --- a/src/SceneGraph/Vulkan/VKMemory.cpp +++ b/src/SceneGraph/Vulkan/VKMemory.cpp @@ -16,10 +16,10 @@ GPUMemory *GPUDevice::CreateMemory(const VkMemoryRequirements &req,uint32_t prop if(vkAllocateMemory(attr->device,&alloc_info,nullptr,&memory)!=VK_SUCCESS) return(nullptr); - return(new GPUMemory(attr->device,memory,req,index,properties)); + return(new GPUMemory(attr->device,memory,req,index,properties,attr->physical_device->GetLimits().nonCoherentAtomSize)); } -GPUMemory::GPUMemory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements &mr,const uint32 i,const uint32_t p) +GPUMemory::GPUMemory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements &mr,const uint32 i,const uint32_t p,const VkDeviceSize cas) { device=dev; memory=dm; @@ -30,6 +30,8 @@ GPUMemory::GPUMemory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements & memory_range.sType =VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; memory_range.pNext =nullptr; memory_range.memory =memory; + + nonCoherentAtomSize=cas; } GPUMemory::~GPUMemory() @@ -68,7 +70,7 @@ void GPUMemory::Unmap() void GPUMemory::Flush(VkDeviceSize offset,VkDeviceSize size) { memory_range.offset =offset; - memory_range.size =size; + memory_range.size =size>0?hgl_align(size,nonCoherentAtomSize):0; vkFlushMappedMemoryRanges(device,1,&memory_range); }