Mesa (master): mesa: Use a new, more specific hook for shader uniform changes.

Kenneth Graunke kwg at kemper.freedesktop.org
Sun Aug 26 05:57:07 UTC 2012


Module: Mesa
Branch: master
Commit: 174d44a9c4d39a030fe3528acf07f9ac9aa617a1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=174d44a9c4d39a030fe3528acf07f9ac9aa617a1

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed Aug 22 00:43:14 2012 -0700

mesa: Use a new, more specific hook for shader uniform changes.

Gallium drivers and i965 don't require special notification when
sampler uniforms change.  They simply see the _NEW_TEXTURE and adjust
their indirection tables.  These drivers don't want ProgramStringNotify:
it simply causes pointless recompiles.

Unfortunately, i915 still requires shader recompiles and needs
ProgramStringNotify.  Rather than trying to fix that, simply change the
hook to a new, more specific one: ShaderUniformChange.  On i915, this
translates to ProgramStringNotify; others simply ignore it.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/drivers/dri/i915/i915_fragprog.c |    8 ++++++++
 src/mesa/main/dd.h                        |    7 +++++++
 src/mesa/main/ff_fragment_shader.cpp      |    3 ++-
 src/mesa/main/uniform_query.cpp           |    3 ++-
 4 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c
index 5b7e93e..7a6e067 100644
--- a/src/mesa/drivers/dri/i915/i915_fragprog.c
+++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
@@ -1303,6 +1303,13 @@ i915ProgramStringNotify(struct gl_context * ctx,
    return true;
 }
 
+static void
+i915SamplerUniformChange(struct gl_context *ctx,
+                         GLenum target, struct gl_program *prog)
+{
+   i915ProgramStringNotify(ctx, target, prog);
+}
+
 void
 i915_update_program(struct gl_context *ctx)
 {
@@ -1456,4 +1463,5 @@ i915InitFragProgFuncs(struct dd_function_table *functions)
    functions->DeleteProgram = i915DeleteProgram;
    functions->IsProgramNative = i915IsProgramNative;
    functions->ProgramStringNotify = i915ProgramStringNotify;
+   functions->SamplerUniformChange = i915SamplerUniformChange;
 }
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index a91e808..e6a1e68 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -399,6 +399,13 @@ struct dd_function_table {
    GLboolean (*ProgramStringNotify)(struct gl_context *ctx, GLenum target, 
                                     struct gl_program *prog);
 
+   /**
+    * Notify driver that the sampler uniforms for the current program have
+    * changed.  On some drivers, this may require shader recompiles.
+    */
+   void (*SamplerUniformChange)(struct gl_context *ctx, GLenum target,
+                                struct gl_program *prog);
+
    /** Query if program can be loaded onto hardware */
    GLboolean (*IsProgramNative)(struct gl_context *ctx, GLenum target, 
 				struct gl_program *prog);
diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp
index f743ce1..e850d47 100644
--- a/src/mesa/main/ff_fragment_shader.cpp
+++ b/src/mesa/main/ff_fragment_shader.cpp
@@ -1363,7 +1363,8 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
    _mesa_associate_uniform_storage(ctx, p.shader_program, fp->Parameters);
 
    _mesa_update_shader_textures_used(p.shader_program, fp);
-   (void) ctx->Driver.ProgramStringNotify(ctx, fp->Target, fp);
+   if (ctx->Driver.SamplerUniformChange)
+      ctx->Driver.SamplerUniformChange(ctx, fp->Target, fp);
 
    if (!p.shader_program->LinkStatus)
       _mesa_problem(ctx, "Failed to link fixed function fragment shader: %s\n",
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 816c277..bddb8f9 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -809,7 +809,8 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
 		   sizeof(shProg->SamplerUnits));
 
 	    _mesa_update_shader_textures_used(shProg, prog);
-	    (void) ctx->Driver.ProgramStringNotify(ctx, prog->Target, prog);
+            if (ctx->Driver.SamplerUniformChange)
+	       ctx->Driver.SamplerUniformChange(ctx, prog->Target, prog);
 	 }
       }
    }




More information about the mesa-commit mailing list