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@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Paul Berry 2012-06-20 13:40:45 -07:00
parent ce1d2f08f9
commit d08fdacd58
4 changed files with 10 additions and 14 deletions

View File

@ -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));

View File

@ -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;

View File

@ -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));

View File

@ -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;