Support writing to storage images with packed formats shaderStorageImageWriteWithoutFormat will allow OpImageWrite to write to images with packed formats. Note we already claimed VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT support for these formats, but without shaderStorageImageWriteWithoutFormat or shaderStorageImageReadWithoutFormat they could neither be read nor written since the spec states that if "The SPIR-V Image Format is not compatible with the image view’s format", "the value of the texel returned is undefined." and compatibility is defined as a strict 1:1 mapping. Bug: b/203730083 Change-Id: I530780f955caefc8a7324f2ab8e05a503f2c20ef Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/59570 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/SpirvShaderImage.cpp b/src/Pipeline/SpirvShaderImage.cpp index 58642e2..a85c615 100644 --- a/src/Pipeline/SpirvShaderImage.cpp +++ b/src/Pipeline/SpirvShaderImage.cpp
@@ -1155,12 +1155,14 @@ packed[0] = texel.Int(0); break; case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_A8B8G8R8_UNORM_PACK32: packed[0] = (SIMD::UInt(Round(Min(Max(texel.Float(0), SIMD::Float(0.0f)), SIMD::Float(1.0f)) * SIMD::Float(255.0f)))) | ((SIMD::UInt(Round(Min(Max(texel.Float(1), SIMD::Float(0.0f)), SIMD::Float(1.0f)) * SIMD::Float(255.0f)))) << 8) | ((SIMD::UInt(Round(Min(Max(texel.Float(2), SIMD::Float(0.0f)), SIMD::Float(1.0f)) * SIMD::Float(255.0f)))) << 16) | ((SIMD::UInt(Round(Min(Max(texel.Float(3), SIMD::Float(0.0f)), SIMD::Float(1.0f)) * SIMD::Float(255.0f)))) << 24); break; case VK_FORMAT_R8G8B8A8_SNORM: + case VK_FORMAT_A8B8G8R8_SNORM_PACK32: packed[0] = (SIMD::Int(Round(Min(Max(texel.Float(0), SIMD::Float(-1.0f)), SIMD::Float(1.0f)) * SIMD::Float(127.0f))) & SIMD::Int(0xFF)) | ((SIMD::Int(Round(Min(Max(texel.Float(1), SIMD::Float(-1.0f)), SIMD::Float(1.0f)) * SIMD::Float(127.0f))) & @@ -1175,6 +1177,8 @@ break; case VK_FORMAT_R8G8B8A8_SINT: case VK_FORMAT_R8G8B8A8_UINT: + case VK_FORMAT_A8B8G8R8_SINT_PACK32: + case VK_FORMAT_A8B8G8R8_UINT_PACK32: packed[0] = (SIMD::UInt(texel.UInt(0) & SIMD::UInt(0xff))) | (SIMD::UInt(texel.UInt(1) & SIMD::UInt(0xff)) << 8) | (SIMD::UInt(texel.UInt(2) & SIMD::UInt(0xff)) << 16) |
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp index bd05a84..df16133 100644 --- a/src/Vulkan/VkPhysicalDevice.cpp +++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -1438,7 +1438,6 @@ case VK_FORMAT_R8_UINT: pFormatProperties->optimalTilingFeatures |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; - // [[fallthrough]] pFormatProperties->bufferFeatures |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT; break;