From 8d78cf77ce7c6bc4ba320fefb2cd2b74cc408b1a Mon Sep 17 00:00:00 2001 From: Alexis Hetu Date: Fri, 28 Aug 2015 14:24:45 -0400 Subject: [PATCH] Handling new opcodes in PixelProgram and VertexProgram MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Nicolas Capens --- src/Shader/PixelProgram.cpp | 32 ++++++++++++++++++++++++++++++++ src/Shader/Shader.cpp | 7 +++++++ src/Shader/Shader.hpp | 7 +++++++ src/Shader/VertexProgram.cpp | 38 +++++++++++++++++++++++++++++++++++--- 4 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp index 4a7cf76fc..415117d00 100644 --- a/src/Shader/PixelProgram.cpp +++ b/src/Shader/PixelProgram.cpp @@ -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); diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp index 6dad7f305..11c3f20d6 100644 --- a/src/Shader/Shader.cpp +++ b/src/Shader/Shader.cpp @@ -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"; diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp index 5c576a50f..339279fcc 100644 --- a/src/Shader/Shader.hpp +++ b/src/Shader/Shader.hpp @@ -184,6 +184,10 @@ namespace sw 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 @@ namespace sw OPCODE_OR, OPCODE_XOR, OPCODE_AND, + OPCODE_EQ, + OPCODE_NE, OPCODE_STEP, OPCODE_SMOOTH, OPCODE_ISNAN, @@ -234,6 +240,7 @@ namespace sw 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 b3971e7fd..eaa5b12e9 100644 --- a/src/Shader/VertexProgram.cpp +++ b/src/Shader/VertexProgram.cpp @@ -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; -- 2.11.0