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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev