Browse Source

mesa: no longer need Writemask field in GLSL IR nodes

The Swizzle and Size fields carry all the info we need now.
tags/mesa_7_3_rc1
Brian Paul 16 years ago
parent
commit
80d6379722

+ 0
- 4
src/mesa/shader/slang/slang_codegen.c View File

@@ -480,7 +480,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;
@@ -3048,7 +3047,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 {
@@ -3205,8 +3203,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;

+ 22
- 47
src/mesa/shader/slang/slang_emit.c View 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);
@@ -1245,14 +1231,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
@@ -1263,7 +1242,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;
@@ -1718,10 +1696,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) {

+ 1
- 17
src/mesa/shader/slang/slang_ir.c View File

@@ -243,22 +243,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)
{
@@ -332,7 +316,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;

+ 0
- 1
src/mesa/shader/slang/slang_ir.h View File

@@ -173,7 +173,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 */

Loading…
Cancel
Save