Refactor sampler LOD calculation method into an enum.
Change-Id: I0beed96cd68608ce07aec0b11f14d6f61e67e53d
Reviewed-on: https://swiftshader-review.googlesource.com/5034
Tested-by: Nicolas Capens <capn@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 0286bc30..6eca4eb 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -136,11 +136,11 @@
}
}
- if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(src0);
- if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(src1);
- if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(src2);
- if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(src3);
- if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(src4);
+ if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegister(src0);
+ if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegister(src1);
+ if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegister(src2);
+ if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegister(src3);
+ if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegister(src4);
switch(opcode)
{
@@ -270,8 +270,8 @@
case Shader::OPCODE_M3X3: M3X3(d, s0, src1); break;
case Shader::OPCODE_M3X2: M3X2(d, s0, src1); break;
case Shader::OPCODE_TEX: TEXLD(d, s0, src1, project, bias); break;
- case Shader::OPCODE_TEXLDD: TEXLDD(d, s0, src1, s2, s3, project, bias); break;
- case Shader::OPCODE_TEXLDL: TEXLDL(d, s0, src1, project, bias); break;
+ case Shader::OPCODE_TEXLDD: TEXLDD(d, s0, src1, s2, s3, project); break;
+ case Shader::OPCODE_TEXLDL: TEXLDL(d, s0, src1, project); break;
case Shader::OPCODE_TEXSIZE: TEXSIZE(d, s0.x, src1); break;
case Shader::OPCODE_TEXKILL: TEXKILL(cMask, d, dst.mask); break;
case Shader::OPCODE_TEXOFFSET: TEXOFFSET(d, s0, src1, s2, s3, project, bias); break;
@@ -624,15 +624,17 @@
}
}
- void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, bool project, bool bias, bool gradients, bool lodProvided)
+ void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, bool project, SamplerMethod method)
{
+ Vector4f tmp;
+
if(sampler.type == Shader::PARAMETER_SAMPLER && sampler.rel.type == Shader::PARAMETER_VOID)
{
- sampleTexture(c, sampler.index, u, v, w, q, dsx, dsy, project, bias, gradients, lodProvided);
+ sampleTexture(tmp, sampler.index, u, v, w, q, dsx, dsy, project, method);
}
else
{
- Int index = As<Int>(Float(fetchRegisterF(sampler).x.x));
+ Int index = As<Int>(Float(fetchRegister(sampler).x.x));
for(int i = 0; i < TEXTURE_IMAGE_UNITS; i++)
{
@@ -640,25 +642,30 @@
{
If(index == i)
{
- sampleTexture(c, i, u, v, w, q, dsx, dsy, project, bias, gradients, lodProvided);
+ sampleTexture(tmp, i, u, v, w, q, dsx, dsy, project, method);
// FIXME: When the sampler states are the same, we could use one sampler and just index the texture
}
}
}
}
+
+ c.x = tmp[(sampler.swizzle >> 0) & 0x3];
+ c.y = tmp[(sampler.swizzle >> 2) & 0x3];
+ c.z = tmp[(sampler.swizzle >> 4) & 0x3];
+ c.w = tmp[(sampler.swizzle >> 6) & 0x3];
}
- void PixelProgram::sampleTexture(Vector4f &c, int stage, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, bool project, bool bias, bool gradients, bool lodProvided)
+ void PixelProgram::sampleTexture(Vector4f &c, int stage, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, bool project, SamplerMethod method)
{
-#if PERF_PROFILE
- Long texTime = Ticks();
-#endif
+ #if PERF_PROFILE
+ Long texTime = Ticks();
+ #endif
Pointer<Byte> texture = data + OFFSET(DrawData, mipmap) + stage * sizeof(Texture);
if(!project)
{
- sampler[stage]->sampleTexture(texture, c, u, v, w, q, dsx, dsy, bias, gradients, lodProvided);
+ sampler[stage]->sampleTexture(texture, c, u, v, w, q, dsx, dsy, method);
}
else
{
@@ -668,12 +675,12 @@
Float4 v_q = v * rq;
Float4 w_q = w * rq;
- sampler[stage]->sampleTexture(texture, c, u_q, v_q, w_q, q, dsx, dsy, bias, gradients, lodProvided);
+ sampler[stage]->sampleTexture(texture, c, u_q, v_q, w_q, q, dsx, dsy, method);
}
-#if PERF_PROFILE
- cycles[PERF_TEX] += Ticks() - texTime;
-#endif
+ #if PERF_PROFILE
+ cycles[PERF_TEX] += Ticks() - texTime;
+ #endif
}
void PixelProgram::clampColor(Vector4f oC[RENDERTARGETS])
@@ -743,7 +750,7 @@
return enable;
}
- Vector4f PixelProgram::fetchRegisterF(const Src &src, unsigned int offset)
+ Vector4f PixelProgram::fetchRegister(const Src &src, unsigned int offset)
{
Vector4f reg;
unsigned int i = src.index + offset;
@@ -989,8 +996,8 @@
void PixelProgram::M3X2(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f row0 = fetchRegisterF(src1, 0);
- Vector4f row1 = fetchRegisterF(src1, 1);
+ Vector4f row0 = fetchRegister(src1, 0);
+ Vector4f row1 = fetchRegister(src1, 1);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
@@ -998,9 +1005,9 @@
void PixelProgram::M3X3(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f row0 = fetchRegisterF(src1, 0);
- Vector4f row1 = fetchRegisterF(src1, 1);
- Vector4f row2 = fetchRegisterF(src1, 2);
+ Vector4f row0 = fetchRegister(src1, 0);
+ Vector4f row1 = fetchRegister(src1, 1);
+ Vector4f row2 = fetchRegister(src1, 2);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
@@ -1009,10 +1016,10 @@
void PixelProgram::M3X4(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f row0 = fetchRegisterF(src1, 0);
- Vector4f row1 = fetchRegisterF(src1, 1);
- Vector4f row2 = fetchRegisterF(src1, 2);
- Vector4f row3 = fetchRegisterF(src1, 3);
+ Vector4f row0 = fetchRegister(src1, 0);
+ Vector4f row1 = fetchRegister(src1, 1);
+ Vector4f row2 = fetchRegister(src1, 2);
+ Vector4f row3 = fetchRegister(src1, 3);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
@@ -1022,9 +1029,9 @@
void PixelProgram::M4X3(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f row0 = fetchRegisterF(src1, 0);
- Vector4f row1 = fetchRegisterF(src1, 1);
- Vector4f row2 = fetchRegisterF(src1, 2);
+ Vector4f row0 = fetchRegister(src1, 0);
+ Vector4f row1 = fetchRegister(src1, 1);
+ Vector4f row2 = fetchRegister(src1, 2);
dst.x = dot4(src0, row0);
dst.y = dot4(src0, row1);
@@ -1033,10 +1040,10 @@
void PixelProgram::M4X4(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f row0 = fetchRegisterF(src1, 0);
- Vector4f row1 = fetchRegisterF(src1, 1);
- Vector4f row2 = fetchRegisterF(src1, 2);
- Vector4f row3 = fetchRegisterF(src1, 3);
+ Vector4f row0 = fetchRegister(src1, 0);
+ Vector4f row1 = fetchRegister(src1, 1);
+ Vector4f row2 = fetchRegister(src1, 2);
+ Vector4f row3 = fetchRegister(src1, 3);
dst.x = dot4(src0, row0);
dst.y = dot4(src0, row1);
@@ -1046,13 +1053,7 @@
void PixelProgram::TEXLD(Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias)
{
- Vector4f tmp;
- sampleTexture(tmp, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, project, bias);
-
- dst.x = tmp[(src1.swizzle >> 0) & 0x3];
- dst.y = tmp[(src1.swizzle >> 2) & 0x3];
- dst.z = tmp[(src1.swizzle >> 4) & 0x3];
- dst.w = tmp[(src1.swizzle >> 6) & 0x3];
+ sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, project, bias ? Bias : Implicit);
}
void PixelProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, bool project, bool bias)
@@ -1085,26 +1086,14 @@
UNIMPLEMENTED();
}
- void PixelProgram::TEXLDD(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project, bool bias)
+ void PixelProgram::TEXLDD(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project)
{
- Vector4f tmp;
- sampleTexture(tmp, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, project, bias, true);
-
- dst.x = tmp[(src1.swizzle >> 0) & 0x3];
- dst.y = tmp[(src1.swizzle >> 2) & 0x3];
- dst.z = tmp[(src1.swizzle >> 4) & 0x3];
- dst.w = tmp[(src1.swizzle >> 6) & 0x3];
+ sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, project, Grad);
}
- void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias)
+ void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, bool project)
{
- Vector4f tmp;
- sampleTexture(tmp, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, project, bias, false, true);
-
- dst.x = tmp[(src1.swizzle >> 0) & 0x3];
- dst.y = tmp[(src1.swizzle >> 2) & 0x3];
- dst.z = tmp[(src1.swizzle >> 4) & 0x3];
- dst.w = tmp[(src1.swizzle >> 6) & 0x3];
+ sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, project, Lod);
}
void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)
@@ -1458,7 +1447,7 @@
}
else
{
- Int4 condition = As<Int4>(fetchRegisterF(src).x);
+ Int4 condition = As<Int4>(fetchRegister(src).x);
IF(condition);
}
}
@@ -1627,7 +1616,7 @@
Nucleus::setInsertBlock(testBlock);
enableContinue = restoreContinue;
- const Vector4f &src = fetchRegisterF(temporaryRegister);
+ const Vector4f &src = fetchRegister(temporaryRegister);
Int4 condition = As<Int4>(src.x);
condition &= enableStack[enableIndex - 1];
enableStack[enableIndex] = condition;