i965: Store the atoms directly in the context
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) v2 (Ken): Cut size of array from 64 to 57 to save memory. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
6ed53c27ef
commit
14aadbe827
|
@ -1383,7 +1383,7 @@ struct brw_context
|
|||
} perfmon;
|
||||
|
||||
int num_atoms;
|
||||
const struct brw_tracked_state **atoms;
|
||||
const struct brw_tracked_state atoms[57];
|
||||
|
||||
/* If (INTEL_DEBUG & DEBUG_BATCH) */
|
||||
struct {
|
||||
|
|
|
@ -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);
|
||||
|
@ -609,7 +622,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)) {
|
||||
|
@ -629,7 +642,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);
|
||||
|
|
Loading…
Reference in New Issue