<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>