summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Fänger <a.faenger@e-sign.com>2014-01-07 03:10:00 -0700
committerCarl Worth <cworth@cworth.org>2014-01-09 12:19:01 -0800
commit2b205f2864e14914c712aa607353e7e541cd250f (patch)
treee0d92f65618537e9fa53096a737afd7f0d5285bd /src
parentb1ff3f627092029c5842f28de27b7b77cea9e5fd (diff)
swrast: fix delayed texel buffer allocation regression for OpenMP
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. Cc: "10.0" <mesa-stable@lists.freedesktop.org> Reviewed-by: Brian Paul <brianp@vmware.com> (cherry picked from commit 2a0fb946e147f5482c93702fbf46ffdf5208f57c)
Diffstat (limited to 'src')
-rw-r--r--src/mesa/swrast/s_texcombine.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/mesa/swrast/s_texcombine.c b/src/mesa/swrast/s_texcombine.c
index 7e07f4f8a34..297491ed5b2 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;