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 <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -272,10 +272,6 @@ populate_wm_prog_key(const struct brw_device_info *devinfo,
|
|||||||
/* XXX Vulkan doesn't appear to specify */
|
/* XXX Vulkan doesn't appear to specify */
|
||||||
key->clamp_fragment_color = false;
|
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) {
|
if (extra && extra->color_attachment_count >= 0) {
|
||||||
key->nr_color_regions = extra->color_attachment_count;
|
key->nr_color_regions = extra->color_attachment_count;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -244,7 +244,6 @@ struct brw_wm_prog_key {
|
|||||||
bool flat_shade:1;
|
bool flat_shade:1;
|
||||||
unsigned nr_color_regions:5;
|
unsigned nr_color_regions:5;
|
||||||
bool replicate_alpha:1;
|
bool replicate_alpha:1;
|
||||||
bool render_to_fbo:1;
|
|
||||||
bool clamp_fragment_color:1;
|
bool clamp_fragment_color:1;
|
||||||
bool persample_interp:1;
|
bool persample_interp:1;
|
||||||
bool multisample_fbo:1;
|
bool multisample_fbo:1;
|
||||||
|
@@ -257,16 +257,12 @@ brw_wm_debug_recompile(struct brw_context *brw,
|
|||||||
old_key->nr_color_regions, key->nr_color_regions);
|
old_key->nr_color_regions, key->nr_color_regions);
|
||||||
found |= key_debug(brw, "MRT alpha test or alpha-to-coverage",
|
found |= key_debug(brw, "MRT alpha test or alpha-to-coverage",
|
||||||
old_key->replicate_alpha, key->replicate_alpha);
|
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",
|
found |= key_debug(brw, "fragment color clamping",
|
||||||
old_key->clamp_fragment_color, key->clamp_fragment_color);
|
old_key->clamp_fragment_color, key->clamp_fragment_color);
|
||||||
found |= key_debug(brw, "multisampled FBO",
|
found |= key_debug(brw, "multisampled FBO",
|
||||||
old_key->multisample_fbo, key->multisample_fbo);
|
old_key->multisample_fbo, key->multisample_fbo);
|
||||||
found |= key_debug(brw, "line smoothing",
|
found |= key_debug(brw, "line smoothing",
|
||||||
old_key->line_aa, key->line_aa);
|
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",
|
found |= key_debug(brw, "input slots valid",
|
||||||
old_key->input_slots_valid, key->input_slots_valid);
|
old_key->input_slots_valid, key->input_slots_valid);
|
||||||
found |= key_debug(brw, "mrt alpha test function",
|
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;
|
const struct gl_program *prog = (struct gl_program *) brw->fragment_program;
|
||||||
GLuint lookup = 0;
|
GLuint lookup = 0;
|
||||||
GLuint line_aa;
|
GLuint line_aa;
|
||||||
bool program_uses_dfdy = fp->program.UsesDFdy;
|
|
||||||
|
|
||||||
memset(key, 0, sizeof(*key));
|
memset(key, 0, sizeof(*key));
|
||||||
|
|
||||||
@@ -487,36 +482,6 @@ brw_wm_populate_key(struct brw_context *brw, struct brw_wm_prog_key *key)
|
|||||||
brw_populate_sampler_prog_key_data(ctx, prog, brw->wm.base.sampler_count,
|
brw_populate_sampler_prog_key_data(ctx, prog, brw->wm.base.sampler_count,
|
||||||
&key->tex);
|
&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 */
|
/* _NEW_BUFFERS */
|
||||||
key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
|
key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
|
||||||
|
|
||||||
@@ -595,7 +560,6 @@ brw_fs_precompile(struct gl_context *ctx,
|
|||||||
|
|
||||||
struct gl_fragment_program *fp = (struct gl_fragment_program *) prog;
|
struct gl_fragment_program *fp = (struct gl_fragment_program *) prog;
|
||||||
struct brw_fragment_program *bfp = brw_fragment_program(fp);
|
struct brw_fragment_program *bfp = brw_fragment_program(fp);
|
||||||
bool program_uses_dfdy = fp->UsesDFdy;
|
|
||||||
|
|
||||||
memset(&key, 0, sizeof(key));
|
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);
|
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 &
|
key.nr_color_regions = _mesa_bitcount_64(fp->Base.OutputsWritten &
|
||||||
~(BITFIELD64_BIT(FRAG_RESULT_DEPTH) |
|
~(BITFIELD64_BIT(FRAG_RESULT_DEPTH) |
|
||||||
BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)));
|
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;
|
key.program_string_id = bfp->id;
|
||||||
|
|
||||||
uint32_t old_prog_offset = brw->wm.base.prog_offset;
|
uint32_t old_prog_offset = brw->wm.base.prog_offset;
|
||||||
|
Reference in New Issue
Block a user