diff options
author | Fredrik Höglund <[email protected]> | 2016-10-26 02:57:19 +0200 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2016-10-28 12:27:46 +1000 |
commit | c9675b4e17e10abef9886b0aacb84e196655e510 (patch) | |
tree | f6d99c6a15f87a8d8762550324d7248b70773a43 /src/amd | |
parent | 44760c100c3793718cc8d6cfb66852c4f72d7057 (diff) |
radv: add a write-combining host-local memory type
Add the new memory type between the two device-local types. This makes
the list of supported memory types look like this:
1) DEVICE_LOCAL | | |
2) | HOST_VISIBLE | HOST_COHERENT |
3) DEVICE_LOCAL | HOST_VISIBLE | HOST_COHERENT |
4) | HOST_VISIBLE | HOST_COHERENT | HOST_CACHED
With this order a client that searches for a HOST_VISIBLE and
HOST_COHERENT memory type using the algorithm described in section
10.2 of the Vulkan specification (revision 32) will find the host-
local memory type first.
A client that requires the memory type to be HOST_VISIBLE and
HOST_COHERENT, but not DEVICE_LOCAL is most likely searching for
a memory type suitable for staging buffers / images.
Reviewed-by: Edward O'Callaghan <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/vulkan/radv_device.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 7410bbcf456..86505f40045 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -522,19 +522,24 @@ void radv_GetPhysicalDeviceMemoryProperties( { RADV_FROM_HANDLE(radv_physical_device, physical_device, physicalDevice); - pMemoryProperties->memoryTypeCount = 3; + pMemoryProperties->memoryTypeCount = 4; pMemoryProperties->memoryTypes[0] = (VkMemoryType) { .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, .heapIndex = 0, }; pMemoryProperties->memoryTypes[1] = (VkMemoryType) { + .propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + .heapIndex = 1, + }; + pMemoryProperties->memoryTypes[2] = (VkMemoryType) { .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, .heapIndex = 0, }; - pMemoryProperties->memoryTypes[2] = (VkMemoryType) { - .propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT| + pMemoryProperties->memoryTypes[3] = (VkMemoryType) { + .propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT, .heapIndex = 1, @@ -854,7 +859,7 @@ VkResult radv_AllocateMemory( return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); uint64_t alloc_size = align_u64(pAllocateInfo->allocationSize, 4096); - if (pAllocateInfo->memoryTypeIndex == 2) + if (pAllocateInfo->memoryTypeIndex == 1 || pAllocateInfo->memoryTypeIndex == 3) domain = RADEON_DOMAIN_GTT; else domain = RADEON_DOMAIN_VRAM; @@ -863,6 +868,10 @@ VkResult radv_AllocateMemory( flags |= RADEON_FLAG_NO_CPU_ACCESS; else flags |= RADEON_FLAG_CPU_ACCESS; + + if (pAllocateInfo->memoryTypeIndex == 1) + flags |= RADEON_FLAG_GTT_WC; + mem->bo = device->ws->buffer_create(device->ws, alloc_size, 32768, domain, flags); |