Enable glsl integer code
This cl enables true integer support in glsl shaders.
It still uses floating point registers to store all
registers, regardless of the type, so integer and
unsigned integer variables are simply reinterpreted
as integers or unsigned integers and used as such by
the appropriate instructions.
Change-Id: If62213c917b4b0c907e58db9cd36944dd198beaa
Reviewed-on: https://swiftshader-review.googlesource.com/3910
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index eaa5b12..35581af 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -188,7 +188,7 @@
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_MOVA: mov(d, s0, true); 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;
@@ -680,7 +680,7 @@
}
else if(src.rel.type == Shader::PARAMETER_TEMP)
{
- reg.x = As<Float4>(Int4(i) + RoundInt(r.r[src.rel.index].x));
+ reg.x = As<Float4>(Int4(i) + As<Int4>(r.r[src.rel.index].x));
}
return reg;
case Shader::PARAMETER_OUTPUT:
@@ -694,7 +694,7 @@
}
break;
case Shader::PARAMETER_MISCTYPE:
- reg.x = Float(r.instanceID);
+ reg.x = As<Float>(Int(r.instanceID));
return reg;
default:
ASSERT(false);
@@ -821,7 +821,7 @@
default: ASSERT(false);
}
- Int4 index = Int4(i) + RoundInt(a) * Int4(src.rel.scale);
+ Int4 index = Int4(i) + As<Int4>(a) * Int4(src.rel.scale);
index = Min(As<UInt4>(index), UInt4(256)); // Clamp to constant register range, c[256] = {0, 0, 0, 0}
@@ -848,21 +848,21 @@
if(var.rel.type == Shader::PARAMETER_TEMP)
{
- return RoundInt(Extract(r.r[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(r.r[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_INPUT)
{
- return RoundInt(Extract(r.v[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(r.v[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_OUTPUT)
{
- return RoundInt(Extract(r.o[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(r.o[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_CONST)
{
- RValue<Float4> c = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c[var.rel.index]));
+ RValue<Int4> c = *Pointer<Int4>(r.data + OFFSET(DrawData, vs.c[var.rel.index]));
- return RoundInt(Extract(c, 0)) * var.rel.scale;
+ return Extract(c, 0) * var.rel.scale;
}
else ASSERT(false);