[Mesa-dev] [PATCH 3/8] i965: Store the atoms directly in the context

Ian Romanick idr at freedesktop.org
Mon Dec 22 13:49:25 PST 2014


On 12/19/2014 06:20 PM, Jason Ekstrand wrote:
> I wrote basically this same patch when I was trying to speed up
> basically the same test.  Unfortunately, I wasn't able to get much of an
> improvement out of it.  Other than the one nit below,
> Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com
> <mailto:jason.ekstrand at intel.com>>
> 
> On Fri, Dec 19, 2014 at 2:20 PM, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
> 
>     From: Ian Romanick <ian.d.romanick at intel.com
>     <mailto:ian.d.romanick at intel.com>>
> 
>     Instead of having an extra pointer indirection in one of the hottest
>     loops in the driver.
> 
>     On Bay Trail-D using Fedora 20 compile flags (-m64 -O2 -mtune=generic
>     for 64-bit and -m32 -march=i686 -mtune=atom for 32-bit), affects
>     Gl32Batch7:
> 
>     32-bit: Difference at 95.0% confidence 1.98515% +/- 0.20814% (n=40)
>     64-bit: Difference at 95.0% confidence 1.5163% +/- 0.811016% (n=60)
> 
>     Signed-off-by: Ian Romanick <ian.d.romanick at intel.com
>     <mailto:ian.d.romanick at intel.com>>
>     ---
>      src/mesa/drivers/dri/i965/brw_context.h      |  2 +-
>      src/mesa/drivers/dri/i965/brw_state_upload.c | 19 ++++++++++++++++---
>      2 files changed, 17 insertions(+), 4 deletions(-)
> 
>     diff --git a/src/mesa/drivers/dri/i965/brw_context.h
>     b/src/mesa/drivers/dri/i965/brw_context.h
>     index 92eb022..5f5f807 100644
>     --- a/src/mesa/drivers/dri/i965/brw_context.h
>     +++ b/src/mesa/drivers/dri/i965/brw_context.h
>     @@ -1384,7 +1384,7 @@ struct brw_context
>         } perfmon;
> 
>         int num_atoms;
>     -   const struct brw_tracked_state **atoms;
>     +   const struct brw_tracked_state atoms[64];
> 
> 
> Maybe a #define?

Hmm... What I really wanted was to somehow use ARRAY_SIZE from the other
arrays.  Since the define would only be used in one place, I don't think
it's that helpful.

>         /* If (INTEL_DEBUG & DEBUG_BATCH) */
>         struct {
>     diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c
>     b/src/mesa/drivers/dri/i965/brw_state_upload.c
>     index a579781..9a5d49a 100644
>     --- a/src/mesa/drivers/dri/i965/brw_state_upload.c
>     +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
>     @@ -357,6 +357,11 @@ void brw_init_state( struct brw_context *brw )
>         const struct brw_tracked_state **atoms;
>         int num_atoms;
> 
>     +   STATIC_ASSERT(ARRAY_SIZE(gen4_atoms) <= ARRAY_SIZE(brw->atoms));
>     +   STATIC_ASSERT(ARRAY_SIZE(gen6_atoms) <= ARRAY_SIZE(brw->atoms));
>     +   STATIC_ASSERT(ARRAY_SIZE(gen7_atoms) <= ARRAY_SIZE(brw->atoms));
>     +   STATIC_ASSERT(ARRAY_SIZE(gen8_atoms) <= ARRAY_SIZE(brw->atoms));
>     +
>         brw_init_caches(brw);
> 
>         if (brw->gen >= 8) {
>     @@ -373,9 +378,17 @@ void brw_init_state( struct brw_context *brw )
>            num_atoms = ARRAY_SIZE(gen4_atoms);
>         }
> 
>     -   brw->atoms = atoms;
>         brw->num_atoms = num_atoms;
> 
>     +   /* This is to work around brw_context::atoms being declared
>     const.  We want
>     +    * it to be const, but it needs to be initialized somehow!
>     +    */
>     +   struct brw_tracked_state *context_atoms =
>     +      (struct brw_tracked_state *) &brw->atoms[0];
>     +
>     +   for (int i = 0; i < num_atoms; i++)
>     +      context_atoms[i] = *atoms[i];
>     +
>         while (num_atoms--) {
>            assert((*atoms)->dirty.mesa | (*atoms)->dirty.brw);
>            assert((*atoms)->emit);
>     @@ -607,7 +620,7 @@ void brw_upload_state(struct brw_context *brw)
>            prev = *state;
> 
>            for (i = 0; i < brw->num_atoms; i++) {
>     -        const struct brw_tracked_state *atom = brw->atoms[i];
>     +        const struct brw_tracked_state *atom = &brw->atoms[i];
>              struct brw_state_flags generated;
> 
>              if (check_state(state, &atom->dirty)) {
>     @@ -627,7 +640,7 @@ void brw_upload_state(struct brw_context *brw)
>         }
>         else {
>            for (i = 0; i < brw->num_atoms; i++) {
>     -        const struct brw_tracked_state *atom = brw->atoms[i];
>     +        const struct brw_tracked_state *atom = &brw->atoms[i];
> 
>              if (check_state(state, &atom->dirty)) {
>                 atom->emit(brw);
>     --
>     1.8.1.4
> 
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list