OSDN Git Service

Handling new opcodes in PixelProgram and VertexProgram
authorAlexis Hetu <sugoi@google.com>
Fri, 28 Aug 2015 18:24:45 +0000 (14:24 -0400)
committerAlexis Hétu <sugoi@google.com>
Fri, 28 Aug 2015 19:08:17 +0000 (19:08 +0000)
The new opcodes related to true int and uint support in
glsl shader are now handled properly in PixelProgram and
VertexProgram.

Change-Id: I62565844f24708b4bd89dd99bbf971b55495c5da
Reviewed-on: https://swiftshader-review.googlesource.com/3932
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/Shader/PixelProgram.cpp
src/Shader/Shader.cpp
src/Shader/Shader.hpp
src/Shader/VertexProgram.cpp

index 4a7cf76..415117d 100644 (file)
@@ -146,12 +146,26 @@ namespace sw
                        case Shader::OPCODE_DCL:                                                       break;
                        case Shader::OPCODE_NOP:                                                       break;
                        case Shader::OPCODE_MOV:        mov(d, s0);                                    break;
+                       case Shader::OPCODE_NEG:        neg(d, s0);                                    break;
+                       case Shader::OPCODE_INEG:       ineg(d, s0);                                   break;
                        case Shader::OPCODE_F2B:        f2b(d, s0);                                    break;
                        case Shader::OPCODE_B2F:        b2f(d, s0);                                    break;
+                       case Shader::OPCODE_F2I:        f2i(d, s0);                                    break;
+                       case Shader::OPCODE_I2F:        i2f(d, s0);                                    break;
+                       case Shader::OPCODE_F2U:        f2u(d, s0);                                    break;
+                       case Shader::OPCODE_U2F:        u2f(d, s0);                                    break;
+                       case Shader::OPCODE_I2B:        i2b(d, s0);                                    break;
+                       case Shader::OPCODE_B2I:        b2i(d, s0);                                    break;
+                       case Shader::OPCODE_U2B:        u2b(d, s0);                                    break;
+                       case Shader::OPCODE_B2U:        b2u(d, s0);                                    break;
                        case Shader::OPCODE_ADD:        add(d, s0, s1);                                break;
+                       case Shader::OPCODE_IADD:       iadd(d, s0, s1);                               break;
                        case Shader::OPCODE_SUB:        sub(d, s0, s1);                                break;
+                       case Shader::OPCODE_ISUB:       isub(d, s0, s1);                               break;
                        case Shader::OPCODE_MUL:        mul(d, s0, s1);                                break;
+                       case Shader::OPCODE_IMUL:       imul(d, s0, s1);                               break;
                        case Shader::OPCODE_MAD:        mad(d, s0, s1, s2);                            break;
+                       case Shader::OPCODE_IMAD:       imad(d, s0, s1, s2);                           break;
                        case Shader::OPCODE_DP1:        dp1(d, s0, s1);                                break;
                        case Shader::OPCODE_DP2:        dp2(d, s0, s1);                                break;
                        case Shader::OPCODE_DP2ADD:     dp2add(d, s0, s1, s2);                         break;
@@ -159,6 +173,7 @@ namespace sw
                        case Shader::OPCODE_DP4:        dp4(d, s0, s1);                                break;
                        case Shader::OPCODE_CMP0:       cmp0(d, s0, s1, s2);                           break;
                        case Shader::OPCODE_ICMP:       icmp(d, s0, s1, control);                      break;
+                       case Shader::OPCODE_UCMP:       ucmp(d, s0, s1, control);                      break;
                        case Shader::OPCODE_SELECT:     select(d, s0, s1, s2);                         break;
                        case Shader::OPCODE_EXTRACT:    extract(d.x, s0, s1.x);                        break;
                        case Shader::OPCODE_INSERT:     insert(d, s0, s1.x, s2.x);                     break;
@@ -176,7 +191,14 @@ namespace sw
                        case Shader::OPCODE_LOG:        log(d, s0, pp);                                break;
                        case Shader::OPCODE_RCPX:       rcpx(d, s0, pp);                               break;
                        case Shader::OPCODE_DIV:        div(d, s0, s1);                                break;
+                       case Shader::OPCODE_IDIV:       idiv(d, s0, s1);                               break;
+                       case Shader::OPCODE_UDIV:       udiv(d, s0, s1);                               break;
                        case Shader::OPCODE_MOD:        mod(d, s0, s1);                                break;
+                       case Shader::OPCODE_IMOD:       imod(d, s0, s1);                               break;
+                       case Shader::OPCODE_UMOD:       umod(d, s0, s1);                               break;
+                       case Shader::OPCODE_SHL:        shl(d, s0, s1);                                break;
+                       case Shader::OPCODE_ISHR:       ishr(d, s0, s1);                               break;
+                       case Shader::OPCODE_USHR:       ushr(d, s0, s1);                               break;
                        case Shader::OPCODE_RSQX:       rsqx(d, s0, pp);                               break;
                        case Shader::OPCODE_SQRT:       sqrt(d, s0, pp);                               break;
                        case Shader::OPCODE_RSQ:        rsq(d, s0, pp);                                break;
@@ -188,10 +210,18 @@ namespace sw
                        case Shader::OPCODE_DIST3:      dist3(d.x, s0, s1, pp);                        break;
                        case Shader::OPCODE_DIST4:      dist4(d.x, s0, s1, pp);                        break;
                        case Shader::OPCODE_MIN:        min(d, s0, s1);                                break;
+                       case Shader::OPCODE_IMIN:       imin(d, s0, s1);                               break;
+                       case Shader::OPCODE_UMIN:       umin(d, s0, s1);                               break;
                        case Shader::OPCODE_MAX:        max(d, s0, s1);                                break;
+                       case Shader::OPCODE_IMAX:       imax(d, s0, s1);                               break;
+                       case Shader::OPCODE_UMAX:       umax(d, s0, s1);                               break;
                        case Shader::OPCODE_LRP:        lrp(d, s0, s1, s2);                            break;
                        case Shader::OPCODE_STEP:       step(d, s0, s1);                               break;
                        case Shader::OPCODE_SMOOTH:     smooth(d, s0, s1, s2);                         break;
+                       case Shader::OPCODE_FLOATBITSTOINT:
+                       case Shader::OPCODE_FLOATBITSTOUINT:
+                       case Shader::OPCODE_INTBITSTOFLOAT:
+                       case Shader::OPCODE_UINTBITSTOFLOAT: d = s0;                                   break;
                        case Shader::OPCODE_POWX:       powx(d, s0, s1, pp);                           break;
                        case Shader::OPCODE_POW:        pow(d, s0, s1, pp);                            break;
                        case Shader::OPCODE_SGN:        sgn(d, s0);                                    break;
@@ -266,6 +296,8 @@ namespace sw
                        case Shader::OPCODE_OR:         or(d, s0, s1);                                 break;
                        case Shader::OPCODE_XOR:        xor(d, s0, s1);                                break;
                        case Shader::OPCODE_AND:        and(d, s0, s1);                                break;
+                       case Shader::OPCODE_EQ:         equal(d, s0, s1);                              break;
+                       case Shader::OPCODE_NE:         notEqual(d, s0, s1);                           break;
                        case Shader::OPCODE_END:                                                       break;
                        default:
                                ASSERT(false);
index 6dad7f3..11c3f20 100644 (file)
@@ -739,6 +739,7 @@ namespace sw
                case OPCODE_SUB:                        return "sub";
                case OPCODE_ISUB:                       return "isub";
                case OPCODE_MAD:                        return "mad";
+               case OPCODE_IMAD:                       return "imad";
                case OPCODE_MUL:                        return "mul";
                case OPCODE_IMUL:                       return "imul";
                case OPCODE_RCPX:                       return "rcpx";
@@ -913,6 +914,10 @@ namespace sw
                case OPCODE_I2F:            return "i2f";
                case OPCODE_F2U:            return "f2u";
                case OPCODE_U2F:            return "u2f";
+               case OPCODE_B2I:            return "b2i";
+               case OPCODE_I2B:            return "i2b";
+               case OPCODE_B2U:            return "b2u";
+               case OPCODE_U2B:            return "u2b";
                case OPCODE_ALL:            return "all";
                case OPCODE_ANY:            return "any";
                case OPCODE_NEG:            return "neg";
@@ -923,6 +928,8 @@ namespace sw
                case OPCODE_OR:             return "or";
                case OPCODE_XOR:            return "xor";
                case OPCODE_AND:            return "and";
+               case OPCODE_EQ:             return "eq";
+               case OPCODE_NE:             return "neq";
                case OPCODE_FORWARD1:       return "forward1";
                case OPCODE_FORWARD2:       return "forward2";
                case OPCODE_FORWARD3:       return "forward3";
index 5c576a5..339279f 100644 (file)
@@ -184,6 +184,10 @@ namespace sw
                        OPCODE_I2F,   // Int to float\r
                        OPCODE_F2U,   // Float to uint\r
                        OPCODE_U2F,   // Uint to float\r
+                       OPCODE_I2B,   // Int to bool\r
+                       OPCODE_B2I,   // Bool to int\r
+                       OPCODE_U2B,   // Uint to bool\r
+                       OPCODE_B2U,   // Bool to uint\r
                        OPCODE_ALL,\r
                        OPCODE_ANY,\r
                        OPCODE_NEG,\r
@@ -191,6 +195,8 @@ namespace sw
                        OPCODE_OR,\r
                        OPCODE_XOR,\r
                        OPCODE_AND,\r
+                       OPCODE_EQ,\r
+                       OPCODE_NE,\r
                        OPCODE_STEP,\r
                        OPCODE_SMOOTH,\r
                        OPCODE_ISNAN,\r
@@ -234,6 +240,7 @@ namespace sw
                        OPCODE_ISUB,\r
                        OPCODE_IMUL,\r
                        OPCODE_IDIV,\r
+                       OPCODE_IMAD,\r
                        OPCODE_IMOD,\r
                        OPCODE_SHL,\r
                        OPCODE_ISHR,\r
index b3971e7..eaa5b12 100644 (file)
@@ -133,6 +133,7 @@ namespace sw
                        case Shader::OPCODE_NOP:                                                                                break;
                        case Shader::OPCODE_ABS:                abs(d, s0);                                             break;
                        case Shader::OPCODE_ADD:                add(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IADD:       iadd(d, s0, s1);                break;
                        case Shader::OPCODE_CRS:                crs(d, s0, s1);                                 break;
                        case Shader::OPCODE_FORWARD1:   forward1(d, s0, s1, s2);                break;
                        case Shader::OPCODE_FORWARD2:   forward2(d, s0, s1, s2);                break;
@@ -169,19 +170,39 @@ namespace sw
                        case Shader::OPCODE_LRP:                lrp(d, s0, s1, s2);                             break;
                        case Shader::OPCODE_STEP:               step(d, s0, s1);                                break;
                        case Shader::OPCODE_SMOOTH:             smooth(d, s0, s1, s2);                  break;
+                       case Shader::OPCODE_FLOATBITSTOINT:
+                       case Shader::OPCODE_FLOATBITSTOUINT:
+                       case Shader::OPCODE_INTBITSTOFLOAT:
+                       case Shader::OPCODE_UINTBITSTOFLOAT: d = s0;                    break;
                        case Shader::OPCODE_M3X2:               M3X2(r, d, s0, src1);                   break;
                        case Shader::OPCODE_M3X3:               M3X3(r, d, s0, src1);                   break;
                        case Shader::OPCODE_M3X4:               M3X4(r, d, s0, src1);                   break;
                        case Shader::OPCODE_M4X3:               M4X3(r, d, s0, src1);                   break;
                        case Shader::OPCODE_M4X4:               M4X4(r, d, s0, src1);                   break;
                        case Shader::OPCODE_MAD:                mad(d, s0, s1, s2);                             break;
+                       case Shader::OPCODE_IMAD:               imad(d, s0, s1, s2);                    break;
                        case Shader::OPCODE_MAX:                max(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IMAX:       imax(d, s0, s1);                break;
+                       case Shader::OPCODE_UMAX:       umax(d, s0, s1);                break;
                        case Shader::OPCODE_MIN:                min(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IMIN:       imin(d, s0, s1);                break;
+                       case Shader::OPCODE_UMIN:       umin(d, s0, s1);                break;
                        case Shader::OPCODE_MOV:                mov(d, s0, integer);                    break;
                        case Shader::OPCODE_MOVA:               mov(d, s0);                                             break;
+                       case Shader::OPCODE_NEG:        neg(d, s0);                     break;
+                       case Shader::OPCODE_INEG:       ineg(d, s0);                    break;
                        case Shader::OPCODE_F2B:                f2b(d, s0);                                             break;
                        case Shader::OPCODE_B2F:                b2f(d, s0);                                             break;
+                       case Shader::OPCODE_F2I:        f2i(d, s0);                     break;
+                       case Shader::OPCODE_I2F:        i2f(d, s0);                     break;
+                       case Shader::OPCODE_F2U:        f2u(d, s0);                     break;
+                       case Shader::OPCODE_U2F:        u2f(d, s0);                     break;
+                       case Shader::OPCODE_I2B:        i2b(d, s0);                     break;
+                       case Shader::OPCODE_B2I:        b2i(d, s0);                     break;
+                       case Shader::OPCODE_U2B:        u2b(d, s0);                     break;
+                       case Shader::OPCODE_B2U:        b2u(d, s0);                     break;
                        case Shader::OPCODE_MUL:                mul(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IMUL:       imul(d, s0, s1);                break;
                        case Shader::OPCODE_NRM2:               nrm2(d, s0, pp);                                break;
                        case Shader::OPCODE_NRM3:               nrm3(d, s0, pp);                                break;
                        case Shader::OPCODE_NRM4:               nrm4(d, s0, pp);                                break;
@@ -189,7 +210,14 @@ namespace sw
                        case Shader::OPCODE_POW:                pow(d, s0, s1, pp);                             break;
                        case Shader::OPCODE_RCPX:               rcpx(d, s0, pp);                                break;
                        case Shader::OPCODE_DIV:                div(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IDIV:       idiv(d, s0, s1);                break;
+                       case Shader::OPCODE_UDIV:       udiv(d, s0, s1);                break;
                        case Shader::OPCODE_MOD:                mod(d, s0, s1);                                 break;
+                       case Shader::OPCODE_IMOD:       imod(d, s0, s1);                break;
+                       case Shader::OPCODE_UMOD:       umod(d, s0, s1);                break;
+                       case Shader::OPCODE_SHL:        shl(d, s0, s1);                 break;
+                       case Shader::OPCODE_ISHR:       ishr(d, s0, s1);                 break;
+                       case Shader::OPCODE_USHR:       ushr(d, s0, s1);                 break;
                        case Shader::OPCODE_RSQX:               rsqx(d, s0, pp);                                break;
                        case Shader::OPCODE_SQRT:               sqrt(d, s0, pp);                                break;
                        case Shader::OPCODE_RSQ:                rsq(d, s0, pp);                                 break;
@@ -218,6 +246,7 @@ namespace sw
                        case Shader::OPCODE_ATANH:              atanh(d, s0, pp);                               break;
                        case Shader::OPCODE_SLT:                slt(d, s0, s1);                                 break;
                        case Shader::OPCODE_SUB:                sub(d, s0, s1);                                 break;
+                       case Shader::OPCODE_ISUB:       isub(d, s0, s1);                break;
                        case Shader::OPCODE_BREAK:              BREAK(r);                                               break;
                        case Shader::OPCODE_BREAKC:             BREAKC(r, s0, s1, control);             break;
                        case Shader::OPCODE_BREAKP:             BREAKP(r, src0);                                break;
@@ -240,15 +269,18 @@ namespace sw
                        case Shader::OPCODE_LEAVE:              LEAVE(r);                                               break;
                        case Shader::OPCODE_CMP:                cmp(d, s0, s1, control);                break;
                        case Shader::OPCODE_ICMP:               icmp(d, s0, s1, control);               break;
+                       case Shader::OPCODE_UCMP:       ucmp(d, s0, s1, control);       break;
                        case Shader::OPCODE_SELECT:             select(d, s0, s1, s2);                  break;
                        case Shader::OPCODE_EXTRACT:    extract(d.x, s0, s1.x);                 break;
                        case Shader::OPCODE_INSERT:             insert(d, s0, s1.x, s2.x);              break;
                        case Shader::OPCODE_ALL:                all(d.x, s0);                                   break;
                        case Shader::OPCODE_ANY:                any(d.x, s0);                                   break;
                        case Shader::OPCODE_NOT:                not(d, s0);                                             break;
-                       case Shader::OPCODE_OR:                 or(d, s0, s1);                                  break;
-                       case Shader::OPCODE_XOR:                xor(d, s0, s1);                                 break;
-                       case Shader::OPCODE_AND:                and(d, s0, s1);                                 break;
+                       case Shader::OPCODE_OR:         or(d, s0, s1);                  break;
+                       case Shader::OPCODE_XOR:        xor(d, s0, s1);                 break;
+                       case Shader::OPCODE_AND:        and(d, s0, s1);                 break;
+                       case Shader::OPCODE_EQ:         equal(d, s0, s1);               break;
+                       case Shader::OPCODE_NE:         notEqual(d, s0, s1);            break;
                        case Shader::OPCODE_TEXLDL:             TEXLDL(r, d, s0, src1);                 break;
                        case Shader::OPCODE_TEX:                TEX(r, d, s0, src1);                    break;
                        case Shader::OPCODE_END:                                                                                break;