Merge changes Id1120acb,Ifc6afcda,I8b5da04a,I9389ad9e,I35d60f68 * changes: Update SPIRV-Tools to 8aa423930 Squashed 'third_party/SPIRV-Tools/' changes from c3f22f7cb..8aa423930 VulkanUnitTests: Fix SPIR-V validation issue Update SPIRV-Headers to 204cd131c Squashed 'third_party/SPIRV-Headers/' changes from af64a9e82..204cd131c
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp index 2394fb2..958da63 100644 --- a/src/Device/Blitter.cpp +++ b/src/Device/Blitter.cpp
@@ -24,6 +24,16 @@ #include <utility> +namespace { +rr::RValue<rr::Int> PackFields(rr::Int4 const &ints, const sw::int4 shifts) +{ + return (rr::Int(ints.x) << shifts[0]) | + (rr::Int(ints.y) << shifts[1]) | + (rr::Int(ints.z) << shifts[2]) | + (rr::Int(ints.w) << shifts[3]); +} +} // namespace + namespace sw { Blitter::Blitter() @@ -825,28 +835,21 @@ case VK_FORMAT_R5G6B5_UNORM_PACK16: if(writeR && writeG && writeB) { - *Pointer<UShort>(element) = UShort(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << Int(5)) | - (RoundInt(Float(c.x)) << Int(11))); + *Pointer<UShort>(element) = UShort(PackFields(RoundInt(c.xyzz), { 11, 5, 0, 0 })); } else { unsigned short mask = (writeB ? 0x001F : 0x0000) | (writeG ? 0x07E0 : 0x0000) | (writeR ? 0xF800 : 0x0000); unsigned short unmask = ~mask; *Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) | - (UShort(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << Int(5)) | - (RoundInt(Float(c.x)) << Int(11))) & + (UShort(PackFields(RoundInt(c.xyzz), { 11, 5, 0, 0 })) & UShort(mask)); } break; case VK_FORMAT_R5G5B5A1_UNORM_PACK16: if(writeRGBA) { - *Pointer<UShort>(element) = UShort(RoundInt(Float(c.w)) | - (RoundInt(Float(c.z)) << Int(1)) | - (RoundInt(Float(c.y)) << Int(6)) | - (RoundInt(Float(c.x)) << Int(11))); + *Pointer<UShort>(element) = UShort(PackFields(RoundInt(c), { 11, 6, 1, 0 })); } else { @@ -856,20 +859,14 @@ (writeB ? 0x001F : 0x0000); unsigned short unmask = ~mask; *Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) | - (UShort(RoundInt(Float(c.w)) | - (RoundInt(Float(c.z)) << Int(1)) | - (RoundInt(Float(c.y)) << Int(6)) | - (RoundInt(Float(c.x)) << Int(11))) & + (UShort(PackFields(RoundInt(c), { 11, 6, 1, 0 })) & UShort(mask)); } break; case VK_FORMAT_B5G5R5A1_UNORM_PACK16: if(writeRGBA) { - *Pointer<UShort>(element) = UShort(RoundInt(Float(c.w)) | - (RoundInt(Float(c.x)) << Int(1)) | - (RoundInt(Float(c.y)) << Int(6)) | - (RoundInt(Float(c.z)) << Int(11))); + *Pointer<UShort>(element) = UShort(PackFields(RoundInt(c), { 1, 6, 11, 0 })); } else { @@ -879,20 +876,14 @@ (writeB ? 0x001F : 0x0000); unsigned short unmask = ~mask; *Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) | - (UShort(RoundInt(Float(c.w)) | - (RoundInt(Float(c.x)) << Int(1)) | - (RoundInt(Float(c.y)) << Int(6)) | - (RoundInt(Float(c.z)) << Int(11))) & + (UShort(PackFields(RoundInt(c), { 1, 6, 11, 0 })) & UShort(mask)); } break; case VK_FORMAT_A1R5G5B5_UNORM_PACK16: if(writeRGBA) { - *Pointer<UShort>(element) = UShort(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << Int(5)) | - (RoundInt(Float(c.x)) << Int(10)) | - (RoundInt(Float(c.w)) << Int(15))); + *Pointer<UShort>(element) = UShort(PackFields(RoundInt(c), { 10, 5, 0, 15 })); } else { @@ -902,10 +893,7 @@ (writeB ? 0x001F : 0x0000); unsigned short unmask = ~mask; *Pointer<UShort>(element) = (*Pointer<UShort>(element) & UShort(unmask)) | - (UShort(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << Int(5)) | - (RoundInt(Float(c.x)) << Int(10)) | - (RoundInt(Float(c.w)) << Int(15))) & + (UShort(PackFields(RoundInt(c), { 10, 5, 0, 15 })) & UShort(mask)); } break; @@ -914,10 +902,7 @@ case VK_FORMAT_A2B10G10R10_SNORM_PACK32: if(writeRGBA) { - *Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)) | - (RoundInt(Float(c.y)) << 10) | - (RoundInt(Float(c.z)) << 20) | - (RoundInt(Float(c.w)) << 30)); + *Pointer<UInt>(element) = As<UInt>(PackFields(RoundInt(c), { 0, 10, 20, 30 })); } else { @@ -927,10 +912,7 @@ (writeR ? 0x000003FF : 0x0000); unsigned int unmask = ~mask; *Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) | - (UInt(RoundInt(Float(c.x)) | - (RoundInt(Float(c.y)) << 10) | - (RoundInt(Float(c.z)) << 20) | - (RoundInt(Float(c.w)) << 30)) & + (As<UInt>(PackFields(RoundInt(c), { 0, 10, 20, 30 })) & UInt(mask)); } break; @@ -939,10 +921,7 @@ case VK_FORMAT_A2R10G10B10_SNORM_PACK32: if(writeRGBA) { - *Pointer<UInt>(element) = UInt(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << 10) | - (RoundInt(Float(c.x)) << 20) | - (RoundInt(Float(c.w)) << 30)); + *Pointer<UInt>(element) = As<UInt>(PackFields(RoundInt(c), { 20, 10, 0, 30 })); } else { @@ -952,10 +931,7 @@ (writeB ? 0x000003FF : 0x0000); unsigned int unmask = ~mask; *Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) | - (UInt(RoundInt(Float(c.z)) | - (RoundInt(Float(c.y)) << 10) | - (RoundInt(Float(c.x)) << 20) | - (RoundInt(Float(c.w)) << 30)) & + (As<UInt>(PackFields(RoundInt(c), { 20, 10, 0, 30 })) & UInt(mask)); } break; @@ -1133,8 +1109,7 @@ case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: if(writeRGBA) { - *Pointer<UInt>(element) = - UInt((Extract(c, 0)) | (Extract(c, 1) << 10) | (Extract(c, 2) << 20) | (Extract(c, 3) << 30)); + *Pointer<UInt>(element) = As<UInt>(PackFields(c, { 0, 10, 20, 30 })); } else { @@ -1144,7 +1119,7 @@ (writeR ? 0x000003FF : 0x0000); unsigned int unmask = ~mask; *Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) | - (UInt(Extract(c, 0) | (Extract(c, 1) << 10) | (Extract(c, 2) << 20) | (Extract(c, 3) << 30)) & UInt(mask)); + (As<UInt>(PackFields(c, { 0, 10, 20, 30 })) & UInt(mask)); } break; case VK_FORMAT_A2R10G10B10_UINT_PACK32: @@ -1153,8 +1128,7 @@ case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: if(writeRGBA) { - *Pointer<UInt>(element) = - UInt((Extract(c, 2)) | (Extract(c, 1) << 10) | (Extract(c, 0) << 20) | (Extract(c, 3) << 30)); + *Pointer<UInt>(element) = As<UInt>(PackFields(c, { 20, 10, 0, 30 })); } else { @@ -1164,7 +1138,7 @@ (writeB ? 0x000003FF : 0x0000); unsigned int unmask = ~mask; *Pointer<UInt>(element) = (*Pointer<UInt>(element) & UInt(unmask)) | - (UInt(Extract(c, 2) | (Extract(c, 1) << 10) | (Extract(c, 0) << 20) | (Extract(c, 3) << 30)) & UInt(mask)); + (As<UInt>(PackFields(c, { 20, 10, 0, 30 })) & UInt(mask)); } break; case VK_FORMAT_B8G8R8A8_UINT:
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp index b2ae9d0..be79715 100644 --- a/src/Pipeline/PixelRoutine.cpp +++ b/src/Pipeline/PixelRoutine.cpp
@@ -1055,10 +1055,7 @@ v = Insert(v, *Pointer<Int>(buffer + 4 * x), 2); v = Insert(v, *Pointer<Int>(buffer + 4 * x + 4), 3); - pixel.x = Short4(v << 6) & Short4(0xFFC0u); - pixel.y = Short4(v >> 4) & Short4(0xFFC0u); - pixel.z = Short4(v >> 14) & Short4(0xFFC0u); - pixel.w = Short4(v >> 16) & Short4(0xC000u); + a2b10g10r10Unpack(v, pixel); } break; default:
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp index 10d848e..63b15f9 100644 --- a/src/Pipeline/SamplerCore.cpp +++ b/src/Pipeline/SamplerCore.cpp
@@ -1699,16 +1699,7 @@ cc = Insert(cc, Pointer<Int>(buffer)[index[2]], 2); cc = Insert(cc, Pointer<Int>(buffer)[index[3]], 3); - // shift each 10 bit field left 6, and replicate 6 high bits into bottom 6 - c.x = Short4(((cc << 6) & Int4(0xFFC0)) | ((cc >> 4) & Int4(0x3F))); - c.y = Short4(((cc >> 4) & Int4(0xFFC0)) | ((cc >> 14) & Int4(0x3F))); - c.z = Short4(((cc >> 14) & Int4(0xFFC0)) | ((cc >> 24) & Int4(0x3F))); - c.w = Short4(((cc >> 16) & Int4(0xC000))); - - // replicate 2 bit alpha component all the way down - c.w |= (c.w >> 8) & Short4(0xc0); - c.w |= (c.w >> 4) & Short4(0x0c0c); - c.w |= (c.w >> 2) & Short4(0x3333); + a2b10g10r10Unpack(cc, c); } else if(state.textureFormat == VK_FORMAT_A2B10G10R10_UINT_PACK32) {
diff --git a/src/Pipeline/ShaderCore.cpp b/src/Pipeline/ShaderCore.cpp index 534ed8d..87f33c8 100644 --- a/src/Pipeline/ShaderCore.cpp +++ b/src/Pipeline/ShaderCore.cpp
@@ -616,6 +616,22 @@ return (UInt(halfBits.x) >> 20) | (UInt(halfBits.y) >> 9) | (UInt(halfBits.z) << 1); } +void a2b10g10r10Unpack(Int4 &value, Vector4s &result) +{ + result.x = Short4(value << 6) & Short4(0xFFC0u); + result.y = Short4(value >> 4) & Short4(0xFFC0u); + result.z = Short4(value >> 14) & Short4(0xFFC0u); + result.w = Short4(value >> 16) & Short4(0xC000u); + + // Expand to 16 bit range + result.x |= As<Short4>(As<UShort4>(result.x) >> 10); + result.y |= As<Short4>(As<UShort4>(result.y) >> 10); + result.z |= As<Short4>(As<UShort4>(result.z) >> 10); + result.w |= As<Short4>(As<UShort4>(result.w) >> 2); + result.w |= As<Short4>(As<UShort4>(result.w) >> 4); + result.w |= As<Short4>(As<UShort4>(result.w) >> 8); +} + rr::RValue<rr::Bool> AnyTrue(rr::RValue<sw::SIMD::Int> const &ints) { return rr::SignMask(ints) != 0;
diff --git a/src/Pipeline/ShaderCore.hpp b/src/Pipeline/ShaderCore.hpp index a911be2..e19fdbd 100644 --- a/src/Pipeline/ShaderCore.hpp +++ b/src/Pipeline/ShaderCore.hpp
@@ -208,6 +208,7 @@ sw::SIMD::UInt floatToHalfBits(sw::SIMD::UInt floatBits, bool storeInUpperBits); sw::SIMD::Float r11g11b10Unpack(UInt r11g11b10bits); UInt r11g11b10Pack(sw::SIMD::Float &value); +void a2b10g10r10Unpack(Int4 &value, Vector4s &result); rr::RValue<rr::Bool> AnyTrue(rr::RValue<sw::SIMD::Int> const &ints);