<div dir="ltr"><div>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,<br></div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 19, 2014 at 2:20 PM, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
<br>
Instead of having an extra pointer indirection in one of the hottest<br>
loops in the driver.<br>
<br>
On Bay Trail-D using Fedora 20 compile flags (-m64 -O2 -mtune=generic<br>
for 64-bit and -m32 -march=i686 -mtune=atom for 32-bit), affects<br>
Gl32Batch7:<br>
<br>
32-bit: Difference at 95.0% confidence 1.98515% +/- 0.20814% (n=40)<br>
64-bit: Difference at 95.0% confidence 1.5163% +/- 0.811016% (n=60)<br>
<br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_context.h      |  2 +-<br>
 src/mesa/drivers/dri/i965/brw_state_upload.c | 19 ++++++++++++++++---<br>
 2 files changed, 17 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h<br>
index 92eb022..5f5f807 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_context.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_context.h<br>
@@ -1384,7 +1384,7 @@ struct brw_context<br>
    } perfmon;<br>
<br>
    int num_atoms;<br>
-   const struct brw_tracked_state **atoms;<br>
+   const struct brw_tracked_state atoms[64];<br></blockquote><div><br></div><div>Maybe a #define?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
    /* If (INTEL_DEBUG & DEBUG_BATCH) */<br>
    struct {<br>
diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c<br>
index a579781..9a5d49a 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c<br>
@@ -357,6 +357,11 @@ void brw_init_state( struct brw_context *brw )<br>
    const struct brw_tracked_state **atoms;<br>
    int num_atoms;<br>
<br>
+   STATIC_ASSERT(ARRAY_SIZE(gen4_atoms) <= ARRAY_SIZE(brw->atoms));<br>
+   STATIC_ASSERT(ARRAY_SIZE(gen6_atoms) <= ARRAY_SIZE(brw->atoms));<br>
+   STATIC_ASSERT(ARRAY_SIZE(gen7_atoms) <= ARRAY_SIZE(brw->atoms));<br>
+   STATIC_ASSERT(ARRAY_SIZE(gen8_atoms) <= ARRAY_SIZE(brw->atoms));<br>
+<br>
    brw_init_caches(brw);<br>
<br>
    if (brw->gen >= 8) {<br>
@@ -373,9 +378,17 @@ void brw_init_state( struct brw_context *brw )<br>
       num_atoms = ARRAY_SIZE(gen4_atoms);<br>
    }<br>
<br>
-   brw->atoms = atoms;<br>
    brw->num_atoms = num_atoms;<br>
<br>
+   /* This is to work around brw_context::atoms being declared const.  We want<br>
+    * it to be const, but it needs to be initialized somehow!<br>
+    */<br>
+   struct brw_tracked_state *context_atoms =<br>
+      (struct brw_tracked_state *) &brw->atoms[0];<br>
+<br>
+   for (int i = 0; i < num_atoms; i++)<br>
+      context_atoms[i] = *atoms[i];<br>
+<br>
    while (num_atoms--) {<br>
       assert((*atoms)->dirty.mesa | (*atoms)->dirty.brw);<br>
       assert((*atoms)->emit);<br>
@@ -607,7 +620,7 @@ void brw_upload_state(struct brw_context *brw)<br>
       prev = *state;<br>
<br>
       for (i = 0; i < brw->num_atoms; i++) {<br>
-        const struct brw_tracked_state *atom = brw->atoms[i];<br>
+        const struct brw_tracked_state *atom = &brw->atoms[i];<br>
         struct brw_state_flags generated;<br>
<br>
         if (check_state(state, &atom->dirty)) {<br>
@@ -627,7 +640,7 @@ void brw_upload_state(struct brw_context *brw)<br>
    }<br>
    else {<br>
       for (i = 0; i < brw->num_atoms; i++) {<br>
-        const struct brw_tracked_state *atom = brw->atoms[i];<br>
+        const struct brw_tracked_state *atom = &brw->atoms[i];<br>
<br>
         if (check_state(state, &atom->dirty)) {<br>
            atom->emit(brw);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.1.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div></div></div></div></div>