aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.c27
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 e427585db19..3fe78e0b7f0 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;
}