On 24 August 2012 03:06, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Gallium drivers and i965 don't require special notification when<br>
sampler uniforms change.  They simply see the _NEW_TEXTURE and adjust<br>
their indirection tables.  These drivers don't want ProgramStringNotify:<br>
it simply causes pointless recompiles.<br>
<br>
Unfortunately, i915 still requires shader recompiles and needs<br>
ProgramStringNotify.  Rather than trying to fix that, simply change the<br>
hook to a new, more specific one: ShaderUniformChange.  On i915, this<br>
translates to ProgramStringNotify; others simply ignore it.<br>
<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>><br></blockquote><div><br>I don't feel qualified to review this one.  I've already commented on 1, 3, 5, 7, 8, and 9.  The others (2, 4, and 6) are:<br>
<br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
 src/mesa/drivers/dri/i915/i915_fragprog.c | 8 ++++++++<br>
 src/mesa/main/dd.h                        | 7 +++++++<br>
 src/mesa/main/ff_fragment_shader.cpp      | 3 ++-<br>
 src/mesa/main/uniform_query.cpp           | 3 ++-<br>
 4 files changed, 19 insertions(+), 2 deletions(-)<br>
<br>
Killing the ProgramStringNotify calls is what fixes Cogs.<br>
This also should help Gallium: st/mesa doesn't need nor want this.<br>
<br>
diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c<br>
index 5b7e93e..7a6e067 100644<br>
--- a/src/mesa/drivers/dri/i915/i915_fragprog.c<br>
+++ b/src/mesa/drivers/dri/i915/i915_fragprog.c<br>
@@ -1303,6 +1303,13 @@ i915ProgramStringNotify(struct gl_context * ctx,<br>
    return true;<br>
 }<br>
<br>
+static void<br>
+i915SamplerUniformChange(struct gl_context *ctx,<br>
+                         GLenum target, struct gl_program *prog)<br>
+{<br>
+   i915ProgramStringNotify(ctx, target, prog);<br>
+}<br>
+<br>
 void<br>
 i915_update_program(struct gl_context *ctx)<br>
 {<br>
@@ -1456,4 +1463,5 @@ i915InitFragProgFuncs(struct dd_function_table *functions)<br>
    functions->DeleteProgram = i915DeleteProgram;<br>
    functions->IsProgramNative = i915IsProgramNative;<br>
    functions->ProgramStringNotify = i915ProgramStringNotify;<br>
+   functions->SamplerUniformChange = i915SamplerUniformChange;<br>
 }<br>
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h<br>
index 226897b..153e819 100644<br>
--- a/src/mesa/main/dd.h<br>
+++ b/src/mesa/main/dd.h<br>
@@ -396,6 +396,13 @@ struct dd_function_table {<br>
    GLboolean (*ProgramStringNotify)(struct gl_context *ctx, GLenum target,<br>
                                     struct gl_program *prog);<br>
<br>
+   /**<br>
+    * Notify driver that the sampler uniforms for the current program have<br>
+    * changed.  On some drivers, this may require shader recompiles.<br>
+    */<br>
+   void (*SamplerUniformChange)(struct gl_context *ctx, GLenum target,<br>
+                                struct gl_program *prog);<br>
+<br>
    /** Query if program can be loaded onto hardware */<br>
    GLboolean (*IsProgramNative)(struct gl_context *ctx, GLenum target,<br>
                                struct gl_program *prog);<br>
diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp<br>
index f743ce1..e850d47 100644<br>
--- a/src/mesa/main/ff_fragment_shader.cpp<br>
+++ b/src/mesa/main/ff_fragment_shader.cpp<br>
@@ -1363,7 +1363,8 @@ create_new_program(struct gl_context *ctx, struct state_key *key)<br>
    _mesa_associate_uniform_storage(ctx, p.shader_program, fp->Parameters);<br>
<br>
    _mesa_update_shader_textures_used(p.shader_program, fp);<br>
-   (void) ctx->Driver.ProgramStringNotify(ctx, fp->Target, fp);<br>
+   if (ctx->Driver.SamplerUniformChange)<br>
+      ctx->Driver.SamplerUniformChange(ctx, fp->Target, fp);<br>
<br>
    if (!p.shader_program->LinkStatus)<br>
       _mesa_problem(ctx, "Failed to link fixed function fragment shader: %s\n",<br>
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp<br>
index 816c277..bddb8f9 100644<br>
--- a/src/mesa/main/uniform_query.cpp<br>
+++ b/src/mesa/main/uniform_query.cpp<br>
@@ -809,7 +809,8 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,<br>
                   sizeof(shProg->SamplerUnits));<br>
<br>
            _mesa_update_shader_textures_used(shProg, prog);<br>
-           (void) ctx->Driver.ProgramStringNotify(ctx, prog->Target, prog);<br>
+            if (ctx->Driver.SamplerUniformChange)<br>
+              ctx->Driver.SamplerUniformChange(ctx, prog->Target, prog);<br>
         }<br>
       }<br>
    }<br>
<span><font color="#888888">--<br>
1.7.11.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br>