fixed a bug at AMD hardware that vkFlushMappedMemoryRanges need align to nonCoherentAtomSize

This commit is contained in:
hyzboy 2022-03-10 02:01:00 +08:00
parent 885cd735cd
commit 59858360da
2 changed files with 7 additions and 4 deletions

View File

@ -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:

View File

@ -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);
}