Mesa (master): gallium/tgsi: Don' t declare temps individually when they are all similar.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Mon Jul 2 11:24:41 UTC 2012


Module: Mesa
Branch: master
Commit: f5c41e16d7b09e7c342bff8ec5888db88c071be3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f5c41e16d7b09e7c342bff8ec5888db88c071be3

Author: José Fonseca <jfonseca at vmware.com>
Date:   Fri Jun 29 21:18:24 2012 +0100

gallium/tgsi: Don't declare temps individually when they are all similar.

tgsi_ureg was recently enhanced to support local temporaries, and as result
temps are declared individually.

This change avoids many TEMP register declarations on common shaders.

(And fixes performance regression due to mismatches against performance
sensitive shaders.)

Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/auxiliary/tgsi/tgsi_ureg.c |   27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index e427585..3fe78e0 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -1534,9 +1534,18 @@ static void emit_decls( struct ureg_program *ureg )
       }
    }
 
-   for (i = 0; i < ureg->nr_temps; i++) {
-      emit_decl( ureg, TGSI_FILE_TEMPORARY, i,
-                 util_bitmask_get(ureg->local_temps, i) );
+   if (ureg->nr_temps) {
+      if (util_bitmask_get_first_index(ureg->local_temps) ==  UTIL_BITMASK_INVALID_INDEX) {
+         emit_decl_range( ureg,
+                          TGSI_FILE_TEMPORARY,
+                          0, ureg->nr_temps );
+
+      } else {
+         for (i = 0; i < ureg->nr_temps; i++) {
+            emit_decl( ureg, TGSI_FILE_TEMPORARY, i,
+                       util_bitmask_get(ureg->local_temps, i) );
+         }
+      }
    }
 
    if (ureg->nr_addrs) {
@@ -1687,7 +1696,7 @@ struct ureg_program *ureg_create( unsigned processor )
 {
    struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
    if (ureg == NULL)
-      return NULL;
+      goto no_ureg;
 
    ureg->processor = processor;
    ureg->property_gs_input_prim = ~0;
@@ -1696,17 +1705,19 @@ struct ureg_program *ureg_create( unsigned processor )
 
    ureg->free_temps = util_bitmask_create();
    if (ureg->free_temps == NULL)
-      goto fail;
+      goto no_free_temps;
 
    ureg->local_temps = util_bitmask_create();
    if (ureg->local_temps == NULL)
-      goto fail;
+      goto no_local_temps;
 
    return ureg;
 
-fail:
-   FREE(ureg->free_temps);
+no_local_temps:
+   util_bitmask_destroy(ureg->free_temps);
+no_free_temps:
    FREE(ureg);
+no_ureg:
    return NULL;
 }
 




More information about the mesa-commit mailing list