mesa: split _mesa_reference_program() into hot/cold paths.
authorDave Airlie <airlied@redhat.com>
Thu, 14 Jul 2011 14:09:21 +0000 (08:09 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 14 Jul 2011 14:09:38 +0000 (08:09 -0600)
inline the hotpath of the reference remaining the same. This shouldn't
penalise the slow path at all but improve the hot path so we don't have
to jump to the function.

It also moves some assert checks under an #ifndef NDEBUG.

Minor clean-ups added by Brian.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Brian Paul <brianp@vmware.com>
src/mesa/program/program.c
src/mesa/program/program.h

index 78efca9f122bb2b136073f21191a8655a67fbfdb..adca094ee89daa192dbd8366e67348061b0414b1 100644 (file)
@@ -421,12 +421,15 @@ _mesa_lookup_program(struct gl_context *ctx, GLuint id)
 
 /**
  * Reference counting for vertex/fragment programs
+ * This is normally only called from the _mesa_reference_program() macro
+ * when there's a real pointer change.
  */
 void
-_mesa_reference_program(struct gl_context *ctx,
-                        struct gl_program **ptr,
-                        struct gl_program *prog)
+_mesa_reference_program_(struct gl_context *ctx,
+                         struct gl_program **ptr,
+                         struct gl_program *prog)
 {
+#ifndef NDEBUG
    assert(ptr);
    if (*ptr && prog) {
       /* sanity check */
@@ -438,9 +441,8 @@ _mesa_reference_program(struct gl_context *ctx,
       else if ((*ptr)->Target == MESA_GEOMETRY_PROGRAM)
          ASSERT(prog->Target == MESA_GEOMETRY_PROGRAM);
    }
-   if (*ptr == prog) {
-      return;  /* no change */
-   }
+#endif
+
    if (*ptr) {
       GLboolean deleteFlag;
 
index ce37b95bf82db8c0ac55f98575b7bd0f50922017..0f32a6af73be30c3df9dd2129b80baf7d98891b3 100644 (file)
@@ -89,9 +89,18 @@ extern struct gl_program *
 _mesa_lookup_program(struct gl_context *ctx, GLuint id);
 
 extern void
+_mesa_reference_program_(struct gl_context *ctx,
+                         struct gl_program **ptr,
+                         struct gl_program *prog);
+
+static INLINE void
 _mesa_reference_program(struct gl_context *ctx,
                         struct gl_program **ptr,
-                        struct gl_program *prog);
+                        struct gl_program *prog)
+{
+   if (*ptr != prog)
+      _mesa_reference_program_(ctx, ptr, prog);
+}
 
 static INLINE void
 _mesa_reference_vertprog(struct gl_context *ctx,