Mesa (8.0): i965: Avoid unnecessary recompiles for shaders that don' t use dFdy().
Ian Romanick
idr at kemper.freedesktop.org
Tue Jul 31 19:29:22 UTC 2012
Module: Mesa
Branch: 8.0
Commit: 55d23cfc561e53a8514163a188811bddcc09b7df
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=55d23cfc561e53a8514163a188811bddcc09b7df
Author: Paul Berry <stereotype441 at gmail.com>
Date: Wed Jun 20 13:40:45 2012 -0700
i965: Avoid unnecessary recompiles for shaders that don't use dFdy().
The i965 back-end needs to compile dFdy() differently for FBOs and
window system framebuffers, because Y coordinates are flipped between
the two (see commit 82d2596: i965: Compute dFdy() correctly for FBOs).
This patch avoids unnecessarily recompiling shaders that don't use
dFdy(), by only setting render_to_fbo in the wm program key if the
shader actually uses dFdy().
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
(cherry picked from commit d08fdacd58dfa6b1926e9df4707dd9e8dd5370c5)
Conflicts:
src/mesa/drivers/dri/i965/brw_wm.c
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 8 +-------
src/mesa/drivers/dri/i965/brw_fs_emit.cpp | 4 ++++
src/mesa/drivers/dri/i965/brw_wm.c | 8 +-------
src/mesa/drivers/dri/i965/brw_wm_emit.c | 4 ++++
4 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 8c20190..d7ac876 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -1878,19 +1878,13 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
struct brw_context *brw = brw_context(ctx);
struct brw_wm_prog_key key;
- /* As a temporary measure we assume that all programs use dFdy() (and hence
- * need to be compiled differently depending on whether we're rendering to
- * an FBO). FIXME: set this bool correctly based on the contents of the
- * program.
- */
- bool program_uses_dfdy = true;
-
if (!prog->_LinkedShaders[MESA_SHADER_FRAGMENT])
return true;
struct gl_fragment_program *fp = (struct gl_fragment_program *)
prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program;
struct brw_fragment_program *bfp = brw_fragment_program(fp);
+ bool program_uses_dfdy = fp->UsesDFdy;
memset(&key, 0, sizeof(key));
diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
index ebead4f..e7871a0 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
@@ -921,6 +921,10 @@ fs_visitor::generate_code()
generate_ddx(inst, dst, src[0]);
break;
case FS_OPCODE_DDY:
+ /* Make sure fp->UsesDFdy flag got set (otherwise there's no
+ * guarantee that c->key.render_to_fbo is set).
+ */
+ assert(fp->UsesDFdy);
generate_ddy(inst, dst, src[0], c->key.render_to_fbo);
break;
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 11fb03d..86bc182 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -417,13 +417,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
GLuint lookup = 0;
GLuint line_aa;
GLuint i;
-
- /* As a temporary measure we assume that all programs use dFdy() (and hence
- * need to be compiled differently depending on whether we're rendering to
- * an FBO). FIXME: set this bool correctly based on the contents of the
- * program.
- */
- bool program_uses_dfdy = true;
+ bool program_uses_dfdy = fp->program.UsesDFdy;
memset(key, 0, sizeof(*key));
diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c
index e565b71..f98d2f7 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
@@ -1750,6 +1750,10 @@ void brw_wm_emit( struct brw_wm_compile *c )
break;
case OPCODE_DDY:
+ /* Make sure fp->program.UsesDFdy flag got set (otherwise there's no
+ * guarantee that c->key.render_to_fbo is set).
+ */
+ assert(c->fp->program.UsesDFdy);
emit_ddxy(p, dst, dst_flags, false, args[0], c->key.render_to_fbo);
break;
More information about the mesa-commit
mailing list