anv: Allocate hiz surface
authorChad Versace <chad.versace@intel.com>
Thu, 6 Oct 2016 22:21:49 +0000 (15:21 -0700)
committerNanley Chery <nanley.g.chery@intel.com>
Fri, 7 Oct 2016 19:54:18 +0000 (12:54 -0700)
Nanley Chery:
(rebase)
 - Use isl_surf_get_hiz_surf()
(amend)
 - Only add a HiZ surface onto a depth/stencil attachment
 - Add comment above HiZ surface addition
 - Hide HiZ behind INTEL_VK_HIZ prior to BDW
 - Disable HiZ for untested cases
 - Remove DISABLE_AUX_BIT instead of preventing it from being added

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/intel/vulkan/anv_image.c

index f6e86725f9f93f26273e10518ff79531b99d41ce..77dcd46236e2e50233d6b1754ee85f32ce993939 100644 (file)
@@ -28,6 +28,7 @@
 #include <fcntl.h>
 
 #include "anv_private.h"
+#include "util/debug.h"
 
 #include "vk_format_info.h"
 
@@ -60,6 +61,7 @@ choose_isl_surf_usage(VkImageUsageFlags vk_usage,
       default:
          unreachable("bad VkImageAspect");
       case VK_IMAGE_ASPECT_DEPTH_BIT:
+         isl_usage &= ~ISL_SURF_USAGE_DISABLE_AUX_BIT;
          isl_usage |= ISL_SURF_USAGE_DEPTH_BIT;
          break;
       case VK_IMAGE_ASPECT_STENCIL_BIT:
@@ -99,6 +101,16 @@ get_surface(struct anv_image *image, VkImageAspectFlags aspect)
    }
 }
 
+static void
+add_surface(struct anv_image *image, struct anv_surface *surf)
+{
+   assert(surf->isl.size > 0); /* isl surface must be initialized */
+
+   surf->offset = align_u32(image->size, surf->isl.alignment);
+   image->size = surf->offset + surf->isl.size;
+   image->alignment = MAX(image->alignment, surf->isl.alignment);
+}
+
 /**
  * Initialize the anv_image::*_surface selected by \a aspect. Then update the
  * image's memory requirements (that is, the image's size and alignment).
@@ -160,9 +172,28 @@ make_surface(const struct anv_device *dev,
     */
    assert(ok);
 
-   anv_surf->offset = align_u32(image->size, anv_surf->isl.alignment);
-   image->size = anv_surf->offset + anv_surf->isl.size;
-   image->alignment = MAX(image->alignment, anv_surf->isl.alignment);
+   add_surface(image, anv_surf);
+
+   /* Add a HiZ surface to a depth buffer that will be used for rendering.
+    */
+   if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT &&
+       (image->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
+
+      /* Allow the user to control HiZ enabling. Disable by default on gen7
+       * because resolves are not currently implemented pre-BDW.
+       */
+      if (!env_var_as_boolean("INTEL_VK_HIZ", dev->info.gen >= 8)) {
+         anv_finishme("Implement gen7 HiZ");
+      } else if (vk_info->mipLevels > 1) {
+         anv_finishme("Test multi-LOD HiZ");
+      } else if (dev->info.gen == 8 && vk_info->samples > 1) {
+         anv_finishme("Test gen8 multisampled HiZ");
+      } else {
+         isl_surf_get_hiz_surf(&dev->isl_dev, &image->depth_surface.isl,
+                               &image->hiz_surface.isl);
+         add_surface(image, &image->hiz_surface);
+      }
+   }
 
    return VK_SUCCESS;
 }