Handling new opcodes in PixelProgram and VertexProgram
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>
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
index 4a7cf76..415117d 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -146,12 +146,26 @@
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 @@
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 @@
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 @@
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 @@
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);
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
index 6dad7f3..11c3f20 100644
--- a/src/Shader/Shader.cpp
+++ b/src/Shader/Shader.cpp
@@ -739,6 +739,7 @@
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 @@
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 @@
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";
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
index 5c576a5..339279f 100644
--- a/src/Shader/Shader.hpp
+++ b/src/Shader/Shader.hpp
@@ -184,6 +184,10 @@
OPCODE_I2F, // Int to float
OPCODE_F2U, // Float to uint
OPCODE_U2F, // Uint to float
+ OPCODE_I2B, // Int to bool
+ OPCODE_B2I, // Bool to int
+ OPCODE_U2B, // Uint to bool
+ OPCODE_B2U, // Bool to uint
OPCODE_ALL,
OPCODE_ANY,
OPCODE_NEG,
@@ -191,6 +195,8 @@
OPCODE_OR,
OPCODE_XOR,
OPCODE_AND,
+ OPCODE_EQ,
+ OPCODE_NE,
OPCODE_STEP,
OPCODE_SMOOTH,
OPCODE_ISNAN,
@@ -234,6 +240,7 @@
OPCODE_ISUB,
OPCODE_IMUL,
OPCODE_IDIV,
+ OPCODE_IMAD,
OPCODE_IMOD,
OPCODE_SHL,
OPCODE_ISHR,
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index b3971e7..eaa5b12 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -133,6 +133,7 @@
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 @@
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 @@
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 @@
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 @@
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;