Parcourir la source

i965/miptree: Enforce that height == 1 for 1-D array textures

The GL API and mesa internals do this differently than we do.  In GL, there
is no depth parameter for 1-D arrays and height is used.  In the i965
miptree code we do the sane thing and make height == 1 and use depth for
number of slices.  This makes for a mismatch every time we create a 1-D
array texture from GL.  Instead of actually solving this problem, we just
said "1-D is hard, let's make sure it works no matter which way we pass the
parameters" and called it a day.

This commit fixes the one GL -> i965 transition point where we weren't
already handling 1-D array textures to do the right thing and then replaces
the magic fixup code with an assert that you're doing the right thing.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Cc: "12.0 11.2 11.1" <mesa-stable@lists.freedesktop.org>
tags/13.0-branchpoint
Jason Ekstrand il y a 9 ans
Parent
révision
d4d505d0b0

+ 3
- 19
src/mesa/drivers/dri/i965/intel_mipmap_tree.c Voir le fichier

@@ -364,25 +364,8 @@ 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;
}
}
if (target == GL_TEXTURE_1D_ARRAY)
assert(height0 == 1);

mt->target = target;
mt->format = format;
@@ -1048,6 +1031,7 @@ intel_get_image_dims(struct gl_texture_image *image,
* as a 2D Array with a height of 1. So, here we want to swap image
* height and depth.
*/
assert(image->Depth == 1);
*width = image->Width;
*height = 1;
*depth = image->Height;

+ 2
- 0
src/mesa/drivers/dri/i965/intel_tex.c Voir le fichier

@@ -141,6 +141,8 @@ intel_alloc_texture_storage(struct gl_context *ctx,
!intel_miptree_match_image(intel_texobj->mt, first_image) ||
intel_texobj->mt->last_level != levels - 1) {
intel_miptree_release(&intel_texobj->mt);

intel_get_image_dims(first_image, &width, &height, &depth);
intel_texobj->mt = intel_miptree_create(brw, texobj->Target,
first_image->TexFormat,
0, levels - 1,

Chargement…
Annuler
Enregistrer