[Mesa-dev] [PATCH 3/8] i965: Store the atoms directly in the context
Ian Romanick
idr at freedesktop.org
Fri Dec 19 14:20:54 PST 2014
From: Ian Romanick <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>
---
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];
/* 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
More information about the mesa-dev
mailing list