Add support for sampling VK_FORMAT_B4G4R4A4_UNORM_PACK32
Bug: b/131246807
Test: dEQP-VK.*b4g4r4a4_unorm*
Change-Id: Ifb319c50cf0a9f9e83c0c8074f5631f4726cc380
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30428
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index 6c17aae..e09f1c4 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -111,6 +111,12 @@
c.y *= Float4(1.0f / 0xFC00);
c.z *= Float4(1.0f / 0xF800);
break;
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+ c.x *= Float4(1.0f / 0xF000);
+ c.y *= Float4(1.0f / 0xF000);
+ c.z *= Float4(1.0f / 0xF000);
+ c.w *= Float4(1.0f / 0xF000);
+ break;
default:
ASSERT(false);
}
@@ -134,6 +140,13 @@
c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xFC00);
c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF800);
}
+ else if (state.textureFormat == VK_FORMAT_B4G4R4A4_UNORM_PACK16)
+ {
+ c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xF000);
+ c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xF000);
+ c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF000);
+ c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0xF000);
+ }
else
{
for(int component = 0; component < textureComponentCount(); component++)
@@ -205,6 +218,7 @@
case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
break;
default:
ASSERT(false);
@@ -1525,6 +1539,12 @@
c.y = (c.x & Short4(0x07E0u)) << 5;
c.x = (c.x & Short4(0xF800u));
break;
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+ c.w = (c.x << 12) & Short4(0xF000);
+ c.z = (c.x) & Short4(0xF000);
+ c.y = (c.x << 4) & Short4(0xF000);
+ c.x = (c.x << 8) & Short4(0xF000);
+ break;
default:
ASSERT(false);
}
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 924233f..c86fa81 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -1698,6 +1698,7 @@
{
switch(format)
{
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
return true;
case VK_FORMAT_R8_SNORM:
@@ -1764,6 +1765,7 @@
case VK_FORMAT_R8G8B8A8_SINT:
case VK_FORMAT_R8G8B8A8_UINT:
return true;
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
@@ -1800,6 +1802,7 @@
{
switch(format)
{
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R8_SNORM:
case VK_FORMAT_R8G8_SNORM:
@@ -1851,6 +1854,7 @@
{
switch(format)
{
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R8_SNORM:
case VK_FORMAT_R8G8_SNORM:
@@ -1904,6 +1908,7 @@
{
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
return true;
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R8_SNORM:
case VK_FORMAT_R8G8_SNORM:
@@ -1976,6 +1981,7 @@
case VK_FORMAT_R32G32_UINT:
case VK_FORMAT_R32G32_SFLOAT:
return component < 2;
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R8G8B8A8_SNORM:
case VK_FORMAT_R8G8B8A8_UNORM: