intel/isl: Ignore base_array_layer and array_len for 3D storage surfaces
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 13 Sep 2016 05:31:00 +0000 (22:31 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 13 Sep 2016 17:43:21 +0000 (10:43 -0700)
The time we want to restrict the Z range of a 3-D surface is when rendering
to it.  For storage surfaces, we always want he full range.  However, we
still need to set MinimumArrayElement and RenderTargetViewExtent to
sensible values so we'll just set them to the reasonable defaults we used
before we started respecting the base_array_layer and array_len.

This fixes a bunch of Vulkan CTS regressions caused by 48f195d7c6483ed.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97790
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/intel/isl/isl_surface_state.c

index 5845175de348efddecda90c5db188c5d1c201a54..da1544b7921141fd66f378aa64d5134a9fa043ed 100644 (file)
@@ -313,10 +313,14 @@ isl_genX(surf_fill_state_s)(const struct isl_device *dev, void *state,
        * Since it's already initialized to 0, we can just leave it alone for
        * texture surfaces.
        */
-      if (info->view->usage & (ISL_SURF_USAGE_RENDER_TARGET_BIT |
-                               ISL_SURF_USAGE_STORAGE_BIT)) {
+      if (info->view->usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) {
          s.MinimumArrayElement = info->view->base_array_layer;
          s.RenderTargetViewExtent = info->view->array_len - 1;
+      } else if (info->view->usage & ISL_SURF_USAGE_STORAGE_BIT) {
+         s.MinimumArrayElement = 0;
+         s.RenderTargetViewExtent =
+            isl_minify(info->surf->logical_level0_px.depth,
+                       info->view->base_level) - 1;
       }
       break;
    default: