Mesa (master): anv/image: Memset hiz surfaces to 0 when binding memory

Nanley Chery nchery at kemper.freedesktop.org
Fri Oct 7 19:57:07 UTC 2016


Module: Mesa
Branch: master
Commit: 9919a2d34deca437bfbb95d7a869616758bb69fd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9919a2d34deca437bfbb95d7a869616758bb69fd

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Thu Oct  6 15:21:51 2016 -0700

anv/image: Memset hiz surfaces to 0 when binding memory

Nanley Chery (amend):
 - Change memset value from 0xff to 0 (a defined value for HiZ).

Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
Reviewed-by: Chad Versace <chadversary at chromium.org>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

---

 src/intel/vulkan/anv_image.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 7dada66..f125aa6 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -317,11 +317,12 @@ anv_DestroyImage(VkDevice _device, VkImage _image,
 }
 
 VkResult anv_BindImageMemory(
-    VkDevice                                    device,
+    VkDevice                                    _device,
     VkImage                                     _image,
     VkDeviceMemory                              _memory,
     VkDeviceSize                                memoryOffset)
 {
+   ANV_FROM_HANDLE(anv_device, device, _device);
    ANV_FROM_HANDLE(anv_device_memory, mem, _memory);
    ANV_FROM_HANDLE(anv_image, image, _image);
 
@@ -333,6 +334,34 @@ VkResult anv_BindImageMemory(
       image->offset = 0;
    }
 
+   if (anv_image_has_hiz(image)) {
+
+      /* The offset and size must be a multiple of 4K or else the
+       * anv_gem_mmap call below will return NULL.
+       */
+      assert((image->offset + image->hiz_surface.offset) % 4096 == 0);
+      assert(image->hiz_surface.isl.size % 4096 == 0);
+
+      /* HiZ surfaces need to have their memory cleared to 0 before they
+       * can be used.  If we let it have garbage data, it can cause GPU
+       * hangs on some hardware.
+       */
+      void *map = anv_gem_mmap(device, image->bo->gem_handle,
+                               image->offset + image->hiz_surface.offset,
+                               image->hiz_surface.isl.size,
+                               device->info.has_llc ? 0 : I915_MMAP_WC);
+
+      /* If anv_gem_mmap returns NULL, it's likely that the kernel was
+       * not able to find space on the host to create a proper mapping.
+       */
+      if (map == NULL)
+         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
+
+      memset(map, 0, image->hiz_surface.isl.size);
+
+      anv_gem_munmap(map, image->hiz_surface.isl.size);
+   }
+
    return VK_SUCCESS;
 }
 




More information about the mesa-commit mailing list