[Mesa-dev] [PATCH 7/7] mesa: optimize out the realloc from glCopyTexImagexD()

Ian Romanick idr at freedesktop.org
Thu Feb 25 18:42:06 UTC 2016


On 02/24/2016 03:35 PM, Miklós Máté wrote:
> v2: comment about the purpose of the code
> v3: also compare texFormat,
>  add a perf debug message,
>  formatting fixes
> 
> Signed-off-by: Miklós Máté <mtmkls at gmail.com>
> ---
>  src/mesa/main/teximage.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 8a4c628..a906de3 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -3474,6 +3474,23 @@ 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)

The second line should be indented to line up with the ( of the previous
line.  With that fixed, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

Assuming there is no other review feedback, I can fix that whitespace
issue for you when I commit the patch.

> +{
> +   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.
>   */
> @@ -3517,6 +3534,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)) {
> 



More information about the mesa-dev mailing list