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
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 @@ namespace sw
{
this->swizzleR = swizzleR;
}
void Sampler::setSwizzleG(SwizzleType swizzleG)
{
this->swizzleG = swizzleG;
......@@ -457,6 +457,11 @@ namespace sw
return ADDRESSING_CLAMP;
}
if(textureType == TEXTURE_2D_ARRAY || textureType == TEXTURE_2D)
{
return ADDRESSING_LAYER;
}
return addressingModeW;
}
}
......@@ -100,7 +100,7 @@ namespace sw
MIPMAP_NONE,
MIPMAP_POINT,
MIPMAP_LINEAR,
MIPMAP_LAST = MIPMAP_LINEAR
};
......@@ -111,8 +111,9 @@ namespace sw
ADDRESSING_MIRROR,
ADDRESSING_MIRRORONCE,
ADDRESSING_BORDER,
ADDRESSING_LAYER,
ADDRESSING_LAST = ADDRESSING_BORDER
ADDRESSING_LAST = ADDRESSING_LAYER
};
enum SwizzleType : unsigned int
......
......@@ -756,20 +756,9 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
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 @@ 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));
uuuu = Short4(Int4(clamp * Float4(1 << 16)));
return Short4(Int4(clamp * Float4(1 << 16)));
}
else if(addressingMode == ADDRESSING_MIRROR)
{
......@@ -2047,7 +2025,7 @@ namespace sw
convert ^= mirror;
uuuu = Short4(convert);
return Short4(convert);
}
else if(addressingMode == ADDRESSING_MIRRORONCE)
{
......@@ -2058,23 +2036,11 @@ namespace sw
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)));
}
}
......
......@@ -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(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);
......
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