[Mesa-dev] [PATCH 14/18] i965/wm/gen6: Refactor program offset setup

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue Apr 28 21:12:42 PDT 2015


On Tue, Apr 28, 2015 at 03:01:43PM -0700, Kenneth Graunke wrote:
> On Wednesday, April 22, 2015 11:47:34 PM Topi Pohjolainen wrote:
> > Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> > ---
> >  src/mesa/drivers/dri/i965/brw_state.h     |  8 +++++
> >  src/mesa/drivers/dri/i965/gen6_wm_state.c | 56 ++++++++++++++++++-------------
> >  2 files changed, 41 insertions(+), 23 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> > index 23f36c0..ca3274d 100644
> > --- a/src/mesa/drivers/dri/i965/brw_state.h
> > +++ b/src/mesa/drivers/dri/i965/brw_state.h
> > @@ -292,6 +292,14 @@ void brw_update_sampler_state(struct brw_context *brw,
> >                                uint32_t *sampler_state,
> >                                uint32_t batch_offset_for_sampler_state);
> >  
> > +/* gen6_wm_state.c */
> > +void
> > +gen6_wm_state_set_programs(const struct brw_wm_prog_data *prog_data,
> > +                           const struct brw_stage_state *stage_state,
> > +                           int min_inv_per_frag,
> > +                           uint32_t *ksp0, uint32_t *ksp2,
> > +                           uint32_t *dw4, uint32_t *dw5, uint32_t *dw6);
> > +
> >  /* gen6_sf_state.c */
> >  void
> >  calculate_attr_overrides(const struct brw_context *brw,
> > diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> > index 8e673a4..bc921e5 100644
> > --- a/src/mesa/drivers/dri/i965/gen6_wm_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> > @@ -65,6 +65,37 @@ const struct brw_tracked_state gen6_wm_push_constants = {
> >     .emit = gen6_upload_wm_push_constants,
> >  };
> >  
> > +void
> > +gen6_wm_state_set_programs(const struct brw_wm_prog_data *prog_data,
> > +                           const struct brw_stage_state *stage_state,
> > +                           int min_inv_per_frag,
> > +                           uint32_t *ksp0, uint32_t *ksp2,
> > +                           uint32_t *dw4, uint32_t *dw5, uint32_t *dw6)
> > +{
> > +   if (prog_data->prog_offset_16 || prog_data->no_8) {
> > +      *dw5 |= GEN6_WM_16_DISPATCH_ENABLE;
> > +
> > +      if (!prog_data->no_8 && min_inv_per_frag == 1) {
> > +         *dw5 |= GEN6_WM_8_DISPATCH_ENABLE;
> > +         *dw4 |= (prog_data->base.dispatch_grf_start_reg <<
> > +                  GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
> > +         *dw4 |= (prog_data->dispatch_grf_start_reg_16 <<
> > +                  GEN6_WM_DISPATCH_START_GRF_SHIFT_2);
> > +         *ksp0 = stage_state->prog_offset;
> > +         *ksp2 = stage_state->prog_offset + prog_data->prog_offset_16;
> > +      } else {
> > +         *dw4 |= (prog_data->dispatch_grf_start_reg_16 <<
> > +                  GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
> > +         *ksp0 = stage_state->prog_offset + prog_data->prog_offset_16;
> > +      }
> > +   } else {
> > +      *dw5 |= GEN6_WM_8_DISPATCH_ENABLE;
> > +      *dw4 |= (prog_data->base.dispatch_grf_start_reg <<
> > +               GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
> > +      *ksp0 = stage_state->prog_offset;
> > +   }
> > +}
> > +
> 
> This split feels awkward to me - the code to emit 3DSTATE_WM is now
> split across multiple functions...and it has 5 out parameters.  I really
> prefer keeping the code to fill out a packet's DWords together in one
> function.
> 
> Could we keep it in one function, but instead make upload_wm_state()
> take additional parameters, rather than poking at brw-> directly?
> 
> Sorry for the trouble...

I'll take another look. I can't remember all the details but I started that
way, it became ugly and so I decided to do this instead.


More information about the mesa-dev mailing list