[Mesa-dev] [PATCH] st/mesa: use u_bit_scan64() on 64-bit CPUs

Jan Ziak 0xe2.0x9a.0x9b at gmail.com
Fri Oct 21 09:58:46 UTC 2016


st_validate_state() shows up in benchmarks. This patch makes it a little bit
faster in 64-bit mode.

Signed-off-by: Jan Ziak (http://atom-symbol.net) <0xe2.0x9a.0x9b at gmail.com>
---
 src/mesa/state_tracker/st_atom.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
index 94e012a..210f6f3 100644
--- a/src/mesa/state_tracker/st_atom.c
+++ b/src/mesa/state_tracker/st_atom.c
@@ -155,7 +155,6 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline )
 {
    struct gl_context *ctx = st->ctx;
    uint64_t dirty, pipeline_mask;
-   uint32_t dirty_lo, dirty_hi;
 
    /* Get Mesa driver state.
     *
@@ -200,17 +199,19 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline )
    if (!dirty)
       return;
 
-   dirty_lo = dirty;
-   dirty_hi = dirty >> 32;
-
-   /* Update states.
-    *
-    * Don't use u_bit_scan64, it may be slower on 32-bit.
-    */
-   while (dirty_lo)
-      atoms[u_bit_scan(&dirty_lo)]->update(st);
-   while (dirty_hi)
-      atoms[32 + u_bit_scan(&dirty_hi)]->update(st);
+   /* Update states. */
+   if (sizeof(void*) > 4) {
+      while (dirty)
+         atoms[u_bit_scan64(&dirty)]->update(st);
+   } else {
+      /* Don't use u_bit_scan64, it may be slower on 32-bit. */
+      uint32_t dirty_lo = dirty;
+      uint32_t dirty_hi = dirty >> 32;
+      while (dirty_lo)
+         atoms[u_bit_scan(&dirty_lo)]->update(st);
+      while (dirty_hi)
+         atoms[32 + u_bit_scan(&dirty_hi)]->update(st);
+   }
 
    /* Clear the render or compute state bits. */
    st->dirty &= ~pipeline_mask;


More information about the mesa-dev mailing list