Follow up on "Add support for R8_SRGB textures"
Fixed R8G8_SRGB and R8G8B8_SRGB in the Blitter.
Enabled R8G8_SRGB tests to make sure the fix is correct.
Change-Id: Ibe7addd3f635f353abb09e0391a9a30d20392fbf
Tests: dEQP-VK.*r8g8_srgb*
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33530
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp
index bdcfe0a..2ca5f3f 100644
--- a/src/Device/Blitter.cpp
+++ b/src/Device/Blitter.cpp
@@ -334,6 +334,7 @@
break;
case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8_SRGB:
c.x = Float(Int(*Pointer<Byte>(element + 0)));
c.y = Float(Int(*Pointer<Byte>(element + 1)));
c.w = float(0xFF);
@@ -618,12 +619,10 @@
case VK_FORMAT_R8G8B8_SINT:
case VK_FORMAT_R8G8B8_SNORM:
case VK_FORMAT_R8G8B8_SSCALED:
- case VK_FORMAT_R8G8B8_SRGB:
if(writeB) { *Pointer<SByte>(element + 2) = SByte(RoundInt(Float(c.z))); }
case VK_FORMAT_R8G8_SINT:
case VK_FORMAT_R8G8_SNORM:
case VK_FORMAT_R8G8_SSCALED:
- case VK_FORMAT_R8G8_SRGB:
if(writeG) { *Pointer<SByte>(element + 1) = SByte(RoundInt(Float(c.y))); }
case VK_FORMAT_R8_SINT:
case VK_FORMAT_R8_SNORM:
@@ -633,10 +632,12 @@
case VK_FORMAT_R8G8B8_UINT:
case VK_FORMAT_R8G8B8_UNORM:
case VK_FORMAT_R8G8B8_USCALED:
+ case VK_FORMAT_R8G8B8_SRGB:
if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
case VK_FORMAT_R8G8_UINT:
case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_R8G8_USCALED:
+ case VK_FORMAT_R8G8_SRGB:
if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
case VK_FORMAT_R8_UINT:
case VK_FORMAT_R8_UNORM:
@@ -1043,7 +1044,6 @@
case VK_FORMAT_B8G8R8A8_SSCALED:
if(writeA) { *Pointer<SByte>(element + 3) = SByte(Extract(c, 3)); }
case VK_FORMAT_B8G8R8_SINT:
- case VK_FORMAT_B8G8R8_SRGB:
case VK_FORMAT_B8G8R8_SSCALED:
if(writeB) { *Pointer<SByte>(element) = SByte(Extract(c, 2)); }
if(writeG) { *Pointer<SByte>(element + 1) = SByte(Extract(c, 1)); }
@@ -1109,6 +1109,7 @@
if(writeA) { *Pointer<Byte>(element + 3) = Byte(Extract(c, 3)); }
case VK_FORMAT_B8G8R8_UINT:
case VK_FORMAT_B8G8R8_USCALED:
+ case VK_FORMAT_B8G8R8_SRGB:
if(writeB) { *Pointer<Byte>(element) = Byte(Extract(c, 2)); }
if(writeG) { *Pointer<Byte>(element + 1) = Byte(Extract(c, 1)); }
if(writeR) { *Pointer<Byte>(element + 2) = Byte(Extract(c, 0)); }
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index 14c0c9e..a769a2c 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -185,6 +185,7 @@
case VK_FORMAT_B8G8R8A8_SRGB:
case VK_FORMAT_R8G8B8A8_SRGB:
case VK_FORMAT_R8_SRGB:
+ case VK_FORMAT_R8G8_SRGB:
c.x *= Float4(1.0f / 0xFF00u);
c.y *= Float4(1.0f / 0xFF00u);
c.z *= Float4(1.0f / 0xFF00u);
@@ -237,6 +238,7 @@
case VK_FORMAT_B8G8R8A8_SRGB:
case VK_FORMAT_R8G8B8A8_SRGB:
case VK_FORMAT_R8_SRGB:
+ case VK_FORMAT_R8G8_SRGB:
c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xFF00u);
c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xFF00u);
c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xFF00u);
@@ -1454,6 +1456,7 @@
{
case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_R8G8_SNORM:
+ case VK_FORMAT_R8G8_SRGB:
c.y = (c.x & Short4(0xFF00u));
c.x = (c.x << 8);
break;
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index e68efce..9dad667 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -1900,6 +1900,7 @@
case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_R32G32B32A32_UINT:
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_B8G8R8_UNORM:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -1945,6 +1946,7 @@
switch(format)
{
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_B8G8R8_UNORM:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -2027,6 +2029,7 @@
case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_R32G32B32A32_UINT:
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_B8G8R8_UNORM:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -2085,6 +2088,7 @@
case VK_FORMAT_R8G8B8A8_SINT:
case VK_FORMAT_R8G8B8A8_UINT:
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_B8G8R8_UNORM:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -2152,6 +2156,7 @@
return component < 1;
case VK_FORMAT_R8G8_SNORM:
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_R8G8_SINT:
case VK_FORMAT_R8G8_UINT:
case VK_FORMAT_R16G16_SINT:
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index 7e6c150..323d644 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -391,6 +391,7 @@
case VK_FORMAT_R8_SRGB:
case VK_FORMAT_R8_SNORM:
case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8_SRGB:
case VK_FORMAT_R8G8_SNORM:
case VK_FORMAT_R8G8B8A8_UNORM:
case VK_FORMAT_R8G8B8A8_SNORM: