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/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index dc829ef..e0ecd73 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -136,11 +136,11 @@
Vector4f s3;
Vector4f s4;
- 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)
{
@@ -647,7 +647,7 @@
}
}
- Vector4f VertexProgram::fetchRegisterF(const Src &src, unsigned int offset)
+ Vector4f VertexProgram::fetchRegister(const Src &src, unsigned int offset)
{
Vector4f reg;
unsigned int i = src.index + offset;
@@ -830,7 +830,7 @@
if(src.rel.deterministic)
{
Int a = relativeAddress(src, src.bufferIndex);
-
+
c.x = c.y = c.z = c.w = *Pointer<Float4>(uniformAddress(src.bufferIndex, i, a));
c.x = c.x.xxxx;
@@ -930,8 +930,8 @@
void VertexProgram::M3X2(Vector4f &dst, Vector4f &src0, 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);
@@ -939,9 +939,9 @@
void VertexProgram::M3X3(Vector4f &dst, Vector4f &src0, 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);
@@ -950,10 +950,10 @@
void VertexProgram::M3X4(Vector4f &dst, Vector4f &src0, 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);
@@ -963,9 +963,9 @@
void VertexProgram::M4X3(Vector4f &dst, Vector4f &src0, 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);
@@ -974,10 +974,10 @@
void VertexProgram::M4X4(Vector4f &dst, Vector4f &src0, 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);
@@ -1259,7 +1259,7 @@
}
else
{
- Int4 condition = As<Int4>(fetchRegisterF(src).x);
+ Int4 condition = As<Int4>(fetchRegister(src).x);
IF(condition);
}
}
@@ -1429,7 +1429,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;
@@ -1494,25 +1494,13 @@
void VertexProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Vector4f tmp;
- sampleTexture(tmp, src1, src0.x, src0.y, src0.z, src0.w);
-
- 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, Lod);
}
void VertexProgram::TEX(Vector4f &dst, Vector4f &src0, const Src &src1)
{
- Float4 lod = Float4(0.0f);
- Vector4f tmp;
- sampleTexture(tmp, src1, src0.x, src0.y, src0.z, lod);
-
- 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];
+ Float4 lod0 = Float4(0.0f);
+ sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, Lod);
}
void VertexProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3)
@@ -1557,29 +1545,36 @@
}
}
- void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q)
+ void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, SamplerMethod method)
{
+ Vector4f tmp;
+
if(s.type == Shader::PARAMETER_SAMPLER && s.rel.type == Shader::PARAMETER_VOID)
{
- Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + s.index * sizeof(Texture);
- sampler[s.index]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
+ Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[TEXTURE_IMAGE_UNITS]) + s.index * sizeof(Texture);
+ sampler[s.index]->sampleTexture(texture, tmp, u, v, w, q, a0, a0, method);
}
else
{
- Int index = As<Int>(Float(fetchRegisterF(s).x.x));
+ Int index = As<Int>(Float(fetchRegister(s).x.x));
- for(int i = 0; i < 16; i++)
+ for(int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
{
if(shader->usesSampler(i))
{
If(index == i)
{
- Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + i * sizeof(Texture);
- sampler[i]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
+ Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[TEXTURE_IMAGE_UNITS]) + i * sizeof(Texture);
+ sampler[i]->sampleTexture(texture, tmp, u, v, w, q, a0, a0, method);
// FIXME: When the sampler states are the same, we could use one sampler and just index the texture
}
}
}
}
+
+ c.x = tmp[(s.swizzle >> 0) & 0x3];
+ c.y = tmp[(s.swizzle >> 2) & 0x3];
+ c.z = tmp[(s.swizzle >> 4) & 0x3];
+ c.w = tmp[(s.swizzle >> 6) & 0x3];
}
}