summaryrefslogtreecommitdiffstats
path: root/src/intel/vulkan/anv_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel/vulkan/anv_image.c')
-rw-r--r--src/intel/vulkan/anv_image.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 7dada66d701..f125aa65b0a 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;
}