On Mon, Mar 6, 2017 at 12:40 PM, Chad Versace <chadvers...@chromium.org> wrote:
> 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, > +}; > These two can import/export to/from each other just fine. I don't see why we need to separate them. > + > VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR( > VkPhysicalDevice physicalDevice, > const VkPhysicalDeviceImageFormatInfo2KHR* base_info, > @@ -722,8 +733,10 @@ VkResult anv_GetPhysicalDeviceImageFormatPr > operties2KHR( > 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_GetPhysicalDeviceExternalBuffe > rPropertiesKHX( > > 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 >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev