Refactor texture coordinate addressing.
Unify address() and addressW() by introducing a new addressing mode.
Change-Id: I09f9cbbe7800cfd5ef737322d680327aeddd27f1
Reviewed-on: https://swiftshader-review.googlesource.com/4714
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Sampler.cpp b/src/Renderer/Sampler.cpp
index aaf6a49..8a60d95 100644
--- a/src/Renderer/Sampler.cpp
+++ b/src/Renderer/Sampler.cpp
@@ -42,7 +42,7 @@
memset(&mipmap, 0, sizeof(Mipmap));
- for(int face = 0; face < 6; face++)
+ for(int face = 0; face < 6; face++)
{
mipmap.buffer[face] = &zero;
}
@@ -316,7 +316,7 @@
{
this->swizzleR = swizzleR;
}
-
+
void Sampler::setSwizzleG(SwizzleType swizzleG)
{
this->swizzleG = swizzleG;
@@ -457,6 +457,11 @@
return ADDRESSING_CLAMP;
}
+ if(textureType == TEXTURE_2D_ARRAY || textureType == TEXTURE_2D)
+ {
+ return ADDRESSING_LAYER;
+ }
+
return addressingModeW;
}
}
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp
index 7a888ca..9580f09 100644
--- a/src/Renderer/Sampler.hpp
+++ b/src/Renderer/Sampler.hpp
@@ -100,7 +100,7 @@
MIPMAP_NONE,
MIPMAP_POINT,
MIPMAP_LINEAR,
-
+
MIPMAP_LAST = MIPMAP_LINEAR
};
@@ -111,8 +111,9 @@
ADDRESSING_MIRROR,
ADDRESSING_MIRRORONCE,
ADDRESSING_BORDER,
+ ADDRESSING_LAYER,
- ADDRESSING_LAST = ADDRESSING_BORDER
+ ADDRESSING_LAST = ADDRESSING_LAYER
};
enum SwizzleType : unsigned int
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index bbfd264..3973d1d 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -756,20 +756,9 @@
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
- Short4 uuuu;
- Short4 vvvv;
- Short4 wwww;
-
- address(uuuu, u, state.addressingModeU);
- address(vvvv, v, state.addressingModeV);
- if(state.textureType == TEXTURE_2D_ARRAY)
- {
- addressW(wwww, w, mipmap);
- }
- else
- {
- wwww = vvvv;
- }
+ Short4 uuuu = address(u, state.addressingModeU, mipmap);
+ Short4 vvvv = address(v, state.addressingModeV, mipmap);
+ Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{
@@ -972,13 +961,9 @@
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
- Short4 uuuu;
- Short4 vvvv;
- Short4 wwww;
-
- address(uuuu, u_, state.addressingModeU);
- address(vvvv, v_, state.addressingModeV);
- addressW(wwww, w_, mipmap);
+ Short4 uuuu = address(u_, state.addressingModeU, mipmap);
+ Short4 vvvv = address(v_, state.addressingModeV, mipmap);
+ Short4 wwww = address(w_, state.addressingModeW, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{
@@ -1248,20 +1233,9 @@
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
- Short4 uuuu;
- Short4 vvvv;
- Short4 wwww;
-
- address(uuuu, u, state.addressingModeU);
- address(vvvv, v, state.addressingModeV);
- if(state.textureType == TEXTURE_2D_ARRAY)
- {
- addressW(wwww, w, mipmap);
- }
- else
- {
- wwww = vvvv;
- }
+ Short4 uuuu = address(u, state.addressingModeU, mipmap);
+ Short4 vvvv = address(v, state.addressingModeV, mipmap);
+ Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{
@@ -1325,13 +1299,9 @@
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
- Short4 uuuu;
- Short4 vvvv;
- Short4 wwww;
-
- address(uuuu, u, state.addressingModeU);
- address(vvvv, v, state.addressingModeV);
- addressW(wwww, w, mipmap);
+ Short4 uuuu = address(u, state.addressingModeU, mipmap);
+ Short4 vvvv = address(v, state.addressingModeV, mipmap);
+ Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{
@@ -2032,13 +2002,21 @@
}
}
- void SamplerCore::address(Short4 &uuuu, Float4 &uw, AddressingMode addressingMode)
+ Short4 SamplerCore::address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte>& mipmap)
{
- if(addressingMode == ADDRESSING_CLAMP)
+ if(addressingMode == ADDRESSING_LAYER && state.textureType != TEXTURE_2D_ARRAY)
+ {
+ return Short4(); // Unused
+ }
+ else if(addressingMode == ADDRESSING_LAYER && state.textureType == TEXTURE_2D_ARRAY)
+ {
+ return Min(Max(Short4(RoundInt(uw)), Short4(0)), *Pointer<Short4>(mipmap + OFFSET(Mipmap, depth)) - Short4(1));
+ }
+ else if(addressingMode == ADDRESSING_CLAMP)
{
Float4 clamp = Min(Max(uw, Float4(0.0f)), Float4(65535.0f / 65536.0f));
- uuuu = Short4(Int4(clamp * Float4(1 << 16)));
+ return Short4(Int4(clamp * Float4(1 << 16)));
}
else if(addressingMode == ADDRESSING_MIRROR)
{
@@ -2047,7 +2025,7 @@
convert ^= mirror;
- uuuu = Short4(convert);
+ return Short4(convert);
}
else if(addressingMode == ADDRESSING_MIRRORONCE)
{
@@ -2058,23 +2036,11 @@
convert -= Int4(0x00008000, 0x00008000, 0x00008000, 0x00008000);
convert = As<Int4>(Pack(convert, convert));
- uuuu = As<Short4>(Int2(convert)) + Short4((short)0x8000, (short)0x8000, (short)0x8000, (short)0x8000);
+ return As<Short4>(Int2(convert)) + Short4((short)0x8000, (short)0x8000, (short)0x8000, (short)0x8000);
}
else // Wrap (or border)
{
- uuuu = Short4(Int4(uw * Float4(1 << 16)));
- }
- }
-
- void SamplerCore::addressW(Short4 &wwww, Float4 &w, Pointer<Byte>& mipmap)
- {
- if(state.textureType == TEXTURE_2D_ARRAY)
- {
- wwww = Min(Max(Short4(RoundInt(w)), Short4(0)), *Pointer<Short4>(mipmap + OFFSET(Mipmap, depth)) - Short4(1));
- }
- else
- {
- address(wwww, w, state.addressingModeW);
+ return Short4(Int4(uw * Float4(1 << 16)));
}
}
diff --git a/src/Shader/SamplerCore.hpp b/src/Shader/SamplerCore.hpp
index c080882..3dacf16 100644
--- a/src/Shader/SamplerCore.hpp
+++ b/src/Shader/SamplerCore.hpp
@@ -46,8 +46,7 @@
void sampleTexel(Vector4s &c, Short4 &u, Short4 &v, Short4 &s, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4]);
void sampleTexel(Vector4f &c, Short4 &u, Short4 &v, Short4 &s, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4]);
void selectMipmap(Pointer<Byte> &texture, Pointer<Byte> buffer[4], Pointer<Byte> &mipmap, Float &lod, Int face[4], bool secondLOD);
- void address(Short4 &uuuu, Float4 &uw, AddressingMode addressingMode);
- void addressW(Short4 &uuuu, Float4 &uw, Pointer<Byte>& mipmap);
+ Short4 address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte>& mipmap);
void convertFixed12(Short4 &ci, Float4 &cf);
void convertFixed12(Vector4s &cs, Vector4f &cf);