diff options
author | Timothy Arceri <[email protected]> | 2016-04-26 19:52:45 +1000 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2016-06-22 20:59:26 +1000 |
commit | 356ea9a8da45fe5f0fb5712ffb763130b96489f1 (patch) | |
tree | 84a6b16028fc6524b5f50976889780629f99e66b /src | |
parent | 3948cd37973696dc319170877382676809659465 (diff) |
i965: move vs outputs written into a helper
We will reuse this for fs key generation for the on disk shader
cache.
Reviewed-by: Iago Toral Quiroga <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.c | 74 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.h | 4 |
2 files changed, 47 insertions, 31 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index e9a1b6d148b..ec913f0e96c 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -43,6 +43,47 @@ #include "util/ralloc.h" +GLbitfield64 +brw_vs_outputs_written(struct brw_context *brw, struct brw_vs_prog_key *key, + GLbitfield64 user_varyings) +{ + GLbitfield64 outputs_written = user_varyings; + + if (key->copy_edgeflag) { + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_EDGE); + } + + if (brw->gen < 6) { + /* Put dummy slots into the VUE for the SF to put the replaced + * point sprite coords in. We shouldn't need these dummy slots, + * which take up precious URB space, but it would mean that the SF + * doesn't get nice aligned pairs of input coords into output + * coords, which would be a pain to handle. + */ + for (unsigned i = 0; i < 8; i++) { + if (key->point_coord_replace & (1 << i)) + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_TEX0 + i); + } + + /* if back colors are written, allocate slots for front colors too */ + if (outputs_written & BITFIELD64_BIT(VARYING_SLOT_BFC0)) + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL0); + if (outputs_written & BITFIELD64_BIT(VARYING_SLOT_BFC1)) + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL1); + } + + /* In order for legacy clipping to work, we need to populate the clip + * distance varying slots whenever clipping is enabled, even if the vertex + * shader doesn't write to gl_ClipDistance. + */ + if (key->nr_userclip_plane_consts > 0) { + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0); + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1); + } + + return outputs_written; +} + bool brw_codegen_vs_prog(struct brw_context *brw, struct gl_shader_program *prog, @@ -55,7 +96,6 @@ brw_codegen_vs_prog(struct brw_context *brw, struct brw_vs_prog_data prog_data; struct brw_stage_prog_data *stage_prog_data = &prog_data.base.base; void *mem_ctx; - int i; struct brw_shader *vs = NULL; bool start_busy = false; double start_time = 0; @@ -108,11 +148,11 @@ brw_codegen_vs_prog(struct brw_context *brw, &prog_data.base.base); } - GLbitfield64 outputs_written = vp->program.Base.OutputsWritten; + GLbitfield64 outputs_written = + brw_vs_outputs_written(brw, key, vp->program.Base.OutputsWritten); prog_data.inputs_read = vp->program.Base.InputsRead; if (key->copy_edgeflag) { - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_EDGE); prog_data.inputs_read |= VERT_BIT_EDGEFLAG; } @@ -120,34 +160,6 @@ brw_codegen_vs_prog(struct brw_context *brw, ((1 << vp->program.Base.CullDistanceArraySize) - 1) << vp->program.Base.ClipDistanceArraySize; - if (brw->gen < 6) { - /* Put dummy slots into the VUE for the SF to put the replaced - * point sprite coords in. We shouldn't need these dummy slots, - * which take up precious URB space, but it would mean that the SF - * doesn't get nice aligned pairs of input coords into output - * coords, which would be a pain to handle. - */ - for (i = 0; i < 8; i++) { - if (key->point_coord_replace & (1 << i)) - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_TEX0 + i); - } - - /* if back colors are written, allocate slots for front colors too */ - if (outputs_written & BITFIELD64_BIT(VARYING_SLOT_BFC0)) - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL0); - if (outputs_written & BITFIELD64_BIT(VARYING_SLOT_BFC1)) - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL1); - } - - /* In order for legacy clipping to work, we need to populate the clip - * distance varying slots whenever clipping is enabled, even if the vertex - * shader doesn't write to gl_ClipDistance. - */ - if (key->nr_userclip_plane_consts > 0) { - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0); - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1); - } - brw_compute_vue_map(brw->intelScreen->devinfo, &prog_data.base.vue_map, outputs_written, prog ? prog->SeparateShader || diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h index 7ccc1884b2e..b16e343ea45 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.h +++ b/src/mesa/drivers/dri/i965/brw_vs.h @@ -51,6 +51,10 @@ extern "C" { #endif +GLbitfield64 +brw_vs_outputs_written(struct brw_context *brw, struct brw_vs_prog_key *key, + GLbitfield64 outputs_written); + void brw_vs_debug_recompile(struct brw_context *brw, struct gl_shader_program *prog, const struct brw_vs_prog_key *key); |