State changes in share group must be updated when the object is rebound
to the binding point. That requires mesa to set texture state dirty when
binding sampler object in a share group.

GL 4.2 specification appendix "Shared Objects and Multiple Contexts"
D3.3 Rule 4:
"If the contents of an object T are changed in a context other than the
current context, T must be attached or re-attached to at least one binding
point in the current context, or at least one attachment point of a
currently bound container object C, in order to guarantee that the new
contents of T are visible in the current context."

Signed-off-by: Pauli Nieminen <pauli.niemi...@linux.intel.com>
---
 src/mesa/main/samplerobj.c |   14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
index f276296..fdd50ed 100644
--- a/src/mesa/main/samplerobj.c
+++ b/src/mesa/main/samplerobj.c
@@ -267,11 +267,19 @@ _mesa_BindSampler(GLuint unit, GLuint sampler)
          return;
       }
    }
-   
-   if (ctx->Texture.Unit[unit].Sampler != sampObj) {
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+
+   /* No need to flush if binding same sampler and context is not shared */
+   if (ctx->Texture.Unit[unit].Sampler == sampObj) {
+      GLboolean early_out;
+      _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+      early_out = (ctx->Shared->RefCount == 1);
+      _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+      if (early_out)
+         return;
    }
 
+   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+
    /* bind new sampler */
    _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler,
                                   sampObj);
-- 
1.7.9.5

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to