diff options
author | Chad Versace <[email protected]> | 2016-12-27 14:26:24 -0800 |
---|---|---|
committer | Chad Versace <[email protected]> | 2016-12-28 11:10:43 -0800 |
commit | 464b23b1f289e8f9ede7c9d817c1678bbef0ad8d (patch) | |
tree | 90e13b0f32234a49d2d0345264dce1f4ba5aca1a /src | |
parent | ec01ef2db187bfb2af4ce264c2f3ed24bbf005b4 (diff) |
mesa/shaderobj: Fix races on refcounts
Use atomic ops when updating gl_shader::RefCount.
Fixes intermittent failures and crashes in
'dEQP-EGL.functional.sharing.gles2.multithread.*'.
All tests in that group now pass except
'dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.textures.copyteximage2d_texsubimage2d_render'.
Tested with:
mesa: branch 'master' at d6545f2
deqp: branch 'nougat-cts-dev' at 4acf725 with additional local fixes
DEQP_TARGET: x11_egl
hw: Intel Broadwell 0x1616
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99085
Reviewed-by: Timothy Arceri <[email protected]>
Reviewed-by: Tapani Pälli <[email protected]>
Cc: [email protected]
Cc: Mark Janes <[email protected]>
Cc: Haixia Shi <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/shaderobj.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index 6fcdf442828..2071ffff45d 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -65,14 +65,11 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, } if (*ptr) { /* Unreference the old shader */ - GLboolean deleteFlag = GL_FALSE; struct gl_shader *old = *ptr; assert(old->RefCount > 0); - old->RefCount--; - deleteFlag = (old->RefCount == 0); - if (deleteFlag) { + if (p_atomic_dec_zero(&old->RefCount)) { if (old->Name != 0) _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name); _mesa_delete_shader(ctx, old); @@ -84,7 +81,7 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, if (sh) { /* reference new */ - sh->RefCount++; + p_atomic_inc(&sh->RefCount); *ptr = sh; } } @@ -257,14 +254,11 @@ _mesa_reference_shader_program_(struct gl_context *ctx, } if (*ptr) { /* Unreference the old shader program */ - GLboolean deleteFlag = GL_FALSE; struct gl_shader_program *old = *ptr; assert(old->RefCount > 0); - old->RefCount--; - deleteFlag = (old->RefCount == 0); - if (deleteFlag) { + if (p_atomic_dec_zero(&old->RefCount)) { if (old->Name != 0) _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name); _mesa_delete_shader_program(ctx, old); @@ -275,7 +269,7 @@ _mesa_reference_shader_program_(struct gl_context *ctx, assert(!*ptr); if (shProg) { - shProg->RefCount++; + p_atomic_inc(&shProg->RefCount); *ptr = shProg; } } |