[Mesa-dev] [PATCH 00/10] i965/state: Merge cache and brw flags.

Kenneth Graunke kenneth at whitecape.org
Mon Dec 1 22:18:59 PST 2014


On Tuesday, November 25, 2014 09:25:35 AM Kristian Høgsberg wrote:
> On Tue, Nov 25, 2014 at 4:43 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> > Hello,
> >
> > This series does some longstanding cleaning I've been meaning to do
> > in the i965 state upload code.  The distinction between BRW_NEW_* and
> > CACHE_NEW_* flags has been pretty arbitrary for a while - 10/17 of
> > them were for things we stopped caching years ago.  So, I moved
> > those to be BRW_NEW_* bits, and combined a bunch of redundant ones
> > while I was at it.
> >
> > Patches 1-6 move non-cache-related things out of .cache, along with
> > other tidying.  This actually could save up to 160 bytes of memory
> > per context (on 64-bit), because cache types have auxiliary compare
> > and free function pointers...which weren't used at all for these.
> > (I haven't actually measured this - just eliminated the fields).
> >
> > Patches 7-10 take it a step further, and kill off the "cache" bitset
> > altogether.  A while back, I was looking at callgrind graphs for Glamor,
> > trying to reduce brw_state_upload costs.  One of the places where I saw
> > cycles being wasted was in check_state(), which sees if each atom needs
> > to be emitted.  Eliminating "cache" should eliminate 1/4 of the cycles
> > spent there, and every little bit helps.
> >
> > I also like the new names - BRW_NEW_VERTEX_PROGRAM vs CACHE_NEW_VS_PROG
> > was always confusing - which is which, and why should I use one or the
> > other?  BRW_NEW_VS_PROG_DATA is clearly tied to brw_vs_prog_data.
> 
> Wow, nice, I like everything about this series.  One of the most
> confusing things about the state mechanism in mesa is the .cache
> stuff, which certainly comes down to most of the items not being
> cached.

Awesome, thanks!

> Also, BRW_NEW_PROG_DATA is a better name, but it doesn't as
> clearly suggest that the kernel start pointer (prog_offset) also
> changes.  BRW_NEW_VS_BINARY, perhaps?  The one comment I have is
> regarding this:

Yeah...that aspect of the new name isn't great.  I think it's unlikely to
cause problems, though - only the atoms which emit 3DSTATE_VS/GS/PS/HS/DS need
to care about prog_offset, and those also have a ton of prog_data dependencies.

The thing I liked about BRW_NEW_*_PROG_DATA vs. BRW_NEW_*_PROGRAM is that
they're fairly distinct sounding, and the name is clearly associated with the
prog_data structure.  So, when other atoms need to access prog_data, it's
obvious which bit to listen to (and we've gotten that backwards frequently).

To me, BRW_NEW_VS_BINARY and BRW_NEW_VERTEX_PROGRAM sound too similar, and I
suspect I'd have to ask "which one is which?" again.  I took a quick poll
around the office and people seemed to like BRW_NEW_*_PROG_DATA.

So, I think I'll stick with these names for now, but if you feel strongly
about it, we can always rename it again :)

> + * BRW_NEW_*_PROG_DATA does not occur quite as often, and is a strict subset.
> + * Multiple shader programs may have identical vertex shaders (for example),
> + * or compile down to the same code in the backend.  We combine those into
> + * a single program cache entry.  BRW_NEW_*_PROG_DATA occurs when switching
> + * program cache entries, which covers the brw_*_prog_data structures, and
> + * brw->*.prog_offset.
> 
> Isn't the main cause of BRW_NEW_*_PROG_DATA going to be switching to a
> different kernel/prog_data combination because of non-orthogonal state
> changes?

Oh man - thanks for pointing that out.  That is indeed the primary cause
(beyond actually binding a different program), and that makes it *not* a strict
subset of BRW_NEW_*_PROGRAM.  The only thing worse than a lack of comments is
comments that are wrong, and also point at the quux of the problem :)

Here's the revised one:

/**
 * BRW_NEW_*_PROG_DATA and BRW_NEW_*_PROGRAM are similar, but distinct.
 *
 * BRW_NEW_*_PROGRAM relates to the gl_shader_program/gl_program structures.
 * When the currently bound shader program differs from the previous draw
 * call, these will be flagged.  They cover brw->{stage}_program and
 * ctx->{Stage}Program->_Current.
 *
 * BRW_NEW_*_PROG_DATA is flagged when the effective shaders change, from a
 * driver perspective.  Even if the same shader is bound at the API level,
 * we may need to switch between multiple versions of that shader to handle
 * changes in non-orthagonal state.
 *
 * Additionally, multiple shader programs may have identical vertex shaders
 * (for example), or compile down to the same code in the backend.  We combine
 * those into a single program cache entry.
 *
 * BRW_NEW_*_PROG_DATA occurs when switching program cache entries, which
 * covers the brw_*_prog_data structures, and brw->*.prog_offset.
 */

> For the series, enthusiastically
> 
> Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

Thanks again!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141201/a0fca4ca/attachment.sig>


More information about the mesa-dev mailing list