Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
On Thu, Aug 14, 2014 at 4:11 AM, Iago Toral Quiroga <ito...@igalia.com> wrote: > From: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > This is needed to support user-provided geometry shaders, since the > brw_ff_gs_prog atom in gen6 only takes care of implementing transform feedback > for vertex shaders. > > If there is no user-provided geometry shader the implementation falls back to > the original code. > > Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > --- > src/mesa/drivers/dri/i965/brw_gs.c | 4 ++++ > src/mesa/drivers/dri/i965/brw_gs.h | 1 + > src/mesa/drivers/dri/i965/brw_state_upload.c | 2 +- > src/mesa/drivers/dri/i965/brw_vec4_gs.c | 11 ++++++++++- > 4 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_gs.c > b/src/mesa/drivers/dri/i965/brw_gs.c > index fbd728f..c0c4c13 100644 > --- a/src/mesa/drivers/dri/i965/brw_gs.c > +++ b/src/mesa/drivers/dri/i965/brw_gs.c > @@ -243,6 +243,10 @@ brw_upload_ff_gs_prog(struct brw_context *brw) > } > } > > +void gen6_brw_upload_ff_gs_prog(struct brw_context *brw) > +{ > + brw_upload_ff_gs_prog(brw); > +} > > const struct brw_tracked_state brw_ff_gs_prog = { > .dirty = { > diff --git a/src/mesa/drivers/dri/i965/brw_gs.h > b/src/mesa/drivers/dri/i965/brw_gs.h > index f8f430c..a538948 100644 > --- a/src/mesa/drivers/dri/i965/brw_gs.h > +++ b/src/mesa/drivers/dri/i965/brw_gs.h > @@ -110,5 +110,6 @@ void brw_ff_gs_lines(struct brw_ff_gs_compile *c); > void gen6_sol_program(struct brw_ff_gs_compile *c, > struct brw_ff_gs_prog_key *key, > unsigned num_verts, bool check_edge_flag); > +void gen6_brw_upload_ff_gs_prog(struct brw_context *brw); > > #endif > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > b/src/mesa/drivers/dri/i965/brw_state_upload.c > index 3a452c3..086956d 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > @@ -108,7 +108,7 @@ static const struct brw_tracked_state *gen4_atoms[] = > static const struct brw_tracked_state *gen6_atoms[] = > { > &brw_vs_prog, /* must do before state base address */ > - &brw_ff_gs_prog, /* must do before state base address */ > + &brw_gs_prog, /* must do before state base address */ > &brw_wm_prog, /* must do before state base address */ > > &gen6_clip_vp, > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c > b/src/mesa/drivers/dri/i965/brw_vec4_gs.c > index 6428291..2d9e8c2 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c > +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c > @@ -31,6 +31,7 @@ > #include "brw_context.h" > #include "brw_vec4_gs_visitor.h" > #include "brw_state.h" > +#include "brw_gs.h" > > > static bool > @@ -270,6 +271,12 @@ brw_upload_gs_prog(struct brw_context *brw) > (struct brw_geometry_program *) brw->geometry_program; > > if (gp == NULL) { > + if (brw->gen == 6) { > + if (brw->state.dirty.brw & BRW_NEW_TRANSFORM_FEEDBACK) > + gen6_brw_upload_ff_gs_prog(brw); > + return; > + } > + > /* No geometry shader. Vertex data just passes straight through. */ > if (brw->state.dirty.brw & BRW_NEW_VUE_MAP_VS) { > brw->vue_map_geom_out = brw->vue_map_vs; > @@ -325,7 +332,9 @@ brw_upload_gs_prog(struct brw_context *brw) > const struct brw_tracked_state brw_gs_prog = { > .dirty = { > .mesa = (_NEW_LIGHT | _NEW_BUFFERS | _NEW_TEXTURE), > - .brw = BRW_NEW_GEOMETRY_PROGRAM | BRW_NEW_VUE_MAP_VS, > + .brw = (BRW_NEW_GEOMETRY_PROGRAM | > + BRW_NEW_VUE_MAP_VS | > + BRW_NEW_TRANSFORM_FEEDBACK), > }, > .emit = brw_upload_gs_prog > }; > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev