[Mesa-dev] [PATCH 10/11] [RFC] mesa: optimize out the realloc from glCopyTexImagexD()
Miklós Máté
mtmkls at gmail.com
Tue Dec 15 15:05:43 PST 2015
Apitrace showed this call to be 5ms (9 times per frame),
but in reality it's about 500us. This shortcut makes it 20us.
---
src/mesa/main/teximage.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index ab60a2f..ba13720 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -3393,6 +3393,21 @@ formats_differ_in_component_sizes(mesa_format f1, mesa_format f2)
return GL_FALSE;
}
+static GLboolean
+canAvoidRealloc(struct gl_texture_image *texImage, GLenum internalFormat,
+ GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ if (texImage->InternalFormat != internalFormat)
+ 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.
*/
@@ -3433,6 +3448,20 @@ copyteximage(struct gl_context *ctx, GLuint dims,
texObj = _mesa_get_current_tex_object(ctx, target);
assert(texObj);
+ _mesa_lock_texture(ctx, texObj);
+ {
+ texImage = _mesa_select_tex_image(texObj, target, level);
+ if (texImage && canAvoidRealloc(texImage, internalFormat,
+ x, y, width, height, border)) {
+ _mesa_unlock_texture(ctx, texObj);
+ //_mesa_debug(0, "using shortcut\n");
+ return _mesa_copy_texture_sub_image(ctx, dims, texObj, target, level,
+ 0, 0, 0, x, y, width, height, "CopyTexImage");
+ }
+ //_mesa_debug(0, "can't shortcut %p, %dx%d\n", texImage, width, height);
+ }
+ _mesa_unlock_texture(ctx, texObj);
+
texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
internalFormat, GL_NONE, GL_NONE);
--
2.6.4
More information about the mesa-dev
mailing list