i965 Gen4/5: clip: correctly handle flat varyings
Previously we only gave special treatment to the builtin color varyings. This patch adds support for arbitrary flat-shaded varyings, which is required for GLSL 1.30. Based on Olivier Galibert's patch from last year: http://lists.freedesktop.org/archives/mesa-dev/2012-July/024340.html V5: Move key.do_flat_shading to brw_clip_compile.has_flat_shading V6: Real bools. [V1-2]: Signed-off-by: Olivier Galibert <galibert at pobox.com> Signed-off-by: Chris Forbes <chrisf@ijw.co.nz> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -70,6 +70,9 @@ static void compile_clip_prog( struct brw_context *brw,
|
||||
c.key = *key;
|
||||
c.vue_map = brw->vue_map_geom_out;
|
||||
|
||||
c.has_flat_shading =
|
||||
brw_any_flat_varyings(&key->interpolation_mode);
|
||||
|
||||
/* nr_regs is the number of registers filled by reading data from the VUE.
|
||||
* This program accesses the entire VUE, so nr_regs needs to be the size of
|
||||
* the VUE (measured in pairs, since two slots are stored in each
|
||||
@@ -149,8 +152,8 @@ brw_upload_clip_prog(struct brw_context *brw)
|
||||
key.primitive = brw->reduced_primitive;
|
||||
/* BRW_NEW_VUE_MAP_GEOM_OUT */
|
||||
key.attrs = brw->vue_map_geom_out.slots_valid;
|
||||
|
||||
/* _NEW_LIGHT */
|
||||
key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT);
|
||||
key.pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION);
|
||||
/* _NEW_TRANSFORM (also part of VUE map)*/
|
||||
key.nr_userclip = _mesa_bitcount_64(ctx->Transform.ClipPlanesEnabled);
|
||||
|
||||
@@ -46,7 +46,6 @@ struct brw_clip_prog_key {
|
||||
struct interpolation_mode_map interpolation_mode;
|
||||
GLuint primitive:4;
|
||||
GLuint nr_userclip:4;
|
||||
GLuint do_flat_shading:1;
|
||||
GLuint pv_first:1;
|
||||
GLuint do_unfilled:1;
|
||||
GLuint fill_cw:2; /* includes cull information */
|
||||
@@ -121,6 +120,8 @@ struct brw_clip_compile {
|
||||
bool need_direction;
|
||||
|
||||
struct brw_vue_map vue_map;
|
||||
|
||||
bool has_flat_shading;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -173,8 +174,8 @@ void brw_clip_kill_thread(struct brw_clip_compile *c);
|
||||
struct brw_reg brw_clip_plane_stride( struct brw_clip_compile *c );
|
||||
struct brw_reg brw_clip_plane0_address( struct brw_clip_compile *c );
|
||||
|
||||
void brw_clip_copy_colors( struct brw_clip_compile *c,
|
||||
GLuint to, GLuint from );
|
||||
void brw_clip_copy_flatshaded_attributes( struct brw_clip_compile *c,
|
||||
GLuint to, GLuint from );
|
||||
|
||||
void brw_clip_init_clipmask( struct brw_clip_compile *c );
|
||||
|
||||
|
||||
@@ -272,11 +272,11 @@ void brw_emit_line_clip( struct brw_clip_compile *c )
|
||||
brw_clip_line_alloc_regs(c);
|
||||
brw_clip_init_ff_sync(c);
|
||||
|
||||
if (c->key.do_flat_shading) {
|
||||
if (c->has_flat_shading) {
|
||||
if (c->key.pv_first)
|
||||
brw_clip_copy_colors(c, 1, 0);
|
||||
brw_clip_copy_flatshaded_attributes(c, 1, 0);
|
||||
else
|
||||
brw_clip_copy_colors(c, 0, 1);
|
||||
brw_clip_copy_flatshaded_attributes(c, 0, 1);
|
||||
}
|
||||
|
||||
clip_and_emit_line(c);
|
||||
|
||||
@@ -190,8 +190,8 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c )
|
||||
|
||||
brw_IF(p, BRW_EXECUTE_1);
|
||||
{
|
||||
brw_clip_copy_colors(c, 1, 0);
|
||||
brw_clip_copy_colors(c, 2, 0);
|
||||
brw_clip_copy_flatshaded_attributes(c, 1, 0);
|
||||
brw_clip_copy_flatshaded_attributes(c, 2, 0);
|
||||
}
|
||||
brw_ELSE(p);
|
||||
{
|
||||
@@ -203,19 +203,19 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c )
|
||||
brw_imm_ud(_3DPRIM_TRIFAN));
|
||||
brw_IF(p, BRW_EXECUTE_1);
|
||||
{
|
||||
brw_clip_copy_colors(c, 0, 1);
|
||||
brw_clip_copy_colors(c, 2, 1);
|
||||
brw_clip_copy_flatshaded_attributes(c, 0, 1);
|
||||
brw_clip_copy_flatshaded_attributes(c, 2, 1);
|
||||
}
|
||||
brw_ELSE(p);
|
||||
{
|
||||
brw_clip_copy_colors(c, 1, 0);
|
||||
brw_clip_copy_colors(c, 2, 0);
|
||||
brw_clip_copy_flatshaded_attributes(c, 1, 0);
|
||||
brw_clip_copy_flatshaded_attributes(c, 2, 0);
|
||||
}
|
||||
brw_ENDIF(p);
|
||||
}
|
||||
else {
|
||||
brw_clip_copy_colors(c, 0, 2);
|
||||
brw_clip_copy_colors(c, 1, 2);
|
||||
brw_clip_copy_flatshaded_attributes(c, 0, 2);
|
||||
brw_clip_copy_flatshaded_attributes(c, 1, 2);
|
||||
}
|
||||
}
|
||||
brw_ENDIF(p);
|
||||
@@ -645,7 +645,7 @@ void brw_emit_tri_clip( struct brw_clip_compile *c )
|
||||
* flatshading, need to apply the flatshade here because we don't
|
||||
* respect the PV when converting to trifan for emit:
|
||||
*/
|
||||
if (c->key.do_flat_shading)
|
||||
if (c->has_flat_shading)
|
||||
brw_clip_tri_flat_shade(c);
|
||||
|
||||
if ((c->key.clip_mode == BRW_CLIPMODE_NORMAL) ||
|
||||
|
||||
@@ -501,7 +501,7 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c )
|
||||
|
||||
/* Need to do this whether we clip or not:
|
||||
*/
|
||||
if (c->key.do_flat_shading)
|
||||
if (c->has_flat_shading)
|
||||
brw_clip_tri_flat_shade(c);
|
||||
|
||||
brw_clip_init_clipmask(c);
|
||||
|
||||
@@ -290,49 +290,21 @@ struct brw_reg brw_clip_plane_stride( struct brw_clip_compile *c )
|
||||
}
|
||||
|
||||
|
||||
/* If flatshading, distribute color from provoking vertex prior to
|
||||
/* Distribute flatshaded attributes from provoking vertex prior to
|
||||
* clipping.
|
||||
*/
|
||||
void brw_clip_copy_colors( struct brw_clip_compile *c,
|
||||
void brw_clip_copy_flatshaded_attributes( struct brw_clip_compile *c,
|
||||
GLuint to, GLuint from )
|
||||
{
|
||||
struct brw_compile *p = &c->func;
|
||||
|
||||
if (brw_clip_have_varying(c, VARYING_SLOT_COL0))
|
||||
brw_MOV(p,
|
||||
byte_offset(c->reg.vertex[to],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_COL0)),
|
||||
byte_offset(c->reg.vertex[from],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_COL0)));
|
||||
|
||||
if (brw_clip_have_varying(c, VARYING_SLOT_COL1))
|
||||
brw_MOV(p,
|
||||
byte_offset(c->reg.vertex[to],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_COL1)),
|
||||
byte_offset(c->reg.vertex[from],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_COL1)));
|
||||
|
||||
if (brw_clip_have_varying(c, VARYING_SLOT_BFC0))
|
||||
brw_MOV(p,
|
||||
byte_offset(c->reg.vertex[to],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_BFC0)),
|
||||
byte_offset(c->reg.vertex[from],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_BFC0)));
|
||||
|
||||
if (brw_clip_have_varying(c, VARYING_SLOT_BFC1))
|
||||
brw_MOV(p,
|
||||
byte_offset(c->reg.vertex[to],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_BFC1)),
|
||||
byte_offset(c->reg.vertex[from],
|
||||
brw_varying_to_offset(&c->vue_map,
|
||||
VARYING_SLOT_BFC1)));
|
||||
for (int i = 0; i < c->vue_map.num_slots; i++) {
|
||||
if (c->key.interpolation_mode.mode[i] == INTERP_QUALIFIER_FLAT) {
|
||||
brw_MOV(p,
|
||||
byte_offset(c->reg.vertex[to], brw_vue_slot_to_offset(i)),
|
||||
byte_offset(c->reg.vertex[from], brw_vue_slot_to_offset(i)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user