cogl: Cache the value for GL_MAX_TEXTURE_UNITS
authorNeil Roberts <neil@linux.intel.com>
Fri, 12 Feb 2010 14:26:33 +0000 (14:26 +0000)
committerNeil Roberts <neil@linux.intel.com>
Fri, 12 Feb 2010 14:38:53 +0000 (14:38 +0000)
The function _cogl_get_max_texture_units is called quite often while
rendering and it returns a constant value so we might as well cache
the result. Calling glGetInteger on Mesa can be expensive because it
flushes a lot of state.

clutter/cogl/cogl/cogl-context.c
clutter/cogl/cogl/cogl-context.h
clutter/cogl/cogl/cogl.c

index 20c307e..9f60087 100644 (file)
@@ -152,6 +152,8 @@ cogl_create_context (void)
 
   _context->current_pbo = NULL;
 
+  _context->max_texture_units = -1;
+
   return TRUE;
 }
 
index 3d59c0e..6872019 100644 (file)
@@ -126,6 +126,10 @@ typedef struct
      chances of getting the same colour during an animation */
   guint8            journal_rectangles_color;
 
+  /* Cached value for GL_MAX_TEXTURE_UNITS to avoid calling
+     glGetInteger too often */
+  GLint             max_texture_units;
+
   CoglContextDriver drv;
 } CoglContext;
 
index b4f9748..b5b501b 100644 (file)
@@ -854,11 +854,17 @@ _cogl_destroy_texture_units (void)
 unsigned int
 _cogl_get_max_texture_image_units (void)
 {
-  GLint nb_texture_image_units;
+  _COGL_GET_CONTEXT (ctx, 0);
 
-  GE( glGetIntegerv(GL_MAX_TEXTURE_UNITS, &nb_texture_image_units) );
+  /* This function is called quite often so we cache the value to
+     avoid too many GL calls */
+  if (ctx->max_texture_units == -1)
+    {
+      ctx->max_texture_units = 1;
+      GE( glGetIntegerv (GL_MAX_TEXTURE_UNITS, &ctx->max_texture_units) );
+    }
 
-  return nb_texture_image_units;
+  return ctx->max_texture_units;
 }
 
 void