<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Mar 6, 2017 at 12:40 PM, Chad Versace <span dir="ltr"><<a href="mailto:chadversary@chromium.org" target="_blank">chadversary@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For now, we support dma_bufs only for VkBuffers.  The<br>
VK_MESAX_external_memory_dma_<wbr>buf spec allows us to support dma_buf<br>
VkImages, but we choose to defer that support until<br>
VK_MESAX_external_image_dma_<wbr>buf.<br>
---<br>
 src/intel/vulkan/anv_device.c           | 28 +++++++++++++++++++---------<br>
 src/intel/vulkan/anv_<wbr>entrypoints_gen.py |  1 +<br>
 src/intel/vulkan/anv_formats.c          | 22 +++++++++++++++++++---<br>
 src/intel/vulkan/anv_private.h          |  4 ++++<br>
 4 files changed, 43 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_device.<wbr>c b/src/intel/vulkan/anv_device.<wbr>c<br>
index 1374118c83f..cc5f57b0f86 100644<br>
--- a/src/intel/vulkan/anv_device.<wbr>c<br>
+++ b/src/intel/vulkan/anv_device.<wbr>c<br>
@@ -322,6 +322,10 @@ static const VkExtensionProperties device_extensions[] = {<br>
       .extensionName = VK_KHX_EXTERNAL_MEMORY_FD_<wbr>EXTENSION_NAME,<br>
       .specVersion = 1,<br>
    },<br>
+   {<br>
+      .extensionName = VK_MESAX_EXTERNAL_MEMORY_DMA_<wbr>BUF_EXTENSION_NAME,<br>
+      .specVersion = 0,<br>
+   },<br>
 };<br>
<br>
 static void *<br>
@@ -1398,11 +1402,7 @@ VkResult anv_AllocateMemory(<br>
     * ignored.<br>
     */<br>
    if (fd_info && fd_info->handleType) {<br>
-      /* At the moment, we only support the OPAQUE_FD memory type which is<br>
-       * just a GEM buffer.<br>
-       */<br>
-      assert(fd_info->handleType ==<br>
-             VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX);<br>
+      assert((fd_info->handleType & ~ANV_SUPPORTED_MEMORY_HANDLE_<wbr>TYPES) == 0);<br>
<br>
       uint32_t gem_handle = anv_gem_fd_to_handle(device, fd_info->fd);<br>
       if (!gem_handle) {<br>
@@ -1450,8 +1450,7 @@ VkResult anv_GetMemoryFdKHX(<br>
    ANV_FROM_HANDLE(anv_device, dev, device_h);<br>
    ANV_FROM_HANDLE(anv_device_<wbr>memory, mem, memory_h);<br>
<br>
-   /* We support only one handle type. */<br>
-   assert(handleType == VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX);<br>
+   assert((handleType & ~ANV_SUPPORTED_MEMORY_HANDLE_<wbr>TYPES) == 0);<br>
<br>
    int fd = anv_gem_handle_to_fd(dev, mem->bo.gem_handle);<br>
    if (fd == -1)<br>
@@ -1468,13 +1467,24 @@ VkResult anv_GetMemoryFdPropertiesKHX(<br>
     int                                         fd,<br>
     VkMemoryFdPropertiesKHX*                    pMemoryFdProperties)<br>
 {<br>
+   ANV_FROM_HANDLE(anv_device, device, device_h);<br>
+<br>
+   if (fd == -1)<br>
+      return VK_ERROR_INVALID_EXTERNAL_<wbr>HANDLE_KHX;<br>
+<br>
    /* The valid usage section for this function says:<br>
     *<br>
     *    "handleType must not be one of the handle types defined as opaque."<br>
     *<br>
-    * Since we only handle opaque handles for now, there are no FD properties.<br>
+    * The only non-opaque fd type we support is dma_buf.<br>
     */<br>
-   return VK_ERROR_INVALID_EXTERNAL_<wbr>HANDLE_KHX;<br>
+   if (handleType != VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX)<br>
+      return VK_ERROR_INVALID_EXTERNAL_<wbr>HANDLE_KHX;<br>
+<br>
+   /* We support exactly one memory type on LLC, two on non-LLC.  */<br>
+   pMemoryFdProperties-><wbr>memoryTypeBits = device->info.has_llc ? 1 : 3;<br>
+<br>
+   return VK_SUCCESS;<br>
 }<br>
<br>
 void anv_FreeMemory(<br>
diff --git a/src/intel/vulkan/anv_<wbr>entrypoints_gen.py b/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
index eb960b45986..7ba070be5e4 100644<br>
--- a/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
+++ b/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
@@ -43,6 +43,7 @@ supported_extensions = [<br>
    'VK_KHX_external_memory',<br>
    'VK_KHX_external_memory_<wbr>capabilities',<br>
    'VK_KHX_external_memory_fd',<br>
+   'VK_MESAX_external_memory_dma_<wbr>buf',<br>
 ]<br>
<br>
 # We generate a static hash table for entry point lookup<br>
diff --git a/src/intel/vulkan/anv_<wbr>formats.c b/src/intel/vulkan/anv_<wbr>formats.c<br>
index eade36eaf6f..cbbbd0bc0d8 100644<br>
--- a/src/intel/vulkan/anv_<wbr>formats.c<br>
+++ b/src/intel/vulkan/anv_<wbr>formats.c<br>
@@ -663,7 +663,7 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties(<br>
                                           pImageFormatProperties);<br>
 }<br>
<br>
-static const VkExternalMemoryPropertiesKHX prime_fd_props = {<br>
+static const VkExternalMemoryPropertiesKHX opaque_fd_props = {<br>
    /* If we can handle external, then we can both import and export it. */<br>
    .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_<wbr>EXPORTABLE_BIT_KHX |<br>
                              VK_EXTERNAL_MEMORY_FEATURE_<wbr>IMPORTABLE_BIT_KHX,<br>
@@ -674,6 +674,17 @@ static const VkExternalMemoryPropertiesKHX prime_fd_props = {<br>
       VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX,<br>
 };<br>
<br>
+static const VkExternalMemoryPropertiesKHX dma_buf_mem_props = {<br>
+   /* If we can handle external, then we can both import and export it. */<br>
+   .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_<wbr>EXPORTABLE_BIT_KHX |<br>
+                             VK_EXTERNAL_MEMORY_FEATURE_<wbr>IMPORTABLE_BIT_KHX,<br>
+   /* For the moment, let's not support mixing and matching */<br>
+   .exportFromImportedHandleTypes =<br>
+      VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX,<br>
+   .compatibleHandleTypes =<br>
+      VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX,<br>
+};<br></blockquote><div><br></div><div>These two can import/export to/from each other just fine.  I don't see why we need to separate them.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
 VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties2KHR(<br>
     VkPhysicalDevice                            physicalDevice,<br>
     const VkPhysicalDeviceImageFormatInf<wbr>o2KHR*  base_info,<br>
@@ -722,8 +733,10 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties2KHR(<br>
    if (external_info && external_info->handleType != 0) {<br>
       switch (external_info->handleType) {<br>
       case VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX:<br>
-         external_props-><wbr>externalMemoryProperties = prime_fd_props;<br>
+         external_props-><wbr>externalMemoryProperties = opaque_fd_props;<br>
          break;<br>
+      case VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX:<br>
+         /* Fallthrough. We support dma_buf for VkBuffer but not yet VkImage. */<br>
       default:<br>
          /* From the Vulkan 1.0.42 spec:<br>
           *<br>
@@ -802,7 +815,10 @@ void anv_<wbr>GetPhysicalDeviceExternalBuffe<wbr>rPropertiesKHX(<br>
<br>
    switch (pExternalBufferInfo-><wbr>handleType) {<br>
    case VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX:<br>
-      pExternalBufferProperties-><wbr>externalMemoryProperties = prime_fd_props;<br>
+      pExternalBufferProperties-><wbr>externalMemoryProperties = opaque_fd_props;<br>
+      return;<br>
+   case VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX:<br>
+      pExternalBufferProperties-><wbr>externalMemoryProperties = dma_buf_mem_props;<br>
       return;<br>
    default:<br>
       goto unsupported;<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index 01aeb216597..ac922e7cfc6 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -834,6 +834,10 @@ struct anv_device_memory {<br>
    void *                                       map;<br>
 };<br>
<br>
+#define ANV_SUPPORTED_MEMORY_HANDLE_<wbr>TYPES \<br>
+   (VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_OPAQUE_FD_BIT_KHX | \<br>
+    VK_EXTERNAL_MEMORY_HANDLE_<wbr>TYPE_DMA_BUF_BIT_MESAX)<br>
+<br>
 /**<br>
  * Header for Vertex URB Entry (VUE)<br>
  */<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.12.0<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>