Perform coordinate clamping on border addressing mode. The border addressing mode should ideally blend with the border color when using linear filtering. Until we have a border of pixels around 2D textures, we should probably avoid bleeding pixels from the opposite edge and just clamp the coordinates. Change-Id: I7afbb629998732b62413e00ba7bcd55340c7b9bb Reviewed-on: https://swiftshader-review.googlesource.com/14289 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp index b2da001..1c97628 100644 --- a/src/Shader/SamplerCore.cpp +++ b/src/Shader/SamplerCore.cpp
@@ -2332,7 +2332,7 @@ { return Min(Max(Short4(RoundInt(uw)), Short4(0)), *Pointer<Short4>(mipmap + OFFSET(Mipmap, depth)) - Short4(1)); } - else if(addressingMode == ADDRESSING_CLAMP) + else if(addressingMode == ADDRESSING_CLAMP || addressingMode == ADDRESSING_BORDER) { Float4 clamp = Min(Max(uw, Float4(0.0f)), Float4(65535.0f / 65536.0f)); @@ -2358,7 +2358,7 @@ return As<Short4>(Int2(convert)) + Short4(0x8000u); } - else // Wrap (or border) + else // Wrap { return Short4(Int4(uw * Float4(1 << 16))); } @@ -2392,6 +2392,7 @@ switch(addressingMode) { case ADDRESSING_CLAMP: + case ADDRESSING_BORDER: { Float4 one = As<Float4>(Int4(oneBits)); coord = Min(Max(coord, Float4(0.0f)), one); @@ -2413,7 +2414,7 @@ coord = one - Abs(two * Frac(Min(Max(coord, -one), two) * half) - one); } break; - default: // Wrap (or border) + default: // Wrap coord = Frac(coord); break; }