From 48f195d7c6483ed00a6d02526c6f35bb527fcaba Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 12 Sep 2016 08:13:43 -0700 Subject: [PATCH] intel/isl: Treat 3-D textures as 2-D arrays for rendering 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 Reviewed-by: Kenneth Graunke --- src/intel/isl/isl.h | 6 ++++++ src/intel/isl/isl_surface_state.c | 11 +++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index bb20d1772d1..e01624bfae9 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -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; diff --git a/src/intel/isl/isl_surface_state.c b/src/intel/isl/isl_surface_state.c index 979e1402e8c..5c5386e297c 100644 --- a/src/intel/isl/isl_surface_state.c +++ b/src/intel/isl/isl_surface_state.c @@ -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: -- 2.30.2