summaryrefslogtreecommitdiff
path: root/src/mesa/pipe
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-10-02 15:17:37 -0600
committerBrian <brian.paul@tungstengraphics.com>2007-10-02 15:17:37 -0600
commitfe1d15acc7b0ed5d6eb22829f2d8547a36a852a9 (patch)
tree35446d986960cae665a8e231e29607de3bb8c164 /src/mesa/pipe
parent8955bc34581ac716cf5cabb02fde5260ab3ae207 (diff)
added micro_trunc(), re-order some code
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r--src/mesa/pipe/tgsi/exec/tgsi_exec.c79
1 files changed, 47 insertions, 32 deletions
diff --git a/src/mesa/pipe/tgsi/exec/tgsi_exec.c b/src/mesa/pipe/tgsi/exec/tgsi_exec.c
index 5a50bd5aed..4a42238636 100644
--- a/src/mesa/pipe/tgsi/exec/tgsi_exec.c
+++ b/src/mesa/pipe/tgsi/exec/tgsi_exec.c
@@ -179,6 +179,10 @@ tgsi_exec_machine_init(
GLuint i, k;
struct tgsi_parse_context parse;
+#if 0
+ tgsi_dump(tokens, 0);
+#endif
+
mach->Tokens = tokens;
mach->Samplers = samplers;
@@ -735,6 +739,17 @@ micro_ishr(
}
static void
+micro_trunc(
+ union tgsi_exec_channel *dst,
+ const union tgsi_exec_channel *src0 )
+{
+ dst->f[0] = (float) (int) src0->u[0];
+ dst->f[1] = (float) (int) src0->u[1];
+ dst->f[2] = (float) (int) src0->u[2];
+ dst->f[3] = (float) (int) src0->u[3];
+}
+
+static void
micro_ushr(
union tgsi_exec_channel *dst,
const union tgsi_exec_channel *src0,
@@ -1995,13 +2010,6 @@ exec_instruction(
assert (0);
break;
- case TGSI_OPCODE_BRK:
- /* turn off loop channels for each enabled exec channel */
- mach->LoopMask &= ~mach->ExecMask;
- /* Todo: if mach->LoopMask == 0, jump to end of loop */
- UPDATE_EXEC_MASK(mach);
- break;
-
case TGSI_OPCODE_IF:
/* push CondMask */
assert(mach->CondStackTop < TGSI_EXEC_MAX_COND_NESTING);
@@ -2024,16 +2032,6 @@ exec_instruction(
/* Todo: If CondMask==0, jump to ELSE */
break;
- case TGSI_OPCODE_LOOP:
- /* push LoopMask */
- assert(mach->LoopStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
- mach->LoopStack[mach->LoopStackTop++] = mach->LoopMask;
- break;
-
- case TGSI_OPCODE_REP:
- assert (0);
- break;
-
case TGSI_OPCODE_ELSE:
/* invert CondMask wrt previous mask */
{
@@ -2046,11 +2044,6 @@ exec_instruction(
}
break;
- case TGSI_OPCODE_END:
- /* halt execution */
- *pc = -1;
- break;
-
case TGSI_OPCODE_ENDIF:
/* pop CondMask */
assert(mach->CondStackTop > 0);
@@ -2058,6 +2051,15 @@ exec_instruction(
UPDATE_EXEC_MASK(mach);
break;
+ case TGSI_OPCODE_END:
+ /* halt execution */
+ *pc = -1;
+ break;
+
+ case TGSI_OPCODE_REP:
+ assert (0);
+ break;
+
case TGSI_OPCODE_ENDREP:
assert (0);
break;
@@ -2095,8 +2097,11 @@ exec_instruction(
break;
case TGSI_OPCODE_TRUNC:
- /* TGSI_OPCODE_INT */
- assert (0);
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+ FETCH( &r[0], 0, chan_index );
+ micro_trunc( &r[0], &r[0] );
+ STORE( &r[0], 0, chan_index );
+ }
break;
case TGSI_OPCODE_SHL:
@@ -2160,10 +2165,6 @@ exec_instruction(
assert (0);
break;
- case TGSI_OPCODE_CONT:
- assert (0);
- break;
-
case TGSI_OPCODE_EMIT:
mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] += 16;
mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]]++;
@@ -2174,16 +2175,14 @@ exec_instruction(
mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]] = 0;
break;
+ case TGSI_OPCODE_LOOP:
+ /* fall-through (for now) */
case TGSI_OPCODE_BGNLOOP2:
/* push LoopMask */
assert(mach->LoopStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
mach->LoopStack[mach->LoopStackTop++] = mach->LoopMask;
break;
- case TGSI_OPCODE_BGNSUB:
- /* no-op */
- break;
-
case TGSI_OPCODE_ENDLOOP:
/* fall-through (for now at least) */
case TGSI_OPCODE_ENDLOOP2:
@@ -2199,6 +2198,22 @@ exec_instruction(
}
break;
+ case TGSI_OPCODE_BRK:
+ /* turn off loop channels for each enabled exec channel */
+ mach->LoopMask &= ~mach->ExecMask;
+ /* Todo: if mach->LoopMask == 0, jump to end of loop */
+ UPDATE_EXEC_MASK(mach);
+ break;
+
+ case TGSI_OPCODE_CONT:
+ assert (0);
+ break;
+
+
+ case TGSI_OPCODE_BGNSUB:
+ /* no-op */
+ break;
+
case TGSI_OPCODE_ENDSUB:
assert( 0 );
break;