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