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@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>tags/rgb10_a2ui-v3
@@ -2119,19 +2119,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)); | |||
@@ -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; | |||
@@ -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)); | |||
@@ -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; | |||