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.ekstr...@intel.com>
On Fri, Dec 19, 2014 at 2:20 PM, Ian Romanick <i...@freedesktop.org> wrote: > > From: Ian Romanick <ian.d.roman...@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.roman...@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? > > /* 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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev