mesa: no longer need Writemask field in GLSL IR nodes
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 14 Nov 2008 01:18:07 +0000 (18:18 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 6 Jan 2009 15:47:40 +0000 (08:47 -0700)
The Swizzle and Size fields carry all the info we need now.

(cherry picked from commit 80d6379722a1249ce13db79a898d340644936f67)

src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_ir.c
src/mesa/shader/slang/slang_ir.h

index 8e1dc47..0f7b5a5 100644 (file)
@@ -477,7 +477,6 @@ new_node3(slang_ir_opcode op,
       n->Children[0] = c0;
       n->Children[1] = c1;
       n->Children[2] = c2;
-      n->Writemask = WRITEMASK_XYZW;
       n->InstLocation = -1;
    }
    return n;
@@ -3045,7 +3044,6 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)
             rhs = _slang_gen_swizzle(rhs, newSwizzle);
          }
          n = new_node2(IR_COPY, lhs, rhs);
-         n->Writemask = writemask;
          return n;
       }
       else {
@@ -3202,8 +3200,6 @@ _slang_gen_array_element(slang_assemble_ctx * A, slang_operation *oper)
                                         SWIZZLE_NIL,
                                         SWIZZLE_NIL);
          n = _slang_gen_swizzle(n, swizzle);
-         /*n->Store = _slang_clone_ir_storage_swz(n->Store, */
-         n->Writemask = WRITEMASK_X << index;
       }
       assert(n->Store);
       return n;
index ccd937a..706b260 100644 (file)
@@ -257,8 +257,7 @@ fix_swizzle(GLuint swizzle)
  * Convert IR storage to an instruction dst register.
  */
 static void
-storage_to_dst_reg(struct prog_dst_register *dst, const slang_ir_storage *st,
-                   GLuint writemask)
+storage_to_dst_reg(struct prog_dst_register *dst, const slang_ir_storage *st)
 {
    const GLint size = st->Size;
    GLint index = st->Index;
@@ -280,23 +279,29 @@ storage_to_dst_reg(struct prog_dst_register *dst, const slang_ir_storage *st,
    assert(size >= 1);
    assert(size <= 4);
 
-#if 0
-   if (size == 1) {
-      GLuint comp = GET_SWZ(swizzle, 0);
-      assert(comp < 4);
-      dst->WriteMask = WRITEMASK_X << comp;
-   }
-   else {
-      dst->WriteMask = writemask;
-   }
-#elif 1
    if (swizzle != SWIZZLE_XYZW) {
       dst->WriteMask = swizzle_to_writemask(swizzle);
    }
    else {
+      GLuint writemask;
+      switch (size) {
+      case 1:
+         writemask = WRITEMASK_X << GET_SWZ(st->Swizzle, 0);
+         break;
+      case 2:
+         writemask = WRITEMASK_XY;
+         break;
+      case 3:
+         writemask = WRITEMASK_XYZ;
+         break;
+      case 4:
+         writemask = WRITEMASK_XYZW;
+         break;
+      default:
+         ; /* error would have been caught above */
+      }
       dst->WriteMask = writemask;
    }
-#endif
 }
 
 
@@ -422,27 +427,8 @@ emit_instruction(slang_emit_info *emitInfo,
    inst->Opcode = opcode;
    inst->BranchTarget = -1; /* invalid */
 
-   if (dst) {
-      GLuint writemask;
-      switch (dst->Size) {
-      case 4:
-         writemask = WRITEMASK_XYZW;
-         break;
-      case 3:
-         writemask = WRITEMASK_XYZ;
-         break;
-      case 2:
-         writemask = WRITEMASK_XY;
-         break;
-      case 1:
-         writemask = WRITEMASK_X << GET_SWZ(dst->Swizzle, 0);
-         break;
-      default:
-         writemask = WRITEMASK_XYZW;
-         assert(0);
-      }
-      storage_to_dst_reg(&inst->DstReg, dst, writemask);
-   }
+   if (dst)
+      storage_to_dst_reg(&inst->DstReg, dst);
 
    if (src1)
       storage_to_src_reg(&inst->SrcReg[0], src1);
@@ -1242,14 +1228,7 @@ emit_copy(slang_emit_info *emitInfo, slang_ir_node *n)
       /* fixup the previous instruction (which stored the RHS result) */
       assert(n->Children[0]->Store->Index >= 0);
 
-      /* use tighter writemask when possible */
-#if 0
-      if (n->Writemask == WRITEMASK_XYZW) {
-         n->Writemask = inst->DstReg.WriteMask;
-         printf("Narrow writemask to 0x%x\n", n->Writemask);
-      }
-#endif
-      storage_to_dst_reg(&inst->DstReg, n->Children[0]->Store, n->Writemask);
+      storage_to_dst_reg(&inst->DstReg, n->Children[0]->Store);
       return inst;
    }
    else
@@ -1260,7 +1239,6 @@ emit_copy(slang_emit_info *emitInfo, slang_ir_node *n)
          slang_ir_storage dstStore = *n->Children[0]->Store;
          slang_ir_storage srcStore = *n->Children[1]->Store;
          GLint size = srcStore.Size;
-         ASSERT(n->Children[0]->Writemask == WRITEMASK_XYZW);
          ASSERT(n->Children[1]->Store->Swizzle == SWIZZLE_NOOP);
          dstStore.Size = 4;
          srcStore.Size = 4;
@@ -1715,10 +1693,7 @@ move_block(slang_emit_info *emitInfo,
       /* move matrix/struct etc (block of registers) */
       slang_ir_storage dstStore = *dst;
       slang_ir_storage srcStore = *src;
-      //GLint size = srcStore.Size;
-      /*ASSERT(n->Children[0]->Writemask == WRITEMASK_XYZW);
-      ASSERT(n->Children[1]->Store->Swizzle == SWIZZLE_NOOP);
-      */
+
       dstStore.Size = 4;
       srcStore.Size = 4;
       while (size >= 4) {
index 3a0b8bf..105ab5b 100644 (file)
@@ -239,22 +239,6 @@ _slang_free_ir_tree(slang_ir_node *n)
 }
 
 
-
-static const char *
-writemask_string(GLuint writemask)
-{
-   static char s[6];
-   GLuint i, j = 0;
-   s[j++] = '.';
-   for (i = 0; i < 4; i++) {
-      if (writemask & (1 << i))
-         s[j++] = "xyzw"[i];
-   }
-   s[j] = 0;
-   return s;
-}
-
-
 static const char *
 storage_string(const slang_ir_storage *st)
 {
@@ -328,7 +312,7 @@ _slang_print_ir_tree(const slang_ir_node *n, int indent)
       _slang_print_ir_tree(n->Children[0], indent + 3);
       break;
    case IR_COPY:
-      printf("COPY (writemask = %s)\n", writemask_string(n->Writemask));
+      printf("COPY\n");
       _slang_print_ir_tree(n->Children[0], indent+3);
       _slang_print_ir_tree(n->Children[1], indent+3);
       break;
index f64f9a9..4cd81f0 100644 (file)
@@ -170,7 +170,6 @@ typedef struct slang_ir_node_
 
    /** special fields depending on Opcode: */
    const char *Field;  /**< If Opcode == IR_FIELD */
-   GLuint Writemask;  /**< If Opcode == IR_MOVE */
    GLfloat Value[4];    /**< If Opcode == IR_FLOAT */
    slang_variable *Var;  /**< If Opcode == IR_VAR or IR_VAR_DECL */
    struct slang_ir_node_ *List;  /**< For various linked lists */