Re: [Mesa-dev] [PATCH 1/2] i965: Combine 3DSTATE_STREAMOUT emitters and genX_sol_state atoms.
On Wednesday, June 22, 2016 5:21:34 PM PDT Jason Ekstrand wrote: > On Wed, Jun 22, 2016 at 4:26 PM, Kenneth Graunke> wrote: > > > They're basically the same. Let's avoid the code duplication. > > > > Signed-off-by: Kenneth Graunke > > --- > > src/mesa/drivers/dri/i965/brw_state.h| 2 +- > > src/mesa/drivers/dri/i965/brw_state_upload.c | 2 +- > > src/mesa/drivers/dri/i965/gen7_sol_state.c | 32 -- > > src/mesa/drivers/dri/i965/gen8_sol_state.c | 90 > > +--- > > 4 files changed, 31 insertions(+), 95 deletions(-) > > > > diff --git a/src/mesa/drivers/dri/i965/brw_state.h > > b/src/mesa/drivers/dri/i965/brw_state.h > > index b29412e..a16e876 100644 > > --- a/src/mesa/drivers/dri/i965/brw_state.h > > +++ b/src/mesa/drivers/dri/i965/brw_state.h > > @@ -166,7 +166,6 @@ extern const struct brw_tracked_state gen8_wm_state; > > extern const struct brw_tracked_state gen8_raster_state; > > extern const struct brw_tracked_state gen8_sbe_state; > > extern const struct brw_tracked_state gen8_sf_state; > > -extern const struct brw_tracked_state gen8_sol_state; > > extern const struct brw_tracked_state gen8_sf_clip_viewport; > > extern const struct brw_tracked_state gen8_vertices; > > extern const struct brw_tracked_state gen8_vf_topology; > > @@ -303,6 +302,7 @@ void gen8_upload_ps_extra(struct brw_context *brw, > > /* gen7_sol_state.c */ > > void gen7_upload_3dstate_so_decl_list(struct brw_context *brw, > >const struct brw_vue_map *vue_map); > > +void gen8_upload_3dstate_so_buffers(struct brw_context *brw); > > > > /* gen8_surface_state.c */ > > > > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > > b/src/mesa/drivers/dri/i965/brw_state_upload.c > > index 0b47ebe..4a20821 100644 > > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > > @@ -337,7 +337,7 @@ static const struct brw_tracked_state > > *gen8_render_atoms[] = > > _te_state, > > _ds_state, > > _gs_state, > > - _sol_state, > > + _sol_state, > > _clip_state, > > _raster_state, > > _sbe_state, > > diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c > > b/src/mesa/drivers/dri/i965/gen7_sol_state.c > > index 4749cc8..8fcc591 100644 > > --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c > > +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c > > @@ -222,7 +222,9 @@ upload_3dstate_streamout(struct brw_context *brw, bool > > active, > > /* BRW_NEW_TRANSFORM_FEEDBACK */ > > struct gl_transform_feedback_object *xfb_obj = > >ctx->TransformFeedback.CurrentObject; > > - uint32_t dw1 = 0, dw2 = 0; > > + const struct gl_transform_feedback_info *linked_xfb_info = > > + _obj->shader_program->LinkedTransformFeedback; > > + uint32_t dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0; > > int i; > > > > if (active) { > > > > In here (not visible) gen7 sets a bunch of enable bits that don't exist on > gen8. That should be inside of an "if (brw->gen <= 7)" guard. D'oh...thanks. Fixed locally. signature.asc Description: This is a digitally signed message part. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 1/2] i965: Combine 3DSTATE_STREAMOUT emitters and genX_sol_state atoms.
On Wed, Jun 22, 2016 at 4:26 PM, Kenneth Graunkewrote: > They're basically the same. Let's avoid the code duplication. > > Signed-off-by: Kenneth Graunke > --- > src/mesa/drivers/dri/i965/brw_state.h| 2 +- > src/mesa/drivers/dri/i965/brw_state_upload.c | 2 +- > src/mesa/drivers/dri/i965/gen7_sol_state.c | 32 -- > src/mesa/drivers/dri/i965/gen8_sol_state.c | 90 > +--- > 4 files changed, 31 insertions(+), 95 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_state.h > b/src/mesa/drivers/dri/i965/brw_state.h > index b29412e..a16e876 100644 > --- a/src/mesa/drivers/dri/i965/brw_state.h > +++ b/src/mesa/drivers/dri/i965/brw_state.h > @@ -166,7 +166,6 @@ extern const struct brw_tracked_state gen8_wm_state; > extern const struct brw_tracked_state gen8_raster_state; > extern const struct brw_tracked_state gen8_sbe_state; > extern const struct brw_tracked_state gen8_sf_state; > -extern const struct brw_tracked_state gen8_sol_state; > extern const struct brw_tracked_state gen8_sf_clip_viewport; > extern const struct brw_tracked_state gen8_vertices; > extern const struct brw_tracked_state gen8_vf_topology; > @@ -303,6 +302,7 @@ void gen8_upload_ps_extra(struct brw_context *brw, > /* gen7_sol_state.c */ > void gen7_upload_3dstate_so_decl_list(struct brw_context *brw, >const struct brw_vue_map *vue_map); > +void gen8_upload_3dstate_so_buffers(struct brw_context *brw); > > /* gen8_surface_state.c */ > > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > b/src/mesa/drivers/dri/i965/brw_state_upload.c > index 0b47ebe..4a20821 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > @@ -337,7 +337,7 @@ static const struct brw_tracked_state > *gen8_render_atoms[] = > _te_state, > _ds_state, > _gs_state, > - _sol_state, > + _sol_state, > _clip_state, > _raster_state, > _sbe_state, > diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c > b/src/mesa/drivers/dri/i965/gen7_sol_state.c > index 4749cc8..8fcc591 100644 > --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c > +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c > @@ -222,7 +222,9 @@ upload_3dstate_streamout(struct brw_context *brw, bool > active, > /* BRW_NEW_TRANSFORM_FEEDBACK */ > struct gl_transform_feedback_object *xfb_obj = >ctx->TransformFeedback.CurrentObject; > - uint32_t dw1 = 0, dw2 = 0; > + const struct gl_transform_feedback_info *linked_xfb_info = > + _obj->shader_program->LinkedTransformFeedback; > + uint32_t dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0; > int i; > > if (active) { > In here (not visible) gen7 sets a bunch of enable bits that don't exist on gen8. That should be inside of an "if (brw->gen <= 7)" guard. > @@ -258,12 +260,30 @@ upload_3dstate_streamout(struct brw_context *brw, > bool active, > >dw2 |= SET_FIELD(urb_entry_read_offset, > SO_STREAM_3_VERTEX_READ_OFFSET); >dw2 |= SET_FIELD(urb_entry_read_length - 1, > SO_STREAM_3_VERTEX_READ_LENGTH); > + > + if (brw->gen >= 8) { > +/* Set buffer pitches; 0 means unbound. */ > +if (xfb_obj->Buffers[0]) > + dw3 |= linked_xfb_info->Buffers[0].Stride * 4; > +if (xfb_obj->Buffers[1]) > + dw3 |= (linked_xfb_info->Buffers[1].Stride * 4) << 16; > +if (xfb_obj->Buffers[2]) > + dw4 |= linked_xfb_info->Buffers[2].Stride * 4; > +if (xfb_obj->Buffers[3]) > + dw4 |= (linked_xfb_info->Buffers[3].Stride * 4) << 16; > + } > } > > - BEGIN_BATCH(3); > - OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (3 - 2)); > + const int dwords = brw->gen >= 8 ? 5 : 3; > + > + BEGIN_BATCH(dwords); > + OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (dwords - 2)); > OUT_BATCH(dw1); > OUT_BATCH(dw2); > + if (dwords > 3) { > + OUT_BATCH(dw3); > + OUT_BATCH(dw4); > + } > ADVANCE_BATCH(); > } > > @@ -275,7 +295,11 @@ upload_sol_state(struct brw_context *brw) > bool active = _mesa_is_xfb_active_and_unpaused(ctx); > > if (active) { > - upload_3dstate_so_buffers(brw); > + if (brw->gen >= 8) > + gen8_upload_3dstate_so_buffers(brw); > + else > + upload_3dstate_so_buffers(brw); > + >/* BRW_NEW_VUE_MAP_GEOM_OUT */ >gen7_upload_3dstate_so_decl_list(brw, >vue_map_geom_out); > } > diff --git a/src/mesa/drivers/dri/i965/gen8_sol_state.c > b/src/mesa/drivers/dri/i965/gen8_sol_state.c > index a72f5e1..21cc129 100644 > --- a/src/mesa/drivers/dri/i965/gen8_sol_state.c > +++ b/src/mesa/drivers/dri/i965/gen8_sol_state.c > @@ -35,7 +35,7 @@ > #include "intel_buffer_objects.h" > #include "main/transformfeedback.h" > > -static void > +void > gen8_upload_3dstate_so_buffers(struct brw_context *brw) > { > struct gl_context *ctx = >ctx; > @@ -93,91 +93,3 @@
[Mesa-dev] [PATCH 1/2] i965: Combine 3DSTATE_STREAMOUT emitters and genX_sol_state atoms.
They're basically the same. Let's avoid the code duplication. Signed-off-by: Kenneth Graunke--- src/mesa/drivers/dri/i965/brw_state.h| 2 +- src/mesa/drivers/dri/i965/brw_state_upload.c | 2 +- src/mesa/drivers/dri/i965/gen7_sol_state.c | 32 -- src/mesa/drivers/dri/i965/gen8_sol_state.c | 90 +--- 4 files changed, 31 insertions(+), 95 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index b29412e..a16e876 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -166,7 +166,6 @@ extern const struct brw_tracked_state gen8_wm_state; extern const struct brw_tracked_state gen8_raster_state; extern const struct brw_tracked_state gen8_sbe_state; extern const struct brw_tracked_state gen8_sf_state; -extern const struct brw_tracked_state gen8_sol_state; extern const struct brw_tracked_state gen8_sf_clip_viewport; extern const struct brw_tracked_state gen8_vertices; extern const struct brw_tracked_state gen8_vf_topology; @@ -303,6 +302,7 @@ void gen8_upload_ps_extra(struct brw_context *brw, /* gen7_sol_state.c */ void gen7_upload_3dstate_so_decl_list(struct brw_context *brw, const struct brw_vue_map *vue_map); +void gen8_upload_3dstate_so_buffers(struct brw_context *brw); /* gen8_surface_state.c */ diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 0b47ebe..4a20821 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -337,7 +337,7 @@ static const struct brw_tracked_state *gen8_render_atoms[] = _te_state, _ds_state, _gs_state, - _sol_state, + _sol_state, _clip_state, _raster_state, _sbe_state, diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c b/src/mesa/drivers/dri/i965/gen7_sol_state.c index 4749cc8..8fcc591 100644 --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c @@ -222,7 +222,9 @@ upload_3dstate_streamout(struct brw_context *brw, bool active, /* BRW_NEW_TRANSFORM_FEEDBACK */ struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; - uint32_t dw1 = 0, dw2 = 0; + const struct gl_transform_feedback_info *linked_xfb_info = + _obj->shader_program->LinkedTransformFeedback; + uint32_t dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0; int i; if (active) { @@ -258,12 +260,30 @@ upload_3dstate_streamout(struct brw_context *brw, bool active, dw2 |= SET_FIELD(urb_entry_read_offset, SO_STREAM_3_VERTEX_READ_OFFSET); dw2 |= SET_FIELD(urb_entry_read_length - 1, SO_STREAM_3_VERTEX_READ_LENGTH); + + if (brw->gen >= 8) { +/* Set buffer pitches; 0 means unbound. */ +if (xfb_obj->Buffers[0]) + dw3 |= linked_xfb_info->Buffers[0].Stride * 4; +if (xfb_obj->Buffers[1]) + dw3 |= (linked_xfb_info->Buffers[1].Stride * 4) << 16; +if (xfb_obj->Buffers[2]) + dw4 |= linked_xfb_info->Buffers[2].Stride * 4; +if (xfb_obj->Buffers[3]) + dw4 |= (linked_xfb_info->Buffers[3].Stride * 4) << 16; + } } - BEGIN_BATCH(3); - OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (3 - 2)); + const int dwords = brw->gen >= 8 ? 5 : 3; + + BEGIN_BATCH(dwords); + OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (dwords - 2)); OUT_BATCH(dw1); OUT_BATCH(dw2); + if (dwords > 3) { + OUT_BATCH(dw3); + OUT_BATCH(dw4); + } ADVANCE_BATCH(); } @@ -275,7 +295,11 @@ upload_sol_state(struct brw_context *brw) bool active = _mesa_is_xfb_active_and_unpaused(ctx); if (active) { - upload_3dstate_so_buffers(brw); + if (brw->gen >= 8) + gen8_upload_3dstate_so_buffers(brw); + else + upload_3dstate_so_buffers(brw); + /* BRW_NEW_VUE_MAP_GEOM_OUT */ gen7_upload_3dstate_so_decl_list(brw, >vue_map_geom_out); } diff --git a/src/mesa/drivers/dri/i965/gen8_sol_state.c b/src/mesa/drivers/dri/i965/gen8_sol_state.c index a72f5e1..21cc129 100644 --- a/src/mesa/drivers/dri/i965/gen8_sol_state.c +++ b/src/mesa/drivers/dri/i965/gen8_sol_state.c @@ -35,7 +35,7 @@ #include "intel_buffer_objects.h" #include "main/transformfeedback.h" -static void +void gen8_upload_3dstate_so_buffers(struct brw_context *brw) { struct gl_context *ctx = >ctx; @@ -93,91 +93,3 @@ gen8_upload_3dstate_so_buffers(struct brw_context *brw) } brw_obj->zero_offsets = false; } - -static void -gen8_upload_3dstate_streamout(struct brw_context *brw, bool active, - struct brw_vue_map *vue_map) -{ - struct gl_context *ctx = >ctx; - - /* BRW_NEW_TRANSFORM_FEEDBACK */ - struct gl_transform_feedback_object *xfb_obj = - ctx->TransformFeedback.CurrentObject; - const struct gl_transform_feedback_info *linked_xfb_info = -