[Mesa-dev] [PATCH] swrast: fix delayed texel buffer allocation regression for OpenMP

Brian Paul brianp at vmware.com
Tue Jan 7 07:03:48 PST 2014


On 01/07/2014 03:10 AM, Andreas Fänger wrote:
> Commit 9119269ca14ed42b51c7d8e2e662500311b29fa3 moved the texel
> buffer allocation to _swrast_texture_span(), however, when compiled
> with OpenMP support this code already runs multi-threaded so a
> critical section is required to prevent multiple allocations and
> rendering errors.
> ---
>   src/mesa/swrast/s_texcombine.c |   12 ++++++++++++
>   1 files changed, 12 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/swrast/s_texcombine.c b/src/mesa/swrast/s_texcombine.c
> index 7e07f4f..297491e 100644
> --- a/src/mesa/swrast/s_texcombine.c
> +++ b/src/mesa/swrast/s_texcombine.c
> @@ -602,6 +602,14 @@ _swrast_texture_span( struct gl_context *ctx, SWspan *span )
>      if (!swrast->TexelBuffer) {
>   #ifdef _OPENMP
>         const GLint maxThreads = omp_get_max_threads();
> +
> +      /* TexelBuffer memory allocation needs to be done in a critical section
> +       * as this code runs in a parallel loop.
> +       * When entering the section, first check if TexelBuffer has been
> +       * initialized already by another thread while this thread was waiting.
> +       */
> +      #pragma omp critical
> +      if (!swrast->TexelBuffer) {
>   #else
>         const GLint maxThreads = 1;
>   #endif
> @@ -613,6 +621,10 @@ _swrast_texture_span( struct gl_context *ctx, SWspan *span )
>         swrast->TexelBuffer =
>   	 malloc(ctx->Const.FragmentProgram.MaxTextureImageUnits * maxThreads *
>   			    SWRAST_MAX_WIDTH * 4 * sizeof(GLfloat));
> +#ifdef _OPENMP
> +      } /* critical section */
> +#endif
> +
>         if (!swrast->TexelBuffer) {
>   	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture_combine");
>   	 return;
>

Reviewed-by: Brian Paul <brianp at vmware.com>

I'll push this soon. Thanks.

-Brian



More information about the mesa-dev mailing list