<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Sep 2, 2017 at 1:17 AM, 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">If this flag is set, then the image and it's device memory have the same<br>
lifetime.  vkDestroyImage will free its anv_device_memory.<br>
<br>
We need this for VK_ANDROID_native_buffer, because that extension<br>
creates the VkImage and imports its memory in the same call,<br>
vkCreateImage.<br></blockquote><div><br></div><div>So, this got me thinking... VK_ANDROID_native_buffer doesn't actually return the VkDeviceMemory object to the client.  Why does anv_image need to own an anv_device_memory?  It's just a wrapper around a pointer and a map anyway.  Why not just have it own a reference to the BO?  We still need the logic here to release said BO but that sounds like it would shrink the reach of VK_ANDROID_native_buffer down a bit.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
 src/intel/vulkan/anv_image.c   | 8 ++++++++<br>
 src/intel/vulkan/anv_private.h | 3 +++<br>
 2 files changed, 11 insertions(+)<br>
<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index 1fe8ab8ee43..1cc3adae5ee 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -450,6 +450,9 @@ anv_image_create(VkDevice _device,<br>
    return VK_SUCCESS;<br>
<br>
 fail:<br>
+   if (image && image->mem_is_owned)<br>
+      anv_FreeMemory(_device, anv_device_memory_to_handle(<wbr>image->mem), alloc);<br>
+<br>
    if (image)<br>
       vk_free2(&device->alloc, alloc, image);<br>
<br>
@@ -480,6 +483,11 @@ anv_DestroyImage(VkDevice _device, VkImage _image,<br>
    if (!image)<br>
       return;<br>
<br>
+   if (image->mem_is_owned) {<br>
+      anv_FreeMemory(_device, anv_device_memory_to_handle(<wbr>image->mem),<br>
+                     pAllocator);<br>
+   }<br>
+<br>
    vk_free2(&device->alloc, pAllocator, image);<br>
 }<br>
<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index 98bdaa90a50..d1c3d743061 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -2089,6 +2089,9 @@ struct anv_image {<br>
    struct anv_device_memory *mem;<br>
    VkDeviceSize mem_offset;<br>
<br>
+   /** When destroying the image, also free its device memory. */<br>
+   bool mem_is_owned;<br>
+<br>
    /**<br>
     * Image subsurfaces<br>
     *<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.13.5<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>