For now, we support dma_bufs only for VkBuffers. The VK_MESAX_external_memory_dma_buf spec allows us to support dma_buf VkImages, but we choose to defer that support until VK_MESAX_external_image_dma_buf. --- src/intel/vulkan/anv_device.c | 28 +++++++++++++++++++--------- src/intel/vulkan/anv_entrypoints_gen.py | 1 + src/intel/vulkan/anv_formats.c | 22 +++++++++++++++++++--- src/intel/vulkan/anv_private.h | 4 ++++ 4 files changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 1374118c83f..cc5f57b0f86 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -322,6 +322,10 @@ static const VkExtensionProperties device_extensions[] = { .extensionName = VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME, .specVersion = 1, }, + { + .extensionName = VK_MESAX_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME, + .specVersion = 0, + }, }; static void * @@ -1398,11 +1402,7 @@ VkResult anv_AllocateMemory( * ignored. */ if (fd_info && fd_info->handleType) { - /* At the moment, we only support the OPAQUE_FD memory type which is - * just a GEM buffer. - */ - assert(fd_info->handleType == - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX); + assert((fd_info->handleType & ~ANV_SUPPORTED_MEMORY_HANDLE_TYPES) == 0); uint32_t gem_handle = anv_gem_fd_to_handle(device, fd_info->fd); if (!gem_handle) { @@ -1450,8 +1450,7 @@ VkResult anv_GetMemoryFdKHX( ANV_FROM_HANDLE(anv_device, dev, device_h); ANV_FROM_HANDLE(anv_device_memory, mem, memory_h); - /* We support only one handle type. */ - assert(handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX); + assert((handleType & ~ANV_SUPPORTED_MEMORY_HANDLE_TYPES) == 0); int fd = anv_gem_handle_to_fd(dev, mem->bo.gem_handle); if (fd == -1) @@ -1468,13 +1467,24 @@ VkResult anv_GetMemoryFdPropertiesKHX( int fd, VkMemoryFdPropertiesKHX* pMemoryFdProperties) { + ANV_FROM_HANDLE(anv_device, device, device_h); + + if (fd == -1) + return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHX; + /* The valid usage section for this function says: * * "handleType must not be one of the handle types defined as opaque." * - * Since we only handle opaque handles for now, there are no FD properties. + * The only non-opaque fd type we support is dma_buf. */ - return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHX; + if (handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX) + return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHX; + + /* We support exactly one memory type on LLC, two on non-LLC. */ + pMemoryFdProperties->memoryTypeBits = device->info.has_llc ? 1 : 3; + + return VK_SUCCESS; } void anv_FreeMemory( diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py index eb960b45986..7ba070be5e4 100644 --- a/src/intel/vulkan/anv_entrypoints_gen.py +++ b/src/intel/vulkan/anv_entrypoints_gen.py @@ -43,6 +43,7 @@ supported_extensions = [ 'VK_KHX_external_memory', 'VK_KHX_external_memory_capabilities', 'VK_KHX_external_memory_fd', + 'VK_MESAX_external_memory_dma_buf', ] # We generate a static hash table for entry point lookup diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index eade36eaf6f..cbbbd0bc0d8 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -663,7 +663,7 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties( pImageFormatProperties); } -static const VkExternalMemoryPropertiesKHX prime_fd_props = { +static const VkExternalMemoryPropertiesKHX opaque_fd_props = { /* If we can handle external, then we can both import and export it. */ .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHX | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHX, @@ -674,6 +674,17 @@ static const VkExternalMemoryPropertiesKHX prime_fd_props = { VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX, }; +static const VkExternalMemoryPropertiesKHX dma_buf_mem_props = { + /* If we can handle external, then we can both import and export it. */ + .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHX | + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHX, + /* For the moment, let's not support mixing and matching */ + .exportFromImportedHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX, + .compatibleHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX, +}; + VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* base_info, @@ -722,8 +733,10 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR( if (external_info && external_info->handleType != 0) { switch (external_info->handleType) { case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX: - external_props->externalMemoryProperties = prime_fd_props; + external_props->externalMemoryProperties = opaque_fd_props; break; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX: + /* Fallthrough. We support dma_buf for VkBuffer but not yet VkImage. */ default: /* From the Vulkan 1.0.42 spec: * @@ -802,7 +815,10 @@ void anv_GetPhysicalDeviceExternalBufferPropertiesKHX( switch (pExternalBufferInfo->handleType) { case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX: - pExternalBufferProperties->externalMemoryProperties = prime_fd_props; + pExternalBufferProperties->externalMemoryProperties = opaque_fd_props; + return; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX: + pExternalBufferProperties->externalMemoryProperties = dma_buf_mem_props; return; default: goto unsupported; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 01aeb216597..ac922e7cfc6 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -834,6 +834,10 @@ struct anv_device_memory { void * map; }; +#define ANV_SUPPORTED_MEMORY_HANDLE_TYPES \ + (VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX | \ + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_MESAX) + /** * Header for Vertex URB Entry (VUE) */ -- 2.12.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev