meta: use _mesa_prepare_mipmap_levels()
The prepare_mipmap_level() wrapper for _mesa_prepare_mipmap_level() is not needed. It only served to undo the GL_TEXTURE_1D_ARRAY height/depth change was was made before the call to prepare_mipmap_level() Said another way, regardless of how the meta code manipulates the height/ depth dims for GL_TEXTURE_1D_ARRAY, the gl_texture_image dimensions are correctly set up by _mesa_prepare_mipmap_levels(). Tested by plugging _mesa_meta_GenerateMipmap() into the swrast driver and testing with piglit. v2 (idr): Early out of the mipmap generation loop with dstImage is NULL. This can occur for immutable textures that have a limited range of levels or in the presense of memory allocation failures. Fixes arb_texture_view-mipgen on Intel platforms. Reviewed-by: José Fonseca <jfonseca@vmware.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Tested-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -137,21 +137,6 @@ _mesa_meta_glsl_generate_mipmap_cleanup(struct gl_context *ctx,
|
||||
_mesa_meta_blit_shader_table_cleanup(ctx, &mipmap->shaders);
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
prepare_mipmap_level(struct gl_context *ctx,
|
||||
struct gl_texture_object *texObj, GLuint level,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLenum intFormat, mesa_format format)
|
||||
{
|
||||
if (texObj->Target == GL_TEXTURE_1D_ARRAY) {
|
||||
/* Work around Mesa expecting the number of array slices in "height". */
|
||||
height = depth;
|
||||
depth = 1;
|
||||
}
|
||||
|
||||
return _mesa_prepare_mipmap_level(ctx, texObj, level, width, height, depth,
|
||||
0, intFormat, format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called via ctx->Driver.GenerateMipmap()
|
||||
@@ -270,6 +255,8 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
|
||||
/* texture is already locked, unlock now */
|
||||
_mesa_unlock_texture(ctx, texObj);
|
||||
|
||||
_mesa_prepare_mipmap_levels(ctx, texObj, baseLevel, maxLevel);
|
||||
|
||||
for (dstLevel = baseLevel + 1; dstLevel <= maxLevel; dstLevel++) {
|
||||
const struct gl_texture_image *srcImage;
|
||||
struct gl_texture_image *dstImage;
|
||||
@@ -309,17 +296,14 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
|
||||
_mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
|
||||
(GLint *) &dstLevel, false);
|
||||
|
||||
if (!prepare_mipmap_level(ctx, texObj, dstLevel,
|
||||
dstWidth, dstHeight, dstDepth,
|
||||
srcImage->InternalFormat,
|
||||
srcImage->TexFormat)) {
|
||||
/* All done. We either ran out of memory or we would go beyond the
|
||||
* last valid level of an immutable texture if we continued.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
dstImage = _mesa_select_tex_image(texObj, faceTarget, dstLevel);
|
||||
|
||||
/* All done. We either ran out of memory or we would go beyond the last
|
||||
* valid level of an immutable texture if we continued.
|
||||
*/
|
||||
if (dstImage == NULL)
|
||||
break;
|
||||
|
||||
/* limit minification to src level */
|
||||
_mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
|
||||
(GLint *) &srcLevel, false);
|
||||
|
||||
Reference in New Issue
Block a user