On 30 June 2012 11:50, Olivier Galibert <galibert at pobox.com> wrote: > At that point, all interpolation piglit tests involving fixed clipping > work as long as there's no noperspective. > > Signed-off-by: Olivier Galibert <galibert at pobox.com> > --- > src/mesa/drivers/dri/i965/brw_clip.c | 10 ++++- > src/mesa/drivers/dri/i965/brw_clip.h | 6 +-- > src/mesa/drivers/dri/i965/brw_clip_line.c | 6 +-- > src/mesa/drivers/dri/i965/brw_clip_tri.c | 20 ++++----- > src/mesa/drivers/dri/i965/brw_clip_unfilled.c | 2 +- > src/mesa/drivers/dri/i965/brw_clip_util.c | 56 > +++++++------------------ > 6 files changed, 41 insertions(+), 59 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_clip.c > b/src/mesa/drivers/dri/i965/brw_clip.c > index 52e8c47..952eb4a 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip.c > +++ b/src/mesa/drivers/dri/i965/brw_clip.c > @@ -215,7 +215,7 @@ brw_upload_clip_prog(struct brw_context *brw) > struct intel_context *intel = &brw->intel; > struct gl_context *ctx = &intel->ctx; > struct brw_clip_prog_key key; > - > + int i; > memset(&key, 0, sizeof(key)); > > brw_lookup_interpolation(brw); > @@ -227,7 +227,13 @@ brw_upload_clip_prog(struct brw_context *brw) > /* CACHE_NEW_VS_PROG (also part of VUE map) */ > key.attrs = brw->vs.prog_data->outputs_written; > /* _NEW_LIGHT */ > - key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT); > + key.has_flat_shading = 0; > + for (i = 0; i < BRW_VERT_RESULT_MAX; i++) { > + if (brw_get_interpolation_mode(brw, i) == INTERP_QUALIFIER_FLAT) { > + key.has_flat_shading = 1; > + break; > + } > + } > key.pv_first = (ctx->Light.ProvokingVertex == > GL_FIRST_VERTEX_CONVENTION); > brw_copy_interpolation_modes(brw, key.interpolation_mode); > /* _NEW_TRANSFORM (also part of VUE map)*/ > diff --git a/src/mesa/drivers/dri/i965/brw_clip.h > b/src/mesa/drivers/dri/i965/brw_clip.h > index 6f811ae..0ea0394 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip.h > +++ b/src/mesa/drivers/dri/i965/brw_clip.h > @@ -46,7 +46,7 @@ struct brw_clip_prog_key { > GLbitfield64 interpolation_mode[2]; /* copy of the main context */ > GLuint primitive:4; > GLuint nr_userclip:4; > - GLuint do_flat_shading:1; > + GLuint has_flat_shading:1; > GLuint pv_first:1; > GLuint do_unfilled:1; > GLuint fill_cw:2; /* includes cull information */ > @@ -166,8 +166,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 ); > > diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c > b/src/mesa/drivers/dri/i965/brw_clip_line.c > index 6cf2bd2..729d8c0 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_line.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_line.c > @@ -271,11 +271,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->key.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); > diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c > b/src/mesa/drivers/dri/i965/brw_clip_tri.c > index a29f8e0..71225f5 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c > @@ -187,8 +187,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); > { > @@ -200,19 +200,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); > @@ -606,8 +606,8 @@ 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) > - brw_clip_tri_flat_shade(c); > + if (c->key.has_flat_shading) > + brw_clip_tri_flat_shade(c); > > if ((c->key.clip_mode == BRW_CLIPMODE_NORMAL) || > (c->key.clip_mode == BRW_CLIPMODE_KERNEL_CLIP)) > diff --git a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > index 03c7d42..96f9a84 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > @@ -502,7 +502,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->key.has_flat_shading) > brw_clip_tri_flat_shade(c); > > brw_clip_init_clipmask(c); > diff --git a/src/mesa/drivers/dri/i965/brw_clip_util.c > b/src/mesa/drivers/dri/i965/brw_clip_util.c > index bf8cc3a..7b0205a 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_util.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_util.c > @@ -165,7 +165,7 @@ void brw_clip_interp_vertex( struct brw_clip_compile > *c, > vert_result == VERT_RESULT_CLIP_DIST1) { > /* PSIZ doesn't need interpolation because it isn't used by the > * fragment shader. CLIP_DIST0 and CLIP_DIST1 don't need > - * intepolation because on pre-GEN6, these are just placeholder > VUE > + * interpolation because on pre-GEN6, these are just placeholder > VUE > Heh. Thanks for fixing my typo :) > * slots that don't perform any action. > */ > } else if (vert_result < VERT_RESULT_MAX) { > @@ -291,49 +291,25 @@ 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, > - GLuint to, GLuint from ) > +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_vert_result(c, VERT_RESULT_COL0)) > - brw_MOV(p, > - byte_offset(c->reg.vertex[to], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_COL0)), > - byte_offset(c->reg.vertex[from], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_COL0))); > - > - if (brw_clip_have_vert_result(c, VERT_RESULT_COL1)) > - brw_MOV(p, > - byte_offset(c->reg.vertex[to], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_COL1)), > - byte_offset(c->reg.vertex[from], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_COL1))); > - > - if (brw_clip_have_vert_result(c, VERT_RESULT_BFC0)) > - brw_MOV(p, > - byte_offset(c->reg.vertex[to], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_BFC0)), > - byte_offset(c->reg.vertex[from], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_BFC0))); > - > - if (brw_clip_have_vert_result(c, VERT_RESULT_BFC1)) > - brw_MOV(p, > - byte_offset(c->reg.vertex[to], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_BFC1)), > - byte_offset(c->reg.vertex[from], > - brw_vert_result_to_offset(&c->vue_map, > - VERT_RESULT_BFC1))); > + struct brw_context *brw = p->brw; > + GLuint i; > + > + for (i = 0; i < BRW_VERT_RESULT_MAX; i++) { > + if (brw_get_interpolation_mode(brw, 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))); > + } > + } > } > Ah, a loop! This is so much better. Thanks. > > > -- > 1.7.10.rc3.1.gb306 > > _______________________________________________ > mesa-dev mailing list > mesa-dev at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > This patch is: Reviewed-by: Paul Berry <stereotype441 at gmail.com> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20120717/70f74d4c/attachment.html>