Commit 7bb62683 by Nicolas Capens

Refactor texture coordinate addressing.

Unify address() and addressW() by introducing a new addressing mode. Change-Id: I09f9cbbe7800cfd5ef737322d680327aeddd27f1 Reviewed-on: https://swiftshader-review.googlesource.com/4714Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 3b96fa85
...@@ -42,7 +42,7 @@ namespace sw ...@@ -42,7 +42,7 @@ namespace sw
memset(&mipmap, 0, sizeof(Mipmap)); memset(&mipmap, 0, sizeof(Mipmap));
for(int face = 0; face < 6; face++) for(int face = 0; face < 6; face++)
{ {
mipmap.buffer[face] = &zero; mipmap.buffer[face] = &zero;
} }
...@@ -316,7 +316,7 @@ namespace sw ...@@ -316,7 +316,7 @@ namespace sw
{ {
this->swizzleR = swizzleR; this->swizzleR = swizzleR;
} }
void Sampler::setSwizzleG(SwizzleType swizzleG) void Sampler::setSwizzleG(SwizzleType swizzleG)
{ {
this->swizzleG = swizzleG; this->swizzleG = swizzleG;
...@@ -457,6 +457,11 @@ namespace sw ...@@ -457,6 +457,11 @@ namespace sw
return ADDRESSING_CLAMP; return ADDRESSING_CLAMP;
} }
if(textureType == TEXTURE_2D_ARRAY || textureType == TEXTURE_2D)
{
return ADDRESSING_LAYER;
}
return addressingModeW; return addressingModeW;
} }
} }
...@@ -100,7 +100,7 @@ namespace sw ...@@ -100,7 +100,7 @@ namespace sw
MIPMAP_NONE, MIPMAP_NONE,
MIPMAP_POINT, MIPMAP_POINT,
MIPMAP_LINEAR, MIPMAP_LINEAR,
MIPMAP_LAST = MIPMAP_LINEAR MIPMAP_LAST = MIPMAP_LINEAR
}; };
...@@ -111,8 +111,9 @@ namespace sw ...@@ -111,8 +111,9 @@ namespace sw
ADDRESSING_MIRROR, ADDRESSING_MIRROR,
ADDRESSING_MIRRORONCE, ADDRESSING_MIRRORONCE,
ADDRESSING_BORDER, ADDRESSING_BORDER,
ADDRESSING_LAYER,
ADDRESSING_LAST = ADDRESSING_BORDER ADDRESSING_LAST = ADDRESSING_LAYER
}; };
enum SwizzleType : unsigned int enum SwizzleType : unsigned int
......
...@@ -756,20 +756,9 @@ namespace sw ...@@ -756,20 +756,9 @@ namespace sw
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD); selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
Short4 uuuu; Short4 uuuu = address(u, state.addressingModeU, mipmap);
Short4 vvvv; Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww; Short4 wwww = address(w, state.addressingModeW, mipmap);
address(uuuu, u, state.addressingModeU);
address(vvvv, v, state.addressingModeV);
if(state.textureType == TEXTURE_2D_ARRAY)
{
addressW(wwww, w, mipmap);
}
else
{
wwww = vvvv;
}
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{ {
...@@ -972,13 +961,9 @@ namespace sw ...@@ -972,13 +961,9 @@ namespace sw
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD); selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
Short4 uuuu; Short4 uuuu = address(u_, state.addressingModeU, mipmap);
Short4 vvvv; Short4 vvvv = address(v_, state.addressingModeV, mipmap);
Short4 wwww; Short4 wwww = address(w_, state.addressingModeW, mipmap);
address(uuuu, u_, state.addressingModeU);
address(vvvv, v_, state.addressingModeV);
addressW(wwww, w_, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{ {
...@@ -1248,20 +1233,9 @@ namespace sw ...@@ -1248,20 +1233,9 @@ namespace sw
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD); selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
Short4 uuuu; Short4 uuuu = address(u, state.addressingModeU, mipmap);
Short4 vvvv; Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww; Short4 wwww = address(w, state.addressingModeW, mipmap);
address(uuuu, u, state.addressingModeU);
address(vvvv, v, state.addressingModeV);
if(state.textureType == TEXTURE_2D_ARRAY)
{
addressW(wwww, w, mipmap);
}
else
{
wwww = vvvv;
}
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{ {
...@@ -1325,13 +1299,9 @@ namespace sw ...@@ -1325,13 +1299,9 @@ namespace sw
selectMipmap(texture, buffer, mipmap, lod, face, secondLOD); selectMipmap(texture, buffer, mipmap, lod, face, secondLOD);
Short4 uuuu; Short4 uuuu = address(u, state.addressingModeU, mipmap);
Short4 vvvv; Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww; Short4 wwww = address(w, state.addressingModeW, mipmap);
address(uuuu, u, state.addressingModeU);
address(vvvv, v, state.addressingModeV);
addressW(wwww, w, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{ {
...@@ -2032,13 +2002,21 @@ namespace sw ...@@ -2032,13 +2002,21 @@ namespace sw
} }
} }
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)); 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) else if(addressingMode == ADDRESSING_MIRROR)
{ {
...@@ -2047,7 +2025,7 @@ namespace sw ...@@ -2047,7 +2025,7 @@ namespace sw
convert ^= mirror; convert ^= mirror;
uuuu = Short4(convert); return Short4(convert);
} }
else if(addressingMode == ADDRESSING_MIRRORONCE) else if(addressingMode == ADDRESSING_MIRRORONCE)
{ {
...@@ -2058,23 +2036,11 @@ namespace sw ...@@ -2058,23 +2036,11 @@ namespace sw
convert -= Int4(0x00008000, 0x00008000, 0x00008000, 0x00008000); convert -= Int4(0x00008000, 0x00008000, 0x00008000, 0x00008000);
convert = As<Int4>(Pack(convert, convert)); 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) else // Wrap (or border)
{ {
uuuu = Short4(Int4(uw * Float4(1 << 16))); return 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);
} }
} }
......
...@@ -46,8 +46,7 @@ namespace sw ...@@ -46,8 +46,7 @@ namespace sw
void sampleTexel(Vector4s &c, Short4 &u, Short4 &v, Short4 &s, Pointer<Byte> &mipmap, Pointer<Byte> buffer[4]); 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 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 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); Short4 address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte>& mipmap);
void addressW(Short4 &uuuu, Float4 &uw, Pointer<Byte>& mipmap);
void convertFixed12(Short4 &ci, Float4 &cf); void convertFixed12(Short4 &ci, Float4 &cf);
void convertFixed12(Vector4s &cs, Vector4f &cf); void convertFixed12(Vector4s &cs, Vector4f &cf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment