Clean-up of var/temp allocation function parameters.
authorBrian <brian@nostromo.localnet.net>
Sun, 28 Jan 2007 03:29:33 +0000 (20:29 -0700)
committerBrian <brian@nostromo.localnet.net>
Sun, 28 Jan 2007 03:29:33 +0000 (20:29 -0700)
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_ir.h
src/mesa/shader/slang/slang_vartable.c
src/mesa/shader/slang/slang_vartable.h

index c3167e36fb3690c629d9a7961377467533d7b4dc..568b40997db17aeb8b2618cbdb52127ee9ae1a67 100644 (file)
@@ -335,15 +335,11 @@ slang_print_ir(const slang_ir_node *n, int indent)
 static void
 alloc_temp_storage(slang_var_table *vt, slang_ir_node *n, GLint size)
 {
-   GLint indx;
-   GLuint swizzle;
    assert(!n->Var);
    assert(!n->Store);
    assert(size > 0);
-   indx = _slang_alloc_temp(vt, size, &swizzle);
-   n->Store = _slang_new_ir_storage(PROGRAM_TEMPORARY, indx, size);
-   if (n->Store)
-      n->Store->Swizzle = swizzle;
+   n->Store = _slang_new_ir_storage(PROGRAM_TEMPORARY, -1, size);
+   (void) _slang_alloc_temp(vt, n->Store);
 }
 
 
@@ -355,8 +351,8 @@ static void
 free_temp_storage(slang_var_table *vt, slang_ir_node *n)
 {
    if (n->Store->File == PROGRAM_TEMPORARY && n->Store->Index >= 0) {
-      if (_slang_is_temp(vt, n->Store->Index, n->Store->Swizzle)) {
-         _slang_free_temp(vt, n->Store->Index, n->Store->Size, n->Store->Swizzle);
+      if (_slang_is_temp(vt, n->Store)) {
+         _slang_free_temp(vt, n->Store);
          /* XXX free(store)? */
          n->Store->Index = -1;
          n->Store->Size = -1;
@@ -814,15 +810,12 @@ emit_move(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog)
    emit(vt, n->Children[0], prog);
 
 #if PEEPHOLE_OPTIMIZATIONS
-   if (inst && _slang_is_temp(vt, n->Children[1]->Store->Index,
-                              n->Children[1]->Store->Swizzle)) {
+   if (inst && _slang_is_temp(vt, n->Children[1]->Store)) {
       /* Peephole optimization:
        * Just modify the RHS to put its result into the dest of this
        * MOVE operation.  Then, this MOVE is a no-op.
        */
-      _slang_free_temp(vt, n->Children[1]->Store->Index,
-                       n->Children[1]->Store->Size,
-                       n->Children[1]->Store->Swizzle);
+      _slang_free_temp(vt, n->Children[1]->Store);
       *n->Children[1]->Store = *n->Children[0]->Store;
       /* fixup the prev (RHS) instruction */
       assert(n->Children[0]->Store->Index >= 0);
@@ -899,8 +892,7 @@ emit_cond(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog)
       inst->CondUpdate = GL_TRUE;
       storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask);
       storage_to_src_reg(&inst->SrcReg[0], n->Children[0]->Store);
-      _slang_free_temp(vt, n->Store->Index, n->Store->Size,
-                       n->Store->Swizzle);
+      _slang_free_temp(vt, n->Store);
       inst->Comment = _mesa_strdup("COND expr");
       return inst; /* XXX or null? */
    }
@@ -940,16 +932,12 @@ emit(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog)
       assert(n->Store->Index < 0);
       if (!n->Var || n->Var->isTemp) {
          /* a nameless/temporary variable, will be freed after first use */
-         GLuint swizzle;
-         n->Store->Index = _slang_alloc_temp(vt, n->Store->Size, &swizzle);
-         n->Store->Swizzle = swizzle;
+         (void) _slang_alloc_temp(vt, n->Store);
       }
       else {
          /* a regular variable */
-         GLuint swizzle;
          _slang_add_variable(vt, n->Var);
-         n->Store->Index = _slang_alloc_var(vt, n->Store->Size, &swizzle);
-         n->Store->Swizzle = swizzle;
+         (void) _slang_alloc_var(vt, n->Store);
          /*
          printf("IR_VAR_DECL %s %d store %p\n",
                 (char*) n->Var->a_name, n->Store->Index, (void*) n->Store);
index e5a0fa8eb5fda351c58b4da5b1e2b6bcf5656dc0..24ed8e0dc61eca6ffdb18e2a0be6dfef7e679ddb 100644 (file)
@@ -102,13 +102,15 @@ typedef enum
 /**
  * Describes where data storage is allocated.
  */
-typedef struct
+struct _slang_ir_storage
 {
    enum register_file File;  /**< PROGRAM_TEMPORARY, PROGRAM_INPUT, etc */
    GLint Index;  /**< -1 means unallocated */
    GLint Size;  /**< number of floats */
    GLuint Swizzle;
-} slang_ir_storage;
+};
+
+typedef struct _slang_ir_storage slang_ir_storage;
 
 
 /**
index cadefda1bcaa56f44027c5ad89cfcef74c83c35f..0271455428200a6efa37363f41b8050167effeed 100644 (file)
@@ -24,8 +24,8 @@ struct slang_var_table_
    int num_entries;
    slang_variable **vars;  /* array [num_entries] */
 
-   TempState temps[MAX_PROGRAM_TEMPS * 4];
-   int size[MAX_PROGRAM_TEMPS];
+   TempState temps[MAX_PROGRAM_TEMPS * 4];  /* per-component state */
+   int size[MAX_PROGRAM_TEMPS];     /* For debug only */
 
    struct slang_var_table_ *parent;
 };
@@ -94,7 +94,7 @@ _slang_pop_var_table(slang_var_table *t)
        * were for temps
        */
       for (i = 0; i < MAX_PROGRAM_TEMPS * 4; i++) {
-         if (t->temps[i] && !t->parent->temps[i]) {
+         if (t->temps[i] != FREE && t->parent->temps[i] == FREE) {
             if (dbg) printf("  Free reg %d\n", i/4);
             assert(t->temps[i] == TEMP);
          }
@@ -160,7 +160,7 @@ alloc_reg(slang_var_table *t, GLint size, GLboolean isTemp)
    for (i = 0; i < MAX_PROGRAM_TEMPS - size; i += step) {
       GLuint found = 0;
       for (j = 0; j < size; j++) {
-         if (i + j < MAX_PROGRAM_TEMPS && !t->temps[i + j]) {
+         if (i + j < MAX_PROGRAM_TEMPS && t->temps[i + j] == FREE) {
             found++;
          }
          else {
@@ -188,24 +188,26 @@ alloc_reg(slang_var_table *t, GLint size, GLboolean isTemp)
  * \param swizzle  returns swizzle mask for accessing var in register
  * \return  register allocated, or -1
  */
-GLint
-_slang_alloc_var(slang_var_table *t, GLint size, GLuint *swizzle)
+GLboolean
+_slang_alloc_var(slang_var_table *t, slang_ir_storage *store)
 {
-   int i = alloc_reg(t, size, GL_FALSE);
+   const int i = alloc_reg(t, store->Size, GL_FALSE);
    if (i < 0)
-      return -1;
+      return GL_FALSE;
 
-   if (size == 1) {
-      GLuint comp = i % 4;
-      *swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
-      char swz = "xyzw"[comp];
-      if (dbg) printf("Alloc var sz %d at %d.%c (level %d)\n", size, i/4, swz, t->level);
+   store->Index = i / 4;
+   if (store->Size == 1) {
+      const GLuint comp = i % 4;
+      store->Swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
+      if (dbg) printf("Alloc var sz %d at %d.%c (level %d)\n",
+                      store->Size, store->Index, "xyzw"[comp], t->level);
    }
    else {
-      *swizzle = SWIZZLE_NOOP;
-      if (dbg) printf("Alloc var sz %d at %d.xyzw (level %d)\n", size, i/4, t->level);
+      store->Swizzle = SWIZZLE_NOOP;
+      if (dbg) printf("Alloc var sz %d at %d.xyzw (level %d)\n",
+                      store->Size, store->Index, t->level);
    }
-   return i / 4;
+   return GL_TRUE;
 }
 
 
@@ -213,50 +215,50 @@ _slang_alloc_var(slang_var_table *t, GLint size, GLuint *swizzle)
 /**
  * Allocate temp register(s) for storing an unnamed intermediate value.
  */
-GLint
-_slang_alloc_temp(slang_var_table *t, GLint size, GLuint *swizzle)
+GLboolean
+_slang_alloc_temp(slang_var_table *t, slang_ir_storage *store)
 {
-   int i = alloc_reg(t, size, GL_TRUE);
+   const int i = alloc_reg(t, store->Size, GL_TRUE);
    if (i < 0)
-      return -1;
+      return GL_FALSE;
 
-   if (size == 1) {
-      GLuint comp = i % 4;
-      assert(comp < 4);
-      int swz = "xyzw"[comp];
-      *swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
+   store->Index = i / 4;
+   if (store->Size == 1) {
+      const GLuint comp = i % 4;
+      store->Swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
       if (dbg) printf("Alloc temp sz %d at %d.%c (level %d)\n",
-                      size, i/4, swz, t->level);
+                      store->Size, store->Index, "xyzw"[comp], t->level);
    }
    else {
-      *swizzle = SWIZZLE_NOOP;
+      store->Swizzle = SWIZZLE_NOOP;
       if (dbg) printf("Alloc temp sz %d at %d.xyzw (level %d)\n",
-                      size, i/4, t->level);
+                      store->Size, store->Index, t->level);
    }
-   return i / 4;
+   return GL_TRUE;
 }
 
 
 void
-_slang_free_temp(slang_var_table *t, GLint r, GLint size, GLuint swizzle)
+_slang_free_temp(slang_var_table *t, slang_ir_storage *store)
 {
    GLuint i;
-   assert(size > 0);
+   GLuint r = store->Index;
+   assert(store->Size > 0);
    assert(r >= 0);
-   assert(r + size <= MAX_PROGRAM_TEMPS);
-   if (dbg) printf("Free temp sz %d at %d (level %d)\n", size, r, t->level);
-   if (size == 1) {
-      GLuint comp = GET_SWZ(swizzle, 0);
-      assert(swizzle == MAKE_SWIZZLE4(comp, comp, comp, comp));
+   assert(r + store->Size <= MAX_PROGRAM_TEMPS);
+   if (dbg) printf("Free temp sz %d at %d (level %d)\n", store->Size, r, t->level);
+   if (store->Size == 1) {
+      const GLuint comp = GET_SWZ(store->Swizzle, 0);
+      assert(store->Swizzle == MAKE_SWIZZLE4(comp, comp, comp, comp));
       assert(comp < 4);
       assert(t->size[r * 4 + comp] == 1);
       assert(t->temps[r * 4 + comp] == TEMP);
       t->temps[r * 4 + comp] = FREE;
    }
    else {
-      assert(swizzle == SWIZZLE_NOOP);
-      assert(t->size[r*4] == size);
-      for (i = 0; i < size; i++) {
+      assert(store->Swizzle == SWIZZLE_NOOP);
+      assert(t->size[r*4] == store->Size);
+      for (i = 0; i < store->Size; i++) {
          assert(t->temps[r * 4 + i] == TEMP);
          t->temps[r * 4 + i] = FREE;
       }
@@ -265,17 +267,17 @@ _slang_free_temp(slang_var_table *t, GLint r, GLint size, GLuint swizzle)
 
 
 GLboolean
-_slang_is_temp(slang_var_table *t, GLint r, GLuint swizzle)
+_slang_is_temp(slang_var_table *t, slang_ir_storage *store)
 {
-   assert(r >= 0);
-   assert(r < MAX_PROGRAM_TEMPS);
+   assert(store->Index >= 0);
+   assert(store->Index < MAX_PROGRAM_TEMPS);
    GLuint comp;
-   if (swizzle == SWIZZLE_NOOP)
+   if (store->Swizzle == SWIZZLE_NOOP)
       comp = 0;
    else
-      comp = GET_SWZ(swizzle, 0);
+      comp = GET_SWZ(store->Swizzle, 0);
 
-   if (t->temps[r * 4 + comp] == TEMP)
+   if (t->temps[store->Index * 4 + comp] == TEMP)
       return GL_TRUE;
    else
       return GL_FALSE;
index 86fa5d4a4a1c220c68e8846ee06f5b7a126bd141..51c2a1f77c5109bce3a7e6f084303941a5006c90 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef SLANG_VARTABLE_H
 #define SLANG_VARTABLE_H
 
+struct _slang_ir_storage;
 
 typedef struct slang_var_table_ slang_var_table;
 
@@ -19,17 +20,17 @@ _slang_add_variable(slang_var_table *t, struct slang_variable_ *v);
 extern struct slang_variable_ *
 _slang_find_variable(const slang_var_table *t, slang_atom name);
 
-extern GLint
-_slang_alloc_var(slang_var_table *t, GLint size, GLuint *swizzle);
+extern GLboolean
+_slang_alloc_var(slang_var_table *t, struct _slang_ir_storage *store);
 
-extern GLint
-_slang_alloc_temp(slang_var_table *t, GLint size, GLuint *swizzle);
+extern GLboolean
+_slang_alloc_temp(slang_var_table *t, struct _slang_ir_storage *store);
 
 extern void
-_slang_free_temp(slang_var_table *t, GLint r, GLint size, GLuint swizzle);
+_slang_free_temp(slang_var_table *t, struct _slang_ir_storage *store);
 
 extern GLboolean
-_slang_is_temp(slang_var_table *t, GLint r, GLuint swizzle);
+_slang_is_temp(slang_var_table *t, struct _slang_ir_storage *store);
 
 
 #endif /* SLANG_VARTABLE_H */