diff options
author | Paul Berry <[email protected]> | 2013-09-02 13:46:25 -0700 |
---|---|---|
committer | Paul Berry <[email protected]> | 2013-09-16 12:53:36 -0700 |
commit | d1ad447f0187f5e6044fec65ace6ce1e10b156c2 (patch) | |
tree | be6ab12abb48a4eaa97b33c629bb58299bc90288 /src/mesa | |
parent | 3a83b20dcccf21ec184e35bcfa9bc577379dfd51 (diff) |
i965/gen6+: Remove VUE map dependency on userclip_active.
Previously, on Gen6+, we laid out the vertex (or geometry) shader VUE
map differently depending whether user clipping was active. If it was
active, we put the clip distances in slots 2 and 3 (where the clipper
expects them); if it was inactive, we assigned them in the order of
the gl_varying_slot enum.
This made for unnecessary recompiles, since turning clipping on/off
for a shader that used gl_ClipDistance might rearrange the varyings.
It also required extra bookkeeping, since it required the user
clipping flag to be provided to brw_compute_vue_map() as a parameter.
With this patch, we always put clip distances at in slots 2 and 3 if
they are written to. do_vs_prog() and do_gs_prog() are responsible
for ensuring that clip distances are written to when user clipping is
enabled (as do_vs_prog() previously did for gen4-5).
This makes the only input to brw_compute_vue_map() a bitfield of which
varyings the shader writes to, a fact that we'll take advantage of in
forthcoming patches.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_gs.c | 15 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.c | 26 |
3 files changed, 26 insertions, 17 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 040a8d30613..9d41529edb7 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -436,7 +436,7 @@ static inline GLuint brw_varying_to_offset(struct brw_vue_map *vue_map, } void brw_compute_vue_map(struct brw_context *brw, struct brw_vue_map *vue_map, - GLbitfield64 slots_valid, bool userclip_active); + GLbitfield64 slots_valid); /** diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c b/src/mesa/drivers/dri/i965/brw_vec4_gs.c index f67ae2baada..2d1d163bad1 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c @@ -94,9 +94,18 @@ do_gs_prog(struct brw_context *brw, c.prog_data.control_data_header_size_hwords = ALIGN(c.control_data_header_size_bits, 256) / 256; - brw_compute_vue_map(brw, &c.prog_data.base.vue_map, - gp->program.Base.OutputsWritten, - c.key.base.userclip_active); + GLbitfield64 outputs_written = gp->program.Base.OutputsWritten; + + /* 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 (c.key.base.userclip_active) { + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0); + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1); + } + + brw_compute_vue_map(brw, &c.prog_data.base.vue_map, outputs_written); /* Compute the output vertex size. * diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index 7c7493f9632..d5909a5f35d 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -52,14 +52,10 @@ static inline void assign_vue_slot(struct brw_vue_map *vue_map, /** * Compute the VUE map for vertex shader program. - * - * Note that consumers of this map using cache keys must include - * prog_data->userclip and prog_data->outputs_written in their key - * (generated by CACHE_NEW_VS_PROG). */ void brw_compute_vue_map(struct brw_context *brw, struct brw_vue_map *vue_map, - GLbitfield64 slots_valid, bool userclip_active) + GLbitfield64 slots_valid) { vue_map->slots_valid = slots_valid; int i; @@ -112,10 +108,11 @@ brw_compute_vue_map(struct brw_context *brw, struct brw_vue_map *vue_map, */ assign_vue_slot(vue_map, VARYING_SLOT_PSIZ); assign_vue_slot(vue_map, VARYING_SLOT_POS); - if (userclip_active) { + if (slots_valid & BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0)) assign_vue_slot(vue_map, VARYING_SLOT_CLIP_DIST0); + if (slots_valid & BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1)) assign_vue_slot(vue_map, VARYING_SLOT_CLIP_DIST1); - } + /* front and back colors need to be consecutive so that we can use * ATTRIBUTE_SWIZZLE_INPUTATTR_FACING to swizzle them when doing * two-sided color. @@ -272,15 +269,18 @@ do_vs_prog(struct brw_context *brw, outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL0); if (outputs_written & BITFIELD64_BIT(VARYING_SLOT_BFC1)) outputs_written |= BITFIELD64_BIT(VARYING_SLOT_COL1); + } - if (c.key.base.userclip_active) { - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0); - outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1); - } + /* 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 (c.key.base.userclip_active) { + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0); + outputs_written |= BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1); } - brw_compute_vue_map(brw, &prog_data.base.vue_map, outputs_written, - c.key.base.userclip_active); + brw_compute_vue_map(brw, &prog_data.base.vue_map, outputs_written); if (0) { _mesa_fprint_program_opt(stdout, &c.vp->program.Base, PROG_PRINT_DEBUG, |