mesa: optimize out the realloc from glCopyTexImagexD()

v2: comment about the purpose of the code
v3: also compare texFormat,
 add a perf debug message,
 formatting fixes

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Signed-off-by: Miklós Máté <mtmkls@gmail.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Miklós Máté 2016-03-24 01:13:02 +01:00 committed by Marek Olšák
parent baab345b19
commit 50d653c2bb

View file

@ -3484,6 +3484,24 @@ formats_differ_in_component_sizes(mesa_format f1, mesa_format f2)
return GL_FALSE;
}
static bool
can_avoid_reallocation(struct gl_texture_image *texImage, GLenum internalFormat,
mesa_format texFormat, GLint x, GLint y, GLsizei width,
GLsizei height, GLint border)
{
if (texImage->InternalFormat != internalFormat)
return false;
if (texImage->TexFormat != texFormat)
return false;
if (texImage->Border != border)
return false;
if (texImage->Width2 != width)
return false;
if (texImage->Height2 != height)
return false;
return true;
}
/**
* Implement the glCopyTexImage1/2D() functions.
*/
@ -3527,6 +3545,24 @@ copyteximage(struct gl_context *ctx, GLuint dims,
texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
internalFormat, GL_NONE, GL_NONE);
/* First check if reallocating the texture buffer can be avoided.
* Without the realloc the copy can be 20x faster.
*/
_mesa_lock_texture(ctx, texObj);
{
texImage = _mesa_select_tex_image(texObj, target, level);
if (texImage && can_avoid_reallocation(texImage, internalFormat, texFormat,
x, y, width, height, border)) {
_mesa_unlock_texture(ctx, texObj);
return _mesa_copy_texture_sub_image(ctx, dims, texObj, target, level,
0, 0, 0, x, y, width, height,
"CopyTexImage");
}
}
_mesa_unlock_texture(ctx, texObj);
_mesa_perf_debug(ctx, MESA_DEBUG_SEVERITY_LOW, "glCopyTexImage "
"can't avoid reallocating texture storage\n");
rb = _mesa_get_read_renderbuffer_for_format(ctx, internalFormat);
if (_mesa_is_gles3(ctx)) {