diff options
author | Jordan Justen <jordan.l.justen@intel.com> | 2014-07-31 00:16:19 -0700 |
---|---|---|
committer | Jordan Justen <jordan.l.justen@intel.com> | 2014-07-31 00:24:55 -0700 |
commit | 268e7d9dc334f35a3407d422c631be863a903cc5 (patch) | |
tree | 537d1acf7e42f7a101bdd8ae32ca4907b8a725bb | |
parent | 113f17eaba489326c503af0ff4fb8de49e0d78f4 (diff) |
i965: Fix 1D Array Shadow miptree layout issue (leading to assert or hang)1d-array-issue
Fixes assertion failure in piglit (gen6, gen8):
spec/glsl-1.30/execution/tex-miplevel-selection textureOffset 1DArrayShadow
In release builds of Mesa, this was observed to cause a GPU hang on
gen8.
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: "10.2" <mesa-stable@lists.freedesktop.org>
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 22c5ab8dbc..f504e067d5 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -244,6 +244,26 @@ intel_miptree_create_layout(struct brw_context *brw, _mesa_get_format_name(format), first_level, last_level, depth0, mt); + if (target == GL_TEXTURE_1D_ARRAY) { + /* For a 1D Array texture the OpenGL API will treat the height0 + * parameter as the number of array slices. For Intel hardware, we treat + * the 1D array as a 2D Array with a height of 1. + * + * So, when we first come through this path to create a 1D Array + * texture, height0 stores the number of slices, and depth0 is 1. In + * this case, we want to swap height0 and depth0. + * + * Since some miptrees will be created based on the base miptree, we may + * come through this path and see height0 as 1 and depth0 being the + * number of slices. In this case we don't need to do the swap. + */ + assert(height0 == 1 || depth0 == 1); + if (height0 > 1) { + depth0 = height0; + height0 = 1; + } + } + mt->target = target; mt->format = format; mt->first_level = first_level; |