[Mesa-dev] [PATCH 4/4] i965: Avoid unnecessary recompiles for shaders that don't use dFdy().

Paul Berry stereotype441 at gmail.com
Wed Jul 18 12:16:08 PDT 2012


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().
---
 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 b3b25cc..e78ea57 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -2121,19 +2121,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 bfa62c3..dc5f3e1 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
@@ -931,6 +931,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 587cc35..37bc114 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -441,13 +441,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
    const struct gl_program *prog = (struct gl_program *) brw->fragment_program;
    GLuint lookup = 0;
    GLuint line_aa;
-
-   /* 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 1258efe..61f66e7 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
@@ -1757,6 +1757,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;
 
-- 
1.7.7.6



More information about the mesa-dev mailing list