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>