Refactor sampleTexel() to use a return value.
We can rely on return value optimization to return Reactor types at the
same cost as passing them by reference.
Change-Id: I9f092bcefd17131a07bef32032c5f2ab98392328
Reviewed-on: https://swiftshader-review.googlesource.com/10569
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index 9c58e70..62f76fa 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -802,24 +802,19 @@
if(state.textureFilter == FILTER_POINT || texelFetch)
{
- sampleTexel(c, uuuu, vvvv, wwww, offset, mipmap, buffer, function);
+ c = sampleTexel(uuuu, vvvv, wwww, offset, mipmap, buffer, function);
}
else
{
- Vector4s c0;
- Vector4s c1;
- Vector4s c2;
- Vector4s c3;
-
Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 2 : +1, lod);
Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 2 : +1, lod);
- sampleTexel(c0, uuuu0, vvvv0, wwww, offset, mipmap, buffer, function);
- sampleTexel(c1, uuuu1, vvvv0, wwww, offset, mipmap, buffer, function);
- sampleTexel(c2, uuuu0, vvvv1, wwww, offset, mipmap, buffer, function);
- sampleTexel(c3, uuuu1, vvvv1, wwww, offset, mipmap, buffer, function);
+ Vector4s c0 = sampleTexel(uuuu0, vvvv0, wwww, offset, mipmap, buffer, function);
+ Vector4s c1 = sampleTexel(uuuu1, vvvv0, wwww, offset, mipmap, buffer, function);
+ Vector4s c2 = sampleTexel(uuuu0, vvvv1, wwww, offset, mipmap, buffer, function);
+ Vector4s c3 = sampleTexel(uuuu1, vvvv1, wwww, offset, mipmap, buffer, function);
if(!gather) // Blend
{
@@ -998,7 +993,7 @@
if(state.textureFilter == FILTER_POINT || texelFetch)
{
- sampleTexel(c_, uuuu, vvvv, wwww, offset, mipmap, buffer, function);
+ c_ = sampleTexel(uuuu, vvvv, wwww, offset, mipmap, buffer, function);
}
else
{
@@ -1070,7 +1065,7 @@
{
for(int k = 0; k < 2; k++)
{
- sampleTexel(c[i][j][k], u[i][j][k], v[i][j][k], s[i][j][k], offset, mipmap, buffer, function);
+ c[i][j][k] = sampleTexel(u[i][j][k], v[i][j][k], s[i][j][k], offset, mipmap, buffer, function);
if(componentCount >= 1) { if(hasUnsignedTextureComponent(0)) c[i][j][k].x = MulHigh(As<UShort4>(c[i][j][k].x), f[1 - i][1 - j][1 - k]); else c[i][j][k].x = MulHigh(c[i][j][k].x, fs[1 - i][1 - j][1 - k]); }
if(componentCount >= 2) { if(hasUnsignedTextureComponent(1)) c[i][j][k].y = MulHigh(As<UShort4>(c[i][j][k].y), f[1 - i][1 - j][1 - k]); else c[i][j][k].y = MulHigh(c[i][j][k].y, fs[1 - i][1 - j][1 - k]); }
@@ -1274,21 +1269,16 @@
if(state.textureFilter == FILTER_POINT || (function == Fetch))
{
- sampleTexel(c, x0, y0, z0, w, mipmap, buffer, function);
+ c = sampleTexel(x0, y0, z0, w, mipmap, buffer, function);
}
else
{
- Vector4f c0;
- Vector4f c1;
- Vector4f c2;
- Vector4f c3;
-
y1 *= pitchP;
- sampleTexel(c0, x0, y0, z0, w, mipmap, buffer, function);
- sampleTexel(c1, x1, y0, z0, w, mipmap, buffer, function);
- sampleTexel(c2, x0, y1, z0, w, mipmap, buffer, function);
- sampleTexel(c3, x1, y1, z0, w, mipmap, buffer, function);
+ Vector4f c0 = sampleTexel(x0, y0, z0, w, mipmap, buffer, function);
+ Vector4f c1 = sampleTexel(x1, y0, z0, w, mipmap, buffer, function);
+ Vector4f c2 = sampleTexel(x0, y1, z0, w, mipmap, buffer, function);
+ Vector4f c3 = sampleTexel(x1, y1, z0, w, mipmap, buffer, function);
if(!gather) // Blend
{
@@ -1341,30 +1331,21 @@
if(state.textureFilter == FILTER_POINT || (function == Fetch))
{
- sampleTexel(c, x0, y0, z0, w, mipmap, buffer, function);
+ c = sampleTexel(x0, y0, z0, w, mipmap, buffer, function);
}
else
{
- Vector4f &c0 = c;
- Vector4f c1;
- Vector4f c2;
- Vector4f c3;
- Vector4f c4;
- Vector4f c5;
- Vector4f c6;
- Vector4f c7;
-
y1 *= pitchP;
z1 *= sliceP;
- sampleTexel(c0, x0, y0, z0, w, mipmap, buffer, function);
- sampleTexel(c1, x1, y0, z0, w, mipmap, buffer, function);
- sampleTexel(c2, x0, y1, z0, w, mipmap, buffer, function);
- sampleTexel(c3, x1, y1, z0, w, mipmap, buffer, function);
- sampleTexel(c4, x0, y0, z1, w, mipmap, buffer, function);
- sampleTexel(c5, x1, y0, z1, w, mipmap, buffer, function);
- sampleTexel(c6, x0, y1, z1, w, mipmap, buffer, function);
- sampleTexel(c7, x1, y1, z1, w, mipmap, buffer, function);
+ Vector4f c0 = sampleTexel(x0, y0, z0, w, mipmap, buffer, function);
+ Vector4f c1 = sampleTexel(x1, y0, z0, w, mipmap, buffer, function);
+ Vector4f c2 = sampleTexel(x0, y1, z0, w, mipmap, buffer, function);
+ Vector4f c3 = sampleTexel(x1, y1, z0, w, mipmap, buffer, function);
+ Vector4f c4 = sampleTexel(x0, y0, z1, w, mipmap, buffer, function);
+ Vector4f c5 = sampleTexel(x1, y0, z1, w, mipmap, buffer, function);
+ Vector4f c6 = sampleTexel(x0, y1, z1, w, mipmap, buffer, function);
+ Vector4f c7 = sampleTexel(x1, y1, z1, w, mipmap, buffer, function);
// Blend first slice
if(componentCount >= 1) c0.x = c0.x + fu * (c1.x - c0.x);
@@ -1399,10 +1380,10 @@
if(componentCount >= 4) c4.w = c4.w + fv * (c6.w - c4.w);
// Blend slices
- if(componentCount >= 1) c0.x = c0.x + fw * (c4.x - c0.x);
- if(componentCount >= 2) c0.y = c0.y + fw * (c4.y - c0.y);
- if(componentCount >= 3) c0.z = c0.z + fw * (c4.z - c0.z);
- if(componentCount >= 4) c0.w = c0.w + fw * (c4.w - c0.w);
+ if(componentCount >= 1) c.x = c0.x + fw * (c4.x - c0.x);
+ if(componentCount >= 2) c.y = c0.y + fw * (c4.y - c0.y);
+ if(componentCount >= 3) c.z = c0.z + fw * (c4.z - c0.z);
+ if(componentCount >= 4) c.w = c0.w + fw * (c4.w - c0.w);
}
}
@@ -1760,8 +1741,10 @@
}
}
- void SamplerCore::sampleTexel(Vector4s &c, UInt index[4], Pointer<Byte> buffer[4])
+ Vector4s SamplerCore::sampleTexel(UInt index[4], Pointer<Byte> buffer[4])
{
+ Vector4s c;
+
int f0 = state.textureType == TEXTURE_CUBE ? 0 : 0;
int f1 = state.textureType == TEXTURE_CUBE ? 1 : 0;
int f2 = state.textureType == TEXTURE_CUBE ? 2 : 0;
@@ -1988,12 +1971,15 @@
}
}
else ASSERT(false);
+
+ return c;
}
- void SamplerCore::sampleTexel(Vector4s &c, Short4 &uuuu, Short4 &vvvv, Short4 &wwww, Vector4f &offset, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function)
+ Vector4s SamplerCore::sampleTexel(Short4 &uuuu, Short4 &vvvv, Short4 &wwww, Vector4f &offset, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function)
{
- UInt index[4];
+ Vector4s c;
+ UInt index[4];
computeIndices(index, uuuu, vvvv, wwww, offset, mipmap, function);
if(hasYuvFormat())
@@ -2092,14 +2078,17 @@
}
else
{
- sampleTexel(c, index, buffer);
+ return sampleTexel(index, buffer);
}
+
+ return c;
}
- void SamplerCore::sampleTexel(Vector4f &c, Int4 &uuuu, Int4 &vvvv, Int4 &wwww, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function)
+ Vector4f SamplerCore::sampleTexel(Int4 &uuuu, Int4 &vvvv, Int4 &wwww, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function)
{
- UInt index[4];
+ Vector4f c;
+ UInt index[4];
computeIndices(index, uuuu, vvvv, wwww, mipmap, function);
if(hasFloatTexture() || has32bitIntegerTextureComponents())
@@ -2160,8 +2149,7 @@
{
ASSERT(!hasYuvFormat());
- Vector4s cs;
- sampleTexel(cs, index, buffer);
+ Vector4s cs = sampleTexel(index, buffer);
bool isInteger = Surface::isNonNormalizedInteger(state.textureFormat);
int componentCount = textureComponentCount();
@@ -2191,6 +2179,8 @@
}
}
}
+
+ return c;
}
void SamplerCore::selectMipmap(Pointer<Byte> &texture, Pointer<Byte> buffer[4], Pointer<Byte> &mipmap, Float &lod, Int face[4], bool secondLOD)
diff --git a/src/Shader/SamplerCore.hpp b/src/Shader/SamplerCore.hpp
index e4529e2..9f8e85b 100644
--- a/src/Shader/SamplerCore.hpp
+++ b/src/Shader/SamplerCore.hpp
@@ -77,10 +77,10 @@
Short4 applyOffset(Short4 &uvw, Float4 &offset, const Int4 &whd, AddressingMode mode);
void computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 wwww, Vector4f &offset, const Pointer<Byte> &mipmap, SamplerFunction function);
void computeIndices(UInt index[4], Int4& uuuu, Int4& vvvv, Int4& wwww, const Pointer<Byte> &mipmap, SamplerFunction function);
- void sampleTexel(Vector4s &c, Short4 &u, Short4 &v, Short4 &s, Vector4f &offset, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
- void sampleTexel(Vector4f &c, Short4 &u, Short4 &v, Short4 &s, Vector4f &offset, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
- void sampleTexel(Vector4s &c, UInt index[4], Pointer<Byte> buffer[4]);
- void sampleTexel(Vector4f &c, Int4 &u, Int4 &v, Int4 &s, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
+ Vector4s sampleTexel(Short4 &u, Short4 &v, Short4 &s, Vector4f &offset, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
+ Vector4f sampleTexel(Short4 &u, Short4 &v, Short4 &s, Vector4f &offset, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
+ Vector4s sampleTexel(UInt index[4], Pointer<Byte> buffer[4]);
+ Vector4f sampleTexel(Int4 &u, Int4 &v, Int4 &s, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4], SamplerFunction function);
void selectMipmap(Pointer<Byte> &texture, Pointer<Byte> buffer[4], Pointer<Byte> &mipmap, Float &lod, Int face[4], bool secondLOD);
Short4 address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte>& mipmap);
void address(Float4 &uw, Int4& xyz0, Int4& xyz1, Float4& f, Pointer<Byte>& mipmap, Float4 &texOffset, Int4 &filter, int whd, AddressingMode addressingMode, SamplerFunction function);