[Mesa-dev] [PATCH] i965: Perform program state upload outside of atom handling

Kristian Høgsberg krh at bitplanet.net
Mon Feb 23 15:04:18 PST 2015


On Mon, Feb 23, 2015 at 1:23 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Monday, February 23, 2015 11:29:47 AM Carl Worth wrote:
>> Across the board of the various generations, the intial few atoms in
>> all of the atom lists are basically the same, (performing uploads for
>> the various programs). The only difference is that prior to gen6
>> there's an ff_gs upload in place of the later gs upload.
>>
>> In this commit, instead of using the atom lists for this program state
>> upload, we add a new function brw_upload_programs that calls into the
>> per-stage upload functions which in turn check dirty bits and return
>> immediately if nothing needs to be done.
>>
>> This commit is intended to have no functional change. The motivation
>> is that future code, (such as the shader cache), wants to have a
>> single function within which to perform various operations before and
>> after program upload, (with some local variables holding state across
>> the upload).
>>
>> It may be worth looking at whether some of the other functionality
>> currently handled via atoms might also be more cleanly handled in a
>> similar fashion.
>> ---
>>
>> In my second revision, I wrote:
>>
>> > I'm still not a huge fan of the resulting conditional expressions,
>> > (and the number of parentheses involved in them). It would not be too
>> > hard to imagine one of those getting edited incorrectly.
>>
>> Ken had the good idea to improve the readability/maintainability of
>> these conditions by adding a new brw_state_dirty function which
>> performs the masking and checks that the result is non-zero.
>>
>> So this third revision of the patch uses that approach.
>>
>>  src/mesa/drivers/dri/i965/brw_ff_gs.c        | 22 ++++++-------
>>  src/mesa/drivers/dri/i965/brw_ff_gs.h        |  3 ++
>>  src/mesa/drivers/dri/i965/brw_gs.c           | 24 ++++++---------
>>  src/mesa/drivers/dri/i965/brw_gs.h           |  5 +++
>>  src/mesa/drivers/dri/i965/brw_state.h        |  7 +++++
>>  src/mesa/drivers/dri/i965/brw_state_upload.c | 35 +++++++++++----------
>>  src/mesa/drivers/dri/i965/brw_vs.c           | 33 +++++++++-----------
>>  src/mesa/drivers/dri/i965/brw_vs.h           |  3 ++
>>  src/mesa/drivers/dri/i965/brw_wm.c           | 46 +++++++++++++---------------
>>  src/mesa/drivers/dri/i965/brw_wm.h           |  3 ++
>>  10 files changed, 97 insertions(+), 84 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.c b/src/mesa/drivers/dri/i965/brw_ff_gs.c
>> index 653c4b6..a5ef1ae 100644
>> --- a/src/mesa/drivers/dri/i965/brw_ff_gs.c
>> +++ b/src/mesa/drivers/dri/i965/brw_ff_gs.c
>> @@ -221,10 +221,20 @@ static void populate_key(struct brw_context *brw,
>>
>>  /* Calculate interpolants for triangle and line rasterization.
>>   */
>> -static void
>> +void
>>  brw_upload_ff_gs_prog(struct brw_context *brw)
>>  {
>>     struct brw_ff_gs_prog_key key;
>> +
>> +   if (! brw_state_dirty(brw,
>
>          ^^^ no space here
>
>> +                      (_NEW_LIGHT),
>
> I'm not really a fan of the extra parenthesis, and I recently removed
> them all from the brw_tracked_state_atoms...but I suppose it's a matter
> of taste.
>
>> +                      (BRW_NEW_PRIMITIVE |
>> +                       BRW_NEW_TRANSFORM_FEEDBACK |
>> +                       BRW_NEW_VS_PROG_DATA)))
>> +   {
>
> We don't generally put { on its own line - though, I do agree, that
> makes it a lot more readable here.
>
>> +      return;
>> +   }
>
> I would probably write this as:
>
> if (!brw_state_dirty(brw,
>                      _NEW_LIGHT,
>                      BRW_NEW_PRIMITIVE |
>                      BRW_NEW_TRANSFORM_FEEDBACK |
>                      BRW_NEW_VS_PROG_DATA))
>    return;
>
> but I suppose that's a matter of preference.  Same comments elsewhere.
>
>> +
>>     /* Populate the key:
>>      */
>>     populate_key(brw, &key);
> [snip]
>> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
>> index f195407..c25b0d5 100644
>> --- a/src/mesa/drivers/dri/i965/brw_state.h
>> +++ b/src/mesa/drivers/dri/i965/brw_state.h
>> @@ -152,6 +152,13 @@ extern const struct brw_tracked_state gen8_vertices;
>>  extern const struct brw_tracked_state gen8_vf_topology;
>>  extern const struct brw_tracked_state gen8_vs_state;
>>
>> +static inline bool
>> +brw_state_dirty(struct brw_context *brw, GLuint mesa_flags, uint64_t brw_flags)
>> +{
>> +     return (((brw->state.dirty.mesa & mesa_flags) |
>
> ^^^ return should have a 3-space indent.  There's also an extra set of
> parenthesis here.
>
>> +              (brw->state.dirty.brw & brw_flags)) != 0);
>
> Perhaps:
>
>    return ((brw->state.dirty.mesa & mesa_flags) |
>            (brw->state.dirty.brw & brw_flags)) != 0;
>
> FWIW, The bool return will also implicitly do != 0 for you (thanks to
> C99's stdbool.h), but it's also reasonable to leave it.
>
>> +}
>> +
>>  /* brw_misc_state.c */
>>  void brw_upload_invariant_state(struct brw_context *brw);
>>  uint32_t
>
> This looks good to me.  Thanks, Carl!
>
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

Ken already mentioned all the stylistic issues I saw, so I'll just add my

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>


More information about the mesa-dev mailing list