intel/isl: Treat 3-D textures as 2-D arrays for rendering
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 12 Sep 2016 15:13:43 +0000 (08:13 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 12 Sep 2016 23:48:56 +0000 (16:48 -0700)
In particular, this means that isl_view::base_array_layer and
isl_view::array_len get applied to 3-D textures but only when rendering.
We were already applying isl_view::base_array_layer for rendering into 3-D
textures so this isn't a huge deviation.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/isl/isl.h
src/intel/isl/isl_surface_state.c

index bb20d1772d1c690dd1a790c1152fa2aa6d526f2a..e01624bfae9ee1ffaae5304d6534f6e5bcc4fdf8 100644 (file)
@@ -879,6 +879,12 @@ struct isl_view {
     *
     * For cube maps, both base_array_layer and array_len should be
     * specified in terms of 2-D layers and must be a multiple of 6.
+    *
+    * 3-D textures are effectively treated as 2-D arrays when used as a
+    * storage image or render target.  If `usage` contains
+    * ISL_SURF_USAGE_RENDER_TARGET_BIT or ISL_SURF_USAGE_STORAGE_BIT then
+    * base_array_layer and array_len are applied.  If the surface is only used
+    * for texturing, they are ignored.
     */
    uint32_t base_array_layer;
    uint32_t array_len;
index 979e1402e8c6c0a871db1fc720c63fb439a32355..5c5386e297c4d9729bc5f57f861e5ee1f3efe700 100644 (file)
@@ -288,8 +288,6 @@ isl_genX(surf_fill_state_s)(const struct isl_device *dev, void *state,
          s.RenderTargetViewExtent = s.Depth;
       break;
    case SURFTYPE_3D:
-      s.MinimumArrayElement = info->view->base_array_layer;
-
       /* From the Broadwell PRM >> RENDER_SURFACE_STATE::Depth:
        *
        *    If the volume texture is MIP-mapped, this field specifies the
@@ -309,11 +307,16 @@ isl_genX(surf_fill_state_s)(const struct isl_device *dev, void *state,
        * textures with more levels than we can render to.  In order to prevent
        * assert-failures in the packing function below, we only set the field
        * when it's actually going to be used by the hardware.
+       *
+       * Similaraly, the MinimumArrayElement field is ignored by all hardware
+       * prior to Sky Lake when texturing and we want it set to 0 anyway.
+       * 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)) {
-         s.RenderTargetViewExtent = isl_minify(info->surf->logical_level0_px.depth,
-                                               info->view->base_level) - 1;
+         s.MinimumArrayElement = info->view->base_array_layer;
+         s.RenderTargetViewExtent = info->view->array_len - 1;
       }
       break;
    default: