Fixed some unary operators
There were a few issues in unary operators:
- Many were not compiling because the promote function had not
been adjusted to take the new builtin functions into account
- abs and sign had not been implemented for int
- For the integer abs version, used pabsd. Removed the extra
argument, which seemed unnecessary (abs should have 1 input,
1 output, AFAIK).
Change-Id: If02c5040438e8c45c99fc7b3c55107448c85cf58
Reviewed-on: https://swiftshader-review.googlesource.com/4970
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 203387c..0286bc30 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -231,6 +231,7 @@
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;
+ case Shader::OPCODE_ISGN: isgn(d, s0); 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;
@@ -248,6 +249,7 @@
case Shader::OPCODE_NRM3: nrm3(d, s0, pp); break;
case Shader::OPCODE_NRM4: nrm4(d, s0, pp); break;
case Shader::OPCODE_ABS: abs(d, s0); break;
+ case Shader::OPCODE_IABS: iabs(d, s0); break;
case Shader::OPCODE_SINCOS: sincos(d, s0, pp); break;
case Shader::OPCODE_COS: cos(d, s0, pp); break;
case Shader::OPCODE_SIN: sin(d, s0, pp); break;
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
index 5cc9242..7c3f9bb 100644
--- a/src/Shader/Shader.cpp
+++ b/src/Shader/Shader.cpp
@@ -821,7 +821,9 @@
case OPCODE_POWX: return "powx";
case OPCODE_CRS: return "crs";
case OPCODE_SGN: return "sgn";
+ case OPCODE_ISGN: return "isgn";
case OPCODE_ABS: return "abs";
+ case OPCODE_IABS: return "iabs";
case OPCODE_NRM2: return "nrm2";
case OPCODE_NRM3: return "nrm3";
case OPCODE_NRM4: return "nrm4";
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
index 03b95dc..a5785c8 100644
--- a/src/Shader/Shader.hpp
+++ b/src/Shader/Shader.hpp
@@ -244,6 +244,8 @@
// Integer opcodes
OPCODE_INEG,
+ OPCODE_IABS,
+ OPCODE_ISGN,
OPCODE_IADD,
OPCODE_ISUB,
OPCODE_IMUL,
diff --git a/src/Shader/ShaderCore.cpp b/src/Shader/ShaderCore.cpp
index f177a68..d06dc9b 100644
--- a/src/Shader/ShaderCore.cpp
+++ b/src/Shader/ShaderCore.cpp
@@ -1357,6 +1357,14 @@
sgn(dst.w, src.w);
}
+ void ShaderCore::isgn(Vector4f &dst, const Vector4f &src)
+ {
+ isgn(dst.x, src.x);
+ isgn(dst.y, src.y);
+ isgn(dst.z, src.z);
+ isgn(dst.w, src.w);
+ }
+
void ShaderCore::abs(Vector4f &dst, const Vector4f &src)
{
dst.x = Abs(src.x);
@@ -1364,7 +1372,15 @@
dst.z = Abs(src.z);
dst.w = Abs(src.w);
}
-
+
+ void ShaderCore::iabs(Vector4f &dst, const Vector4f &src)
+ {
+ dst.x = As<Float4>(Abs(As<Int4>(src.x)));
+ dst.y = As<Float4>(Abs(As<Int4>(src.y)));
+ dst.z = As<Float4>(Abs(As<Int4>(src.z)));
+ dst.w = As<Float4>(Abs(As<Int4>(src.w)));
+ }
+
void ShaderCore::nrm2(Vector4f &dst, const Vector4f &src, bool pp)
{
Float4 dot = dot2(src, src);
@@ -1595,6 +1611,13 @@
dst = As<Float4>(neg | pos);
}
+ void ShaderCore::isgn(Float4 &dst, const Float4 &src)
+ {
+ Int4 neg = CmpLT(As<Int4>(src), Int4(0)) & Int4(-1);
+ Int4 pos = CmpNLE(As<Int4>(src), Int4(0)) & Int4(1);
+ dst = As<Float4>(neg | pos);
+ }
+
void ShaderCore::cmp0(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2)
{
Int4 pos = CmpLE(Float4(0.0f), src0);
diff --git a/src/Shader/ShaderCore.hpp b/src/Shader/ShaderCore.hpp
index 3f4b22c..161f0f9 100644
--- a/src/Shader/ShaderCore.hpp
+++ b/src/Shader/ShaderCore.hpp
@@ -335,7 +335,9 @@
void refract3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
void refract4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
void sgn(Vector4f &dst, const Vector4f &src);
+ void isgn(Vector4f &dst, const Vector4f &src);
void abs(Vector4f &dst, const Vector4f &src);
+ void iabs(Vector4f &dst, const Vector4f &src);
void nrm2(Vector4f &dst, const Vector4f &src, bool pp = false);
void nrm3(Vector4f &dst, const Vector4f &src, bool pp = false);
void nrm4(Vector4f &dst, const Vector4f &src, bool pp = false);
@@ -373,6 +375,7 @@
private:
void sgn(Float4 &dst, const Float4 &src);
+ void isgn(Float4 &dst, const Float4 &src);
void cmp0(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
void cmp0i(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
void select(Float4 &dst, RValue<Int4> src0, const Float4 &src1, const Float4 &src2);
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index efae39cc..dc829ef 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -157,6 +157,7 @@
case Shader::OPCODE_DEFB: break;
case Shader::OPCODE_NOP: break;
case Shader::OPCODE_ABS: abs(d, s0); break;
+ case Shader::OPCODE_IABS: iabs(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;
@@ -256,6 +257,7 @@
case Shader::OPCODE_DIST4: dist4(d.x, s0, s1, pp); break;
case Shader::OPCODE_SGE: step(d, s1, s0); break;
case Shader::OPCODE_SGN: sgn(d, s0); break;
+ case Shader::OPCODE_ISGN: isgn(d, s0); break;
case Shader::OPCODE_SINCOS: sincos(d, s0, pp); break;
case Shader::OPCODE_COS: cos(d, s0, pp); break;
case Shader::OPCODE_SIN: sin(d, s0, pp); break;