Pack texelFetch LOD as sampling coordinate's w component.
One less argument is emitted.
Vertex/PixelProgram sampleTexture function signature simplified.
Change-Id: I7aef3eb100ccb51a8bd9d5fd600c73b4843d30d9
Reviewed-on: https://swiftshader-review.googlesource.com/5600
Tested-by: Meng-Lin Wu <marleymoo@google.com>
Reviewed-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 3048ad1..d3e688c 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -287,8 +287,8 @@
case Shader::OPCODE_TEXKILL: TEXKILL(cMask, d, dst.mask); break;
case Shader::OPCODE_TEXOFFSET: TEXOFFSET(d, s0, src1, s2, project, bias); break;
case Shader::OPCODE_TEXLDLOFFSET: TEXLDL(d, s0, src1, s2, project, bias); break;
- case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1, s2); break;
- case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2, s3); break;
+ case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1); break;
+ case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2); break;
case Shader::OPCODE_TEXGRAD: TEXGRAD(d, s0, src1, s2, s3); break;
case Shader::OPCODE_TEXGRADOFFSET: TEXGRAD(d, s0, src1, s2, s3, s4); break;
case Shader::OPCODE_DISCARD: DISCARD(cMask, instruction); break;
@@ -676,13 +676,13 @@
}
}
- void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
+ void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
{
Vector4f tmp;
if(sampler.type == Shader::PARAMETER_SAMPLER && sampler.rel.type == Shader::PARAMETER_VOID)
{
- sampleTexture(tmp, sampler.index, u, v, w, q, dsx, dsy, offset, method, options);
+ sampleTexture(tmp, sampler.index, uvwq, dsx, dsy, offset, method, options);
}
else
{
@@ -694,7 +694,7 @@
{
If(index == i)
{
- sampleTexture(tmp, i, u, v, w, q, dsx, dsy, offset, method, options);
+ sampleTexture(tmp, i, uvwq, dsx, dsy, offset, method, options);
// FIXME: When the sampler states are the same, we could use one sampler and just index the texture
}
}
@@ -707,7 +707,7 @@
c.w = tmp[(sampler.swizzle >> 6) & 0x3];
}
- void PixelProgram::sampleTexture(Vector4f &c, int samplerIndex, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
+ void PixelProgram::sampleTexture(Vector4f &c, int samplerIndex, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
{
#if PERF_PROFILE
Long texTime = Ticks();
@@ -717,17 +717,17 @@
if(!(options & Project))
{
- sampler[samplerIndex]->sampleTexture(texture, c, u, v, w, q, dsx, dsy, offset, options, method);
+ sampler[samplerIndex]->sampleTexture(texture, c, uvwq.x, uvwq.y, uvwq.z, uvwq.w, dsx, dsy, offset, options, method);
}
else
{
- Float4 rq = reciprocal(q);
+ Float4 rq = reciprocal(uvwq.w);
- Float4 u_q = u * rq;
- Float4 v_q = v * rq;
- Float4 w_q = w * rq;
+ Float4 u_q = uvwq.x * rq;
+ Float4 v_q = uvwq.y * rq;
+ Float4 w_q = uvwq.z * rq;
- sampler[samplerIndex]->sampleTexture(texture, c, u_q, v_q, w_q, q, dsx, dsy, offset, options, method);
+ sampler[samplerIndex]->sampleTexture(texture, c, u_q, v_q, w_q, uvwq.w, dsx, dsy, offset, options, method);
}
#if PERF_PROFILE
@@ -1109,49 +1109,47 @@
void PixelProgram::TEXLD(Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src0, bias ? Bias : Implicit, project ? Project : None);
+ sampleTexture(dst, src1, src0, src0, src0, src0, bias ? Bias : Implicit, project ? Project : None);
}
void PixelProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, bool project, bool bias)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src2, bias ? Bias : Implicit, project ? (Project | Offset) : Offset);
+ sampleTexture(dst, src1, src0, src0, src0, src2, bias ? Bias : Implicit, project ? (Project | Offset) : Offset);
}
void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &offset, bool project, bool bias)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, offset, Lod, project ? (Project | Offset) : Offset);
+ sampleTexture(dst, src1, src0, src0, src0, offset, Lod, project ? (Project | Offset) : Offset);
}
- void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2)
+ void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1)
{
- Float4 lod(As<Int4>(src2.x));
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, src0, Lod, Fetch);
+ sampleTexture(dst, src1, src0, src0, src0, src0, Lod, Fetch);
}
- void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &offset)
+ void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &offset)
{
- Float4 lod(As<Int4>(src2.x));
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, offset, Lod, Fetch | Offset);
+ sampleTexture(dst, src1, src0, src0, src0, offset, Lod, Fetch | Offset);
}
void PixelProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, src0, Grad, None);
+ sampleTexture(dst, src1, src0, src2, src3, src0, Grad, None);
}
void PixelProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, Vector4f &offset)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, offset, Grad, Offset);
+ sampleTexture(dst, src1, src0, src2, src3, offset, Grad, Offset);
}
void PixelProgram::TEXLDD(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, src0, Grad, project ? Project : None);
+ sampleTexture(dst, src1, src0, src2, src3, src0, Grad, project ? Project : None);
}
void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, bool project)
{
- sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src0, Lod, project ? Project : None);
+ sampleTexture(dst, src1, src0, src0, src0, src0, Lod, project ? Project : None);
}
void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)