Commit 01f73074 by Nicolas Capens Committed by Nicolas Capens

Enable sampling and filtering of 16-bit SNORM formats

Also fix clamping of the smallest negative value to -1.0. See https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#fundamentals-fixedfpconv Bug: b/167582422 Tests: dEQP-VK.* Change-Id: Ie77a048c2a3111c19554329e73d81a864f69cf94 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/50948 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 386b47ba
......@@ -178,6 +178,14 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa
c.z *= Float4(1.0f / 0xFF00u);
c.w *= Float4(1.0f / 0xFF00u);
break;
case VK_FORMAT_R16_SNORM:
case VK_FORMAT_R16G16_SNORM:
case VK_FORMAT_R16G16B16A16_SNORM:
c.x = Max(c.x * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.y = Max(c.y * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.z = Max(c.z * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.w = Max(c.w * Float4(1.0f / 0x7FFF), Float4(-1.0f));
break;
default:
for(int component = 0; component < textureComponentCount(); component++)
{
......@@ -232,6 +240,14 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa
c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xFF00u);
c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0xFF00u);
break;
case VK_FORMAT_R16_SNORM:
case VK_FORMAT_R16G16_SNORM:
case VK_FORMAT_R16G16B16A16_SNORM:
c.x = Max(Float4(cs.x) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.y = Max(Float4(cs.y) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.z = Max(Float4(cs.z) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
c.w = Max(Float4(cs.w) * Float4(1.0f / 0x7FFF), Float4(-1.0f));
break;
default:
for(int component = 0; component < textureComponentCount(); component++)
{
......
......@@ -2097,6 +2097,7 @@ bool Format::has8bitTextureComponents() const
case VK_FORMAT_R16G16_UNORM:
case VK_FORMAT_R16G16_SNORM:
case VK_FORMAT_R16G16B16A16_UNORM:
case VK_FORMAT_R16G16B16A16_SNORM:
case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32_UINT:
case VK_FORMAT_R32G32_SINT:
......
......@@ -793,10 +793,13 @@ void PhysicalDevice::GetFormatProperties(Format format, VkFormatProperties *pFor
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
case VK_FORMAT_R16_UNORM:
case VK_FORMAT_R16_SNORM:
case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R16G16_UNORM:
case VK_FORMAT_R16G16_SNORM:
case VK_FORMAT_R16G16_SFLOAT:
case VK_FORMAT_R16G16B16A16_UNORM:
case VK_FORMAT_R16G16B16A16_SNORM:
case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
......
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