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
_mesa_get_format_name(format), | _mesa_get_format_name(format), | ||||
first_level, last_level, depth0, mt); | 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->target = target; | ||||
mt->format = format; | mt->format = format; | ||||
* as a 2D Array with a height of 1. So, here we want to swap image | * as a 2D Array with a height of 1. So, here we want to swap image | ||||
* height and depth. | * height and depth. | ||||
*/ | */ | ||||
assert(image->Depth == 1); | |||||
*width = image->Width; | *width = image->Width; | ||||
*height = 1; | *height = 1; | ||||
*depth = image->Height; | *depth = image->Height; |
!intel_miptree_match_image(intel_texobj->mt, first_image) || | !intel_miptree_match_image(intel_texobj->mt, first_image) || | ||||
intel_texobj->mt->last_level != levels - 1) { | intel_texobj->mt->last_level != levels - 1) { | ||||
intel_miptree_release(&intel_texobj->mt); | intel_miptree_release(&intel_texobj->mt); | ||||
intel_get_image_dims(first_image, &width, &height, &depth); | |||||
intel_texobj->mt = intel_miptree_create(brw, texobj->Target, | intel_texobj->mt = intel_miptree_create(brw, texobj->Target, | ||||
first_image->TexFormat, | first_image->TexFormat, | ||||
0, levels - 1, | 0, levels - 1, |