On 20 May 2013 15:54, Kenneth Graunke <kenn...@whitecape.org> wrote: > Most of the work in BeginTransformFeedback is only necessary on Gen6. > We may as well just skip it on Gen7+. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Cc: Eric Anholt <e...@anholt.net> > Cc: Paul Berry <stereotype...@gmail.com> > --- > src/mesa/drivers/dri/i965/brw_context.c | 8 +++--- > src/mesa/drivers/dri/i965/brw_context.h | 3 +++ > src/mesa/drivers/dri/i965/gen6_sol.c | 41 > +++++++++++------------------- > src/mesa/drivers/dri/i965/gen7_sol_state.c | 17 +++++++++++++ > 4 files changed, 40 insertions(+), 29 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_context.c > b/src/mesa/drivers/dri/i965/brw_context.c > index 405580f..56c42ba 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.c > +++ b/src/mesa/drivers/dri/i965/brw_context.c > @@ -94,12 +94,14 @@ static void brwInitDriverFunctions(struct intel_screen > *screen, > gen4_init_queryobj_functions(functions); > > functions->QuerySamplesForFormat = brw_query_samples_for_format; > - functions->BeginTransformFeedback = brw_begin_transform_feedback; > > - if (screen->gen >= 7) > + if (screen->gen >= 7) { > + functions->BeginTransformFeedback = gen7_begin_transform_feedback; > functions->EndTransformFeedback = gen7_end_transform_feedback; > - else > + } else { > + functions->BeginTransformFeedback = brw_begin_transform_feedback; > functions->EndTransformFeedback = brw_end_transform_feedback; > + } > > if (screen->gen >= 6) > functions->GetSamplePosition = gen6_get_sample_position; > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index be49078..60b713d 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -1228,6 +1228,9 @@ brw_end_transform_feedback(struct gl_context *ctx, > > /* gen7_sol_state.c */ > void > +gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode, > + struct gl_transform_feedback_object *obj); > +void > gen7_end_transform_feedback(struct gl_context *ctx, > struct gl_transform_feedback_object *obj); > > diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c > b/src/mesa/drivers/dri/i965/gen6_sol.c > index cdd6e74..8e197a1 100644 > --- a/src/mesa/drivers/dri/i965/gen6_sol.c > +++ b/src/mesa/drivers/dri/i965/gen6_sol.c > @@ -152,36 +152,25 @@ brw_begin_transform_feedback(struct gl_context *ctx, > GLenum mode, > = _mesa_compute_max_transform_feedback_vertices(xfb_obj, > linked_xfb_info); > > - if (intel->gen == 6) { >
Can we replace this with "assert(intel->gen == 6)" just to document that this is a Gen6-only function now? With that change, the series is: Reviewed-by: Paul Berry <stereotype...@gmail.com> > - /* Initialize the SVBI 0 register to zero and set the maximum > index. */ > + /* Initialize the SVBI 0 register to zero and set the maximum index. */ > + BEGIN_BATCH(4); > + OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); > + OUT_BATCH(0); /* SVBI 0 */ > + OUT_BATCH(0); /* starting index */ > + OUT_BATCH(max_index); > + ADVANCE_BATCH(); > + > + /* Initialize the rest of the unused streams to sane values. > Otherwise, > + * they may indicate that there is no room to write data and prevent > + * anything from happening at all. > + */ > + for (int i = 1; i < 4; i++) { > BEGIN_BATCH(4); > OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); > - OUT_BATCH(0); /* SVBI 0 */ > + OUT_BATCH(i << SVB_INDEX_SHIFT); > OUT_BATCH(0); /* starting index */ > - OUT_BATCH(max_index); > + OUT_BATCH(0xffffffff); > ADVANCE_BATCH(); > - > - /* Initialize the rest of the unused streams to sane values. > Otherwise, > - * they may indicate that there is no room to write data and prevent > - * anything from happening at all. > - */ > - for (int i = 1; i < 4; i++) { > - BEGIN_BATCH(4); > - OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); > - OUT_BATCH(i << SVB_INDEX_SHIFT); > - OUT_BATCH(0); /* starting index */ > - OUT_BATCH(0xffffffff); > - ADVANCE_BATCH(); > - } > - } else if (intel->gen >= 7) { > - /* Reset the SOL buffer offset register. */ > - for (int i = 0; i < 4; i++) { > - BEGIN_BATCH(3); > - OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2)); > - OUT_BATCH(GEN7_SO_WRITE_OFFSET(i)); > - OUT_BATCH(0); > - ADVANCE_BATCH(); > - } > } > } > > diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c > b/src/mesa/drivers/dri/i965/gen7_sol_state.c > index 2c4b7f9..8dfac01 100644 > --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c > +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c > @@ -254,6 +254,23 @@ const struct brw_tracked_state gen7_sol_state = { > }; > > void > +gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode, > + struct gl_transform_feedback_object *obj) > +{ > + struct brw_context *brw = brw_context(ctx); > + struct intel_context *intel = &brw->intel; > + > + /* Reset the SOL buffer offset register. */ > + for (int i = 0; i < 4; i++) { > + BEGIN_BATCH(3); > + OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2)); > + OUT_BATCH(GEN7_SO_WRITE_OFFSET(i)); > + OUT_BATCH(0); > + ADVANCE_BATCH(); > + } > +} > + > +void > gen7_end_transform_feedback(struct gl_context *ctx, > struct gl_transform_feedback_object *obj) > { > -- > 1.8.2.3 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev