Fast path when rebinding the same texture in single context environment
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 3 Jun 2009 16:49:05 +0000 (17:49 +0100)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 3 Jun 2009 16:50:37 +0000 (17:50 +0100)
If there is no shared context, there is no purpose in rebinding the same
texture.  In some artificial tests this improves performance 10% - 30%.

src/mesa/main/texobj.c

index d51e7b76ec7594faf921c1d85b5848bcddf77bb6..2082f945f1852d0132f477346fe44ddbc9d1d17b 100644 (file)
@@ -945,6 +945,7 @@ _mesa_BindTexture( GLenum target, GLuint texName )
    struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
    struct gl_texture_object *newTexObj = NULL, *defaultTexObj = NULL;
    GLint targetIndex;
+   GLboolean early_out = GL_FALSE;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
@@ -998,6 +999,17 @@ _mesa_BindTexture( GLenum target, GLuint texName )
 
    assert(valid_texture_object(newTexObj));
 
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+   if ((ctx->Shared->RefCount == 1)
+       && (newTexObj == texUnit->CurrentTex[targetIndex])) {
+      early_out = GL_TRUE;
+   }
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+
+   if (early_out) {
+      return;
+   }
+
    /* flush before changing binding */
    FLUSH_VERTICES(ctx, _NEW_TEXTURE);