Commit f149d95a by Chris Forbes

Wire up texture border color correctly

Bug: b/129523279 Test: dEQP-VK.*border* Change-Id: I76f3583ca9d4288c34ac897e5bc382b4c417488e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30111Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 28f142f1
...@@ -283,25 +283,6 @@ namespace sw ...@@ -283,25 +283,6 @@ namespace sw
this->sRGB = sRGB; this->sRGB = sRGB;
} }
void Sampler::setBorderColor(const Color<float> &borderColor)
{
// FIXME: Compact into generic function // FIXME: Clamp
short r = iround(0xFFFF * borderColor.r);
short g = iround(0xFFFF * borderColor.g);
short b = iround(0xFFFF * borderColor.b);
short a = iround(0xFFFF * borderColor.a);
texture.borderColor4[0][0] = texture.borderColor4[0][1] = texture.borderColor4[0][2] = texture.borderColor4[0][3] = r;
texture.borderColor4[1][0] = texture.borderColor4[1][1] = texture.borderColor4[1][2] = texture.borderColor4[1][3] = g;
texture.borderColor4[2][0] = texture.borderColor4[2][1] = texture.borderColor4[2][2] = texture.borderColor4[2][3] = b;
texture.borderColor4[3][0] = texture.borderColor4[3][1] = texture.borderColor4[3][2] = texture.borderColor4[3][3] = a;
texture.borderColorF[0][0] = texture.borderColorF[0][1] = texture.borderColorF[0][2] = texture.borderColorF[0][3] = borderColor.r;
texture.borderColorF[1][0] = texture.borderColorF[1][1] = texture.borderColorF[1][2] = texture.borderColorF[1][3] = borderColor.g;
texture.borderColorF[2][0] = texture.borderColorF[2][1] = texture.borderColorF[2][2] = texture.borderColorF[2][3] = borderColor.b;
texture.borderColorF[3][0] = texture.borderColorF[3][1] = texture.borderColorF[3][2] = texture.borderColorF[3][3] = borderColor.a;
}
void Sampler::setMaxAnisotropy(float maxAnisotropy) void Sampler::setMaxAnisotropy(float maxAnisotropy)
{ {
texture.maxAnisotropy = maxAnisotropy; texture.maxAnisotropy = maxAnisotropy;
......
...@@ -55,8 +55,6 @@ namespace sw ...@@ -55,8 +55,6 @@ namespace sw
float4 heightLOD; float4 heightLOD;
float4 depthLOD; float4 depthLOD;
word4 borderColor4[4]; // FIXME(b/129523279): Part of Vulkan sampler.
float4 borderColorF[4]; // FIXME(b/129523279): Part of Vulkan sampler.
float maxAnisotropy; // FIXME(b/129523279): Part of Vulkan sampler. float maxAnisotropy; // FIXME(b/129523279): Part of Vulkan sampler.
float minLod; // FIXME(b/129523279): Part of Vulkan sampler. float minLod; // FIXME(b/129523279): Part of Vulkan sampler.
float maxLod; // FIXME(b/129523279): Part of Vulkan sampler. float maxLod; // FIXME(b/129523279): Part of Vulkan sampler.
...@@ -163,6 +161,7 @@ namespace sw ...@@ -163,6 +161,7 @@ namespace sw
VkComponentMapping swizzle; VkComponentMapping swizzle;
bool highPrecisionFiltering; bool highPrecisionFiltering;
CompareFunc compare; CompareFunc compare;
VkBorderColor border;
#if PERF_PROFILE #if PERF_PROFILE
bool compressedFormat; bool compressedFormat;
...@@ -184,7 +183,6 @@ namespace sw ...@@ -184,7 +183,6 @@ namespace sw
void setAddressingModeV(AddressingMode addressingMode); void setAddressingModeV(AddressingMode addressingMode);
void setAddressingModeW(AddressingMode addressingMode); void setAddressingModeW(AddressingMode addressingMode);
void setReadSRGB(bool sRGB); void setReadSRGB(bool sRGB);
void setBorderColor(const Color<float> &borderColor);
void setMaxAnisotropy(float maxAnisotropy); void setMaxAnisotropy(float maxAnisotropy);
void setHighPrecisionFiltering(bool highPrecisionFiltering); void setHighPrecisionFiltering(bool highPrecisionFiltering);
void setCompareFunc(CompareFunc compare); void setCompareFunc(CompareFunc compare);
......
...@@ -170,6 +170,7 @@ namespace sw ...@@ -170,6 +170,7 @@ namespace sw
case VK_FORMAT_R32G32_SINT: case VK_FORMAT_R32G32_SINT:
case VK_FORMAT_R32G32_UINT: case VK_FORMAT_R32G32_UINT:
c.z = As<Float4>(UInt4(0)); c.z = As<Float4>(UInt4(0));
c.w = As<Float4>(UInt4(1));
case VK_FORMAT_R8G8B8A8_SINT: case VK_FORMAT_R8G8B8A8_SINT:
case VK_FORMAT_R8G8B8A8_UINT: case VK_FORMAT_R8G8B8A8_UINT:
case VK_FORMAT_R16G16B16A16_SINT: case VK_FORMAT_R16G16B16A16_SINT:
...@@ -359,12 +360,30 @@ namespace sw ...@@ -359,12 +360,30 @@ namespace sw
state.addressingModeV == ADDRESSING_BORDER || state.addressingModeV == ADDRESSING_BORDER ||
(state.addressingModeW == ADDRESSING_BORDER && state.textureType == TEXTURE_3D)) (state.addressingModeW == ADDRESSING_BORDER && state.textureType == TEXTURE_3D))
{ {
Short4 b; Short4 borderRgb;
Short4 borderA;
switch (state.border)
{
case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
borderRgb = Short4(0);
borderA = Short4(0);
break;
case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
borderRgb = Short4(0);
borderA = hasUnsignedTextureComponent(0) ? Short4(0xffff) : Short4(0x7fff);
break;
case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
borderRgb = hasUnsignedTextureComponent(0) ? Short4(0xffff) : Short4(0x7fff);
borderA = hasUnsignedTextureComponent(0) ? Short4(0xffff) : Short4(0x7fff);
break;
default:
UNIMPLEMENTED("snorm/unorm border %u", state.border);
}
c.x = (borderMask & c.x) | (~borderMask & (*Pointer<Short4>(texture + OFFSET(Texture,borderColor4[0])) >> (hasUnsignedTextureComponent(0) ? 0 : 1))); c.x = (borderMask & c.x) | (~borderMask & borderRgb);
c.y = (borderMask & c.y) | (~borderMask & (*Pointer<Short4>(texture + OFFSET(Texture,borderColor4[1])) >> (hasUnsignedTextureComponent(1) ? 0 : 1))); c.y = (borderMask & c.y) | (~borderMask & borderRgb);
c.z = (borderMask & c.z) | (~borderMask & (*Pointer<Short4>(texture + OFFSET(Texture,borderColor4[2])) >> (hasUnsignedTextureComponent(2) ? 0 : 1))); c.z = (borderMask & c.z) | (~borderMask & borderRgb);
c.w = (borderMask & c.w) | (~borderMask & (*Pointer<Short4>(texture + OFFSET(Texture,borderColor4[3])) >> (hasUnsignedTextureComponent(3) ? 0 : 1))); c.w = (borderMask & c.w) | (~borderMask & borderA);
} }
return c; return c;
...@@ -831,12 +850,43 @@ namespace sw ...@@ -831,12 +850,43 @@ namespace sw
state.addressingModeV == ADDRESSING_BORDER || state.addressingModeV == ADDRESSING_BORDER ||
(state.addressingModeW == ADDRESSING_BORDER && state.textureType == TEXTURE_3D)) (state.addressingModeW == ADDRESSING_BORDER && state.textureType == TEXTURE_3D))
{ {
Int4 b; Int4 borderRgb;
Int4 borderA;
switch (state.border)
{
case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
borderRgb = As<Int4>(Float4(0));
borderA = As<Int4>(Float4(0));
break;
case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
borderRgb = Int4(0);
borderA = Int4(0);
break;
case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
borderRgb = As<Int4>(Float4(0));
borderA = As<Int4>(Float4(1));
break;
case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
borderRgb = Int4(0);
borderA = Int4(1);
break;
case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
borderRgb = As<Int4>(Float4(1));
borderA = As<Int4>(Float4(1));
break;
case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
borderRgb = Int4(1);
borderA = Int4(1);
break;
default:
UNIMPLEMENTED("sint/uint/sfloat border: %u", state.border);
}
c.x = As<Float4>((borderMask & As<Int4>(c.x)) | (~borderMask & *Pointer<Int4>(texture + OFFSET(Texture,borderColorF[0])))); c.x = As<Float4>((borderMask & As<Int4>(c.x)) | (~borderMask & borderRgb));
c.y = As<Float4>((borderMask & As<Int4>(c.y)) | (~borderMask & *Pointer<Int4>(texture + OFFSET(Texture,borderColorF[1])))); c.y = As<Float4>((borderMask & As<Int4>(c.y)) | (~borderMask & borderRgb));
c.z = As<Float4>((borderMask & As<Int4>(c.z)) | (~borderMask & *Pointer<Int4>(texture + OFFSET(Texture,borderColorF[2])))); c.z = As<Float4>((borderMask & As<Int4>(c.z)) | (~borderMask & borderRgb));
c.w = As<Float4>((borderMask & As<Int4>(c.w)) | (~borderMask & *Pointer<Int4>(texture + OFFSET(Texture,borderColorF[3])))); c.w = As<Float4>((borderMask & As<Int4>(c.w)) | (~borderMask & borderA));
} }
return c; return c;
......
...@@ -83,6 +83,7 @@ void SpirvShader::emitSamplerFunction( ...@@ -83,6 +83,7 @@ void SpirvShader::emitSamplerFunction(
samplerState.textureType = convertTextureType(imageView->getType()); samplerState.textureType = convertTextureType(imageView->getType());
samplerState.textureFormat = imageView->getFormat(); samplerState.textureFormat = imageView->getFormat();
samplerState.textureFilter = convertFilterMode(sampler); samplerState.textureFilter = convertFilterMode(sampler);
samplerState.border = sampler->borderColor;
samplerState.addressingModeU = convertAddressingMode(sampler->addressModeU, imageView->getType()); samplerState.addressingModeU = convertAddressingMode(sampler->addressModeU, imageView->getType());
samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV, imageView->getType()); samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV, imageView->getType());
......
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