[Mesa-dev] [PATCH] mesa/program: split reference program into hot/cold paths.

Brian Paul brianp at vmware.com
Fri Jun 24 06:20:06 PDT 2011


On 06/23/2011 11:22 PM, Dave Airlie wrote:
> From: Dave Airlie<airlied at redhat.com>
>
> 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.
>
> Signed-off-by: Dave Airlie<airlied at redhat.com>
> ---
>   src/mesa/program/program.c |    8 ++++----
>   src/mesa/program/program.h |   12 +++++++++++-
>   2 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c
> index 78efca9..b419058 100644
> --- a/src/mesa/program/program.c
> +++ b/src/mesa/program/program.c
> @@ -423,10 +423,11 @@ _mesa_lookup_program(struct gl_context *ctx, GLuint id)
>    * Reference counting for vertex/fragment programs
>    */
>   void
> -_mesa_reference_program(struct gl_context *ctx,
> +__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 +439,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;
>
> diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h
> index ce37b95..c093afa 100644
> --- a/src/mesa/program/program.h
> +++ b/src/mesa/program/program.h
> @@ -89,11 +89,21 @@ extern struct gl_program *
>   _mesa_lookup_program(struct gl_context *ctx, GLuint id);
>
>   extern void
> -_mesa_reference_program(struct gl_context *ctx,
> +__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)
> +{
> +   if (*ptr == prog)
> +     return;
> +   __mesa_reference_program(ctx, ptr, prog);
> +}

How about:

if (*ptr != prog)
    __mesa_reference_program(ctx, ptr, prog);


Otherwise, Reviewed-by: Brian Paul <brianp at vmware.com>



More information about the mesa-dev mailing list