Make SGE, SGT, SLE working.
authormichal <michal@michal-laptop.(none)>
Mon, 6 Aug 2007 16:15:37 +0000 (17:15 +0100)
committermichal <michal@michal-laptop.(none)>
Mon, 6 Aug 2007 16:15:37 +0000 (17:15 +0100)
src/mesa/pipe/tgsi/core/tgsi_exec.c

index 6aaaef98a832277cfccc610ba371248fac13fe38..9a42878e0a962bfe5d72902991c839760ca993e5 100644 (file)
@@ -357,6 +357,20 @@ micro_frc(
    dst->f[3] = src->f[3] - (GLfloat) floor( (GLdouble) src->f[3] );
 }
 
+static void
+micro_ge(
+   union tgsi_exec_channel *dst,
+   const union tgsi_exec_channel *src0,
+   const union tgsi_exec_channel *src1,
+   const union tgsi_exec_channel *src2,
+   const union tgsi_exec_channel *src3 )
+{
+   dst->f[0] = src0->f[0] >= src1->f[0] ? src2->f[0] : src3->f[0];
+   dst->f[1] = src0->f[1] >= src1->f[1] ? src2->f[1] : src3->f[1];
+   dst->f[2] = src0->f[2] >= src1->f[2] ? src2->f[2] : src3->f[2];
+   dst->f[3] = src0->f[3] >= src1->f[3] ? src2->f[3] : src3->f[3];
+}
+
 static void
 micro_i2f(
    union tgsi_exec_channel *dst,
@@ -1508,12 +1522,10 @@ exec_instruction(
    case TGSI_OPCODE_SGE:
    /* TGSI_OPCODE_SETGE */
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
-         FETCH(&r[0], 0, chan_index);
-         FETCH(&r[1], 1, chan_index);
-
-         micro_lt( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] );
-
-         STORE(&r[0], 0, chan_index);
+         FETCH( &r[0], 0, chan_index );
+         FETCH( &r[1], 1, chan_index );
+         micro_ge( &r[0], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] );
+         STORE( &r[0], 0, chan_index );
       }
       break;
 
@@ -1785,21 +1797,29 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_SGT:
-      assert (0);
+      FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+         FETCH( &r[0], 0, chan_index );
+         FETCH( &r[1], 1, chan_index );
+         micro_lt( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] );
+         STORE( &r[0], 0, chan_index );
+      }
       break;
 
    case TGSI_OPCODE_SIN:
-      FETCH(&r[0], 0, CHAN_X);
-
+      FETCH( &r[0], 0, CHAN_X );
       micro_sin( &r[0], &r[0] );
-
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
-        STORE( &r[0], 0, chan_index );
+         STORE( &r[0], 0, chan_index );
       }
       break;
 
    case TGSI_OPCODE_SLE:
-      assert (0);
+      FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+         FETCH( &r[0], 0, chan_index );
+         FETCH( &r[1], 1, chan_index );
+         micro_ge( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] );
+         STORE( &r[0], 0, chan_index );
+      }
       break;
 
    case TGSI_OPCODE_SNE: