From 08bc74e69476107e9944932d2fe9dba053b44570 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 17 May 2016 03:40:11 -0700 Subject: [PATCH] i965: Delete brw_wm_prog_key::render_to_fbo and drawable_height. Now that we handle flipping and other gl_FragCoord transformations via a uniform, these key fields have no users. This patch actually eliminates the associated recompiles. The Tomb Raider benchmark's minimum FPS increases from ~1 FPS to a reasonable number. Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner --- src/intel/vulkan/anv_pipeline.c | 4 --- src/mesa/drivers/dri/i965/brw_compiler.h | 1 - src/mesa/drivers/dri/i965/brw_wm.c | 45 -------------------------------- 3 files changed, 50 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index a9cecd69eb5..d63e50e228b 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -272,10 +272,6 @@ populate_wm_prog_key(const struct brw_device_info *devinfo, /* XXX Vulkan doesn't appear to specify */ key->clamp_fragment_color = false; - /* Vulkan always specifies upper-left coordinates */ - key->drawable_height = 0; - key->render_to_fbo = false; - if (extra && extra->color_attachment_count >= 0) { key->nr_color_regions = extra->color_attachment_count; } else { diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h index f4b9d3dddc6..fb0e9aec05e 100644 --- a/src/mesa/drivers/dri/i965/brw_compiler.h +++ b/src/mesa/drivers/dri/i965/brw_compiler.h @@ -244,7 +244,6 @@ struct brw_wm_prog_key { bool flat_shade:1; unsigned nr_color_regions:5; bool replicate_alpha:1; - bool render_to_fbo:1; bool clamp_fragment_color:1; bool persample_interp:1; bool multisample_fbo:1; diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index d5841f38b2e..81a61c94880 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -257,16 +257,12 @@ brw_wm_debug_recompile(struct brw_context *brw, old_key->nr_color_regions, key->nr_color_regions); found |= key_debug(brw, "MRT alpha test or alpha-to-coverage", old_key->replicate_alpha, key->replicate_alpha); - found |= key_debug(brw, "rendering to FBO", - old_key->render_to_fbo, key->render_to_fbo); found |= key_debug(brw, "fragment color clamping", old_key->clamp_fragment_color, key->clamp_fragment_color); found |= key_debug(brw, "multisampled FBO", old_key->multisample_fbo, key->multisample_fbo); found |= key_debug(brw, "line smoothing", old_key->line_aa, key->line_aa); - found |= key_debug(brw, "renderbuffer height", - old_key->drawable_height, key->drawable_height); found |= key_debug(brw, "input slots valid", old_key->input_slots_valid, key->input_slots_valid); found |= key_debug(brw, "mrt alpha test function", @@ -410,7 +406,6 @@ brw_wm_populate_key(struct brw_context *brw, struct brw_wm_prog_key *key) const struct gl_program *prog = (struct gl_program *) brw->fragment_program; GLuint lookup = 0; GLuint line_aa; - bool program_uses_dfdy = fp->program.UsesDFdy; memset(key, 0, sizeof(*key)); @@ -488,36 +483,6 @@ brw_wm_populate_key(struct brw_context *brw, struct brw_wm_prog_key *key) &key->tex); /* _NEW_BUFFERS */ - /* - * Include the draw buffer origin and height so that we can calculate - * fragment position values relative to the bottom left of the drawable, - * from the incoming screen origin relative position we get as part of our - * payload. - * - * This is only needed for the WM_WPOSXY opcode when the fragment program - * uses the gl_FragCoord input. - * - * We could avoid recompiling by including this as a constant referenced by - * our program, but if we were to do that it would also be nice to handle - * getting that constant updated at batchbuffer submit time (when we - * hold the lock and know where the buffer really is) rather than at emit - * time when we don't hold the lock and are just guessing. We could also - * just avoid using this as key data if the program doesn't use - * fragment.position. - * - * For DRI2 the origin_x/y will always be (0,0) but we still need the - * drawable height in order to invert the Y axis. - */ - if (fp->program.Base.InputsRead & VARYING_BIT_POS) { - key->drawable_height = _mesa_geometric_height(ctx->DrawBuffer); - } - - if ((fp->program.Base.InputsRead & VARYING_BIT_POS) || - program_uses_dfdy || prog->nir->info.uses_interp_var_at_offset) { - key->render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); - } - - /* _NEW_BUFFERS */ key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers; /* _NEW_COLOR */ @@ -595,7 +560,6 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_fragment_program *fp = (struct gl_fragment_program *) prog; struct brw_fragment_program *bfp = brw_fragment_program(fp); - bool program_uses_dfdy = fp->UsesDFdy; memset(&key, 0, sizeof(key)); @@ -617,19 +581,10 @@ brw_fs_precompile(struct gl_context *ctx, brw_setup_tex_for_precompile(brw, &key.tex, &fp->Base); - if (fp->Base.InputsRead & VARYING_BIT_POS) { - key.drawable_height = ctx->DrawBuffer->Height; - } - key.nr_color_regions = _mesa_bitcount_64(fp->Base.OutputsWritten & ~(BITFIELD64_BIT(FRAG_RESULT_DEPTH) | BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK))); - if ((fp->Base.InputsRead & VARYING_BIT_POS) || program_uses_dfdy) { - key.render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer) || - key.nr_color_regions > 1; - } - key.program_string_id = bfp->id; uint32_t old_prog_offset = brw->wm.base.prog_offset; -- 2.11.0