radv: add a write-combining host-local memory type
authorFredrik Höglund <fredrik@kde.org>
Wed, 26 Oct 2016 00:57:19 +0000 (02:57 +0200)
committerDave Airlie <airlied@redhat.com>
Fri, 28 Oct 2016 02:27:46 +0000 (12:27 +1000)
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 <funfunctor@folklore1984.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c

index 7410bbcf456d9cd8a6a58d7794f21fa510c2953b..86505f400459abf4d9d3988340cd3ed57ae64c70 100644 (file)
@@ -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);