Refactor vertex fetch to use VkFormat more aggressively Bug: b/152218432 Change-Id: I71eb0cbda5ae98ab39d9953fe049368b8341193a Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42748 Tested-by: Chris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/VertexRoutine.cpp b/src/Pipeline/VertexRoutine.cpp index 1eebf57..36e660c 100644 --- a/src/Pipeline/VertexRoutine.cpp +++ b/src/Pipeline/VertexRoutine.cpp
@@ -225,226 +225,137 @@ transpose4xN(v.x, v.y, v.z, v.w, componentCount); } - - switch(stream.attribType) - { - case SpirvShader::ATTRIBTYPE_INT: - if(componentCount >= 1) v.x = As<Float4>(Int4(v.x)); - if(componentCount >= 2) v.x = As<Float4>(Int4(v.y)); - if(componentCount >= 3) v.x = As<Float4>(Int4(v.z)); - if(componentCount >= 4) v.x = As<Float4>(Int4(v.w)); - break; - case SpirvShader::ATTRIBTYPE_UINT: - if(componentCount >= 1) v.x = As<Float4>(UInt4(v.x)); - if(componentCount >= 2) v.x = As<Float4>(UInt4(v.y)); - if(componentCount >= 3) v.x = As<Float4>(UInt4(v.z)); - if(componentCount >= 4) v.x = As<Float4>(UInt4(v.w)); - break; - default: - break; - } } } break; case VK_FORMAT_B8G8R8A8_UNORM: bgra = true; + // [[fallthrough]] case VK_FORMAT_R8_UNORM: case VK_FORMAT_R8G8_UNORM: case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_A8B8G8R8_UNORM_PACK32: + v.x = Float4(*Pointer<Byte4>(source0)); + v.y = Float4(*Pointer<Byte4>(source1)); + v.z = Float4(*Pointer<Byte4>(source2)); + v.w = Float4(*Pointer<Byte4>(source3)); + + transpose4xN(v.x, v.y, v.z, v.w, componentCount); + + if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); + if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); + if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); + if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); + break; case VK_FORMAT_R8_UINT: case VK_FORMAT_R8G8_UINT: case VK_FORMAT_R8G8B8A8_UINT: - case VK_FORMAT_A8B8G8R8_UNORM_PACK32: case VK_FORMAT_A8B8G8R8_UINT_PACK32: - if(isNativeFloatAttrib) // Stream: UByte, Shader attrib: Float - { - v.x = Float4(*Pointer<Byte4>(source0)); - v.y = Float4(*Pointer<Byte4>(source1)); - v.z = Float4(*Pointer<Byte4>(source2)); - v.w = Float4(*Pointer<Byte4>(source3)); + v.x = As<Float4>(Int4(*Pointer<Byte4>(source0))); + v.y = As<Float4>(Int4(*Pointer<Byte4>(source1))); + v.z = As<Float4>(Int4(*Pointer<Byte4>(source2))); + v.w = As<Float4>(Int4(*Pointer<Byte4>(source3))); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); - } - } - else // Stream: UByte, Shader attrib: Int / UInt - { - v.x = As<Float4>(Int4(*Pointer<Byte4>(source0))); - v.y = As<Float4>(Int4(*Pointer<Byte4>(source1))); - v.z = As<Float4>(Int4(*Pointer<Byte4>(source2))); - v.w = As<Float4>(Int4(*Pointer<Byte4>(source3))); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R8_SNORM: - case VK_FORMAT_R8_SINT: case VK_FORMAT_R8G8_SNORM: - case VK_FORMAT_R8G8_SINT: case VK_FORMAT_R8G8B8A8_SNORM: - case VK_FORMAT_R8G8B8A8_SINT: case VK_FORMAT_A8B8G8R8_SNORM_PACK32: + v.x = Float4(*Pointer<SByte4>(source0)); + v.y = Float4(*Pointer<SByte4>(source1)); + v.z = Float4(*Pointer<SByte4>(source2)); + v.w = Float4(*Pointer<SByte4>(source3)); + + transpose4xN(v.x, v.y, v.z, v.w, componentCount); + + if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); + if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); + if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); + if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); + break; + case VK_FORMAT_R8_SINT: + case VK_FORMAT_R8G8_SINT: + case VK_FORMAT_R8G8B8A8_SINT: case VK_FORMAT_A8B8G8R8_SINT_PACK32: - if(isNativeFloatAttrib) // Stream: SByte, Shader attrib: Float - { - v.x = Float4(*Pointer<SByte4>(source0)); - v.y = Float4(*Pointer<SByte4>(source1)); - v.z = Float4(*Pointer<SByte4>(source2)); - v.w = Float4(*Pointer<SByte4>(source3)); + v.x = As<Float4>(Int4(*Pointer<SByte4>(source0))); + v.y = As<Float4>(Int4(*Pointer<SByte4>(source1))); + v.z = As<Float4>(Int4(*Pointer<SByte4>(source2))); + v.w = As<Float4>(Int4(*Pointer<SByte4>(source3))); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); - } - } - else // Stream: SByte, Shader attrib: Int / UInt - { - v.x = As<Float4>(Int4(*Pointer<SByte4>(source0))); - v.y = As<Float4>(Int4(*Pointer<SByte4>(source1))); - v.z = As<Float4>(Int4(*Pointer<SByte4>(source2))); - v.w = As<Float4>(Int4(*Pointer<SByte4>(source3))); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R16_SNORM: - case VK_FORMAT_R16_SINT: case VK_FORMAT_R16G16_SNORM: - case VK_FORMAT_R16G16_SINT: case VK_FORMAT_R16G16B16A16_SNORM: + v.x = Float4(*Pointer<Short4>(source0)); + v.y = Float4(*Pointer<Short4>(source1)); + v.z = Float4(*Pointer<Short4>(source2)); + v.w = Float4(*Pointer<Short4>(source3)); + + transpose4xN(v.x, v.y, v.z, v.w, componentCount); + + if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); + if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); + if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); + if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); + break; + case VK_FORMAT_R16_SINT: + case VK_FORMAT_R16G16_SINT: case VK_FORMAT_R16G16B16A16_SINT: - if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float - { - v.x = Float4(*Pointer<Short4>(source0)); - v.y = Float4(*Pointer<Short4>(source1)); - v.z = Float4(*Pointer<Short4>(source2)); - v.w = Float4(*Pointer<Short4>(source3)); + v.x = As<Float4>(Int4(*Pointer<Short4>(source0))); + v.y = As<Float4>(Int4(*Pointer<Short4>(source1))); + v.z = As<Float4>(Int4(*Pointer<Short4>(source2))); + v.w = As<Float4>(Int4(*Pointer<Short4>(source3))); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); - } - } - else // Stream: Short, Shader attrib: Int/UInt, no type conversion - { - v.x = As<Float4>(Int4(*Pointer<Short4>(source0))); - v.y = As<Float4>(Int4(*Pointer<Short4>(source1))); - v.z = As<Float4>(Int4(*Pointer<Short4>(source2))); - v.w = As<Float4>(Int4(*Pointer<Short4>(source3))); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R16_UNORM: - case VK_FORMAT_R16_UINT: case VK_FORMAT_R16G16_UNORM: - case VK_FORMAT_R16G16_UINT: case VK_FORMAT_R16G16B16A16_UNORM: + v.x = Float4(*Pointer<UShort4>(source0)); + v.y = Float4(*Pointer<UShort4>(source1)); + v.z = Float4(*Pointer<UShort4>(source2)); + v.w = Float4(*Pointer<UShort4>(source3)); + + transpose4xN(v.x, v.y, v.z, v.w, componentCount); + + if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); + if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); + if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); + if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); + break; + case VK_FORMAT_R16_UINT: + case VK_FORMAT_R16G16_UINT: case VK_FORMAT_R16G16B16A16_UINT: - if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float - { - v.x = Float4(*Pointer<UShort4>(source0)); - v.y = Float4(*Pointer<UShort4>(source1)); - v.z = Float4(*Pointer<UShort4>(source2)); - v.w = Float4(*Pointer<UShort4>(source3)); + v.x = As<Float4>(Int4(*Pointer<UShort4>(source0))); + v.y = As<Float4>(Int4(*Pointer<UShort4>(source1))); + v.z = As<Float4>(Int4(*Pointer<UShort4>(source2))); + v.w = As<Float4>(Int4(*Pointer<UShort4>(source3))); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); - } - } - else // Stream: UShort, Shader attrib: Int/UInt, no type conversion - { - v.x = As<Float4>(Int4(*Pointer<UShort4>(source0))); - v.y = As<Float4>(Int4(*Pointer<UShort4>(source1))); - v.z = As<Float4>(Int4(*Pointer<UShort4>(source2))); - v.w = As<Float4>(Int4(*Pointer<UShort4>(source3))); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R32_SINT: case VK_FORMAT_R32G32_SINT: case VK_FORMAT_R32G32B32_SINT: case VK_FORMAT_R32G32B32A32_SINT: - if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float - { - v.x = Float4(*Pointer<Int4>(source0)); - v.y = Float4(*Pointer<Int4>(source1)); - v.z = Float4(*Pointer<Int4>(source2)); - v.w = Float4(*Pointer<Int4>(source3)); + v.x = *Pointer<Float4>(source0); + v.y = *Pointer<Float4>(source1); + v.z = *Pointer<Float4>(source2); + v.w = *Pointer<Float4>(source3); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt)); - } - } - else // Stream: Int, Shader attrib: Int/UInt, no type conversion - { - v.x = *Pointer<Float4>(source0); - v.y = *Pointer<Float4>(source1); - v.z = *Pointer<Float4>(source2); - v.w = *Pointer<Float4>(source3); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R32_UINT: case VK_FORMAT_R32G32_UINT: case VK_FORMAT_R32G32B32_UINT: case VK_FORMAT_R32G32B32A32_UINT: - if(isNativeFloatAttrib) // Stream: UInt, Shader attrib: Float - { - v.x = Float4(*Pointer<UInt4>(source0)); - v.y = Float4(*Pointer<UInt4>(source1)); - v.z = Float4(*Pointer<UInt4>(source2)); - v.w = Float4(*Pointer<UInt4>(source3)); + v.x = *Pointer<Float4>(source0); + v.y = *Pointer<Float4>(source1); + v.z = *Pointer<Float4>(source2); + v.w = *Pointer<Float4>(source3); - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - - if(normalized) - { - if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt)); - if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt)); - if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt)); - if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt)); - } - } - else // Stream: UInt, Shader attrib: Int/UInt, no type conversion - { - v.x = *Pointer<Float4>(source0); - v.y = *Pointer<Float4>(source1); - v.z = *Pointer<Float4>(source2); - v.w = *Pointer<Float4>(source3); - - transpose4xN(v.x, v.y, v.z, v.w, componentCount); - } + transpose4xN(v.x, v.y, v.z, v.w, componentCount); break; case VK_FORMAT_R16_SFLOAT: case VK_FORMAT_R16G16_SFLOAT: @@ -504,9 +415,29 @@ } break; case VK_FORMAT_A2R10G10B10_SNORM_PACK32: + bgra = true; + // [[fallthrough]] + case VK_FORMAT_A2B10G10R10_SNORM_PACK32: + { + Int4 src; + src = Insert(src, *Pointer<Int>(source0), 0); + src = Insert(src, *Pointer<Int>(source1), 1); + src = Insert(src, *Pointer<Int>(source2), 2); + src = Insert(src, *Pointer<Int>(source3), 3); + v.x = Float4((src << 22) >> 22); + v.y = Float4((src << 12) >> 22); + v.z = Float4((src << 02) >> 22); + v.w = Float4(src >> 30); + + v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f)); + v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f)); + v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f)); + v.w = Max(v.w, Float4(-1.0f)); + } + break; case VK_FORMAT_A2R10G10B10_SINT_PACK32: bgra = true; - case VK_FORMAT_A2B10G10R10_SNORM_PACK32: + // [[fallthrough]] case VK_FORMAT_A2B10G10R10_SINT_PACK32: { Int4 src; @@ -514,34 +445,37 @@ src = Insert(src, *Pointer<Int>(source1), 1); src = Insert(src, *Pointer<Int>(source2), 2); src = Insert(src, *Pointer<Int>(source3), 3); - if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float - { - v.x = Float4((src << 22) >> 22); - v.y = Float4((src << 12) >> 22); - v.z = Float4((src << 02) >> 22); - v.w = Float4(src >> 30); - - if(normalized) - { - v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f)); - v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f)); - v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f)); - v.w = Max(v.w, Float4(-1.0f)); - } - } - else // Stream: UInt, Shader attrib: Int/UInt, no type conversion - { - v.x = As<Float4>((src << 22) >> 22); - v.y = As<Float4>((src << 12) >> 22); - v.z = As<Float4>((src << 02) >> 22); - v.w = As<Float4>(src >> 30); - } + v.x = As<Float4>((src << 22) >> 22); + v.y = As<Float4>((src << 12) >> 22); + v.z = As<Float4>((src << 02) >> 22); + v.w = As<Float4>(src >> 30); } break; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: + bgra = true; + // [[fallthrough]] + case VK_FORMAT_A2B10G10R10_UNORM_PACK32: + { + Int4 src; + src = Insert(src, *Pointer<Int>(source0), 0); + src = Insert(src, *Pointer<Int>(source1), 1); + src = Insert(src, *Pointer<Int>(source2), 2); + src = Insert(src, *Pointer<Int>(source3), 3); + + v.x = Float4(src & Int4(0x3FF)); + v.y = Float4((src >> 10) & Int4(0x3FF)); + v.z = Float4((src >> 20) & Int4(0x3FF)); + v.w = Float4((src >> 30) & Int4(0x3)); + + v.x *= Float4(1.0f / 0x3FF); + v.y *= Float4(1.0f / 0x3FF); + v.z *= Float4(1.0f / 0x3FF); + v.w *= Float4(1.0f / 0x3); + } + break; case VK_FORMAT_A2R10G10B10_UINT_PACK32: bgra = true; - case VK_FORMAT_A2B10G10R10_UNORM_PACK32: + // [[fallthrough]] case VK_FORMAT_A2B10G10R10_UINT_PACK32: { Int4 src; @@ -550,28 +484,10 @@ src = Insert(src, *Pointer<Int>(source2), 2); src = Insert(src, *Pointer<Int>(source3), 3); - if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float - { - v.x = Float4(src & Int4(0x3FF)); - v.y = Float4((src >> 10) & Int4(0x3FF)); - v.z = Float4((src >> 20) & Int4(0x3FF)); - v.w = Float4((src >> 30) & Int4(0x3)); - - if(normalized) - { - v.x *= Float4(1.0f / 0x3FF); - v.y *= Float4(1.0f / 0x3FF); - v.z *= Float4(1.0f / 0x3FF); - v.w *= Float4(1.0f / 0x3); - } - } - else // Stream: UInt, Shader attrib: Int/UInt, no type conversion - { - v.x = As<Float4>(src & Int4(0x3FF)); - v.y = As<Float4>((src >> 10) & Int4(0x3FF)); - v.z = As<Float4>((src >> 20) & Int4(0x3FF)); - v.w = As<Float4>((src >> 30) & Int4(0x3)); - } + v.x = As<Float4>(src & Int4(0x3FF)); + v.y = As<Float4>((src >> 10) & Int4(0x3FF)); + v.z = As<Float4>((src >> 20) & Int4(0x3FF)); + v.w = As<Float4>((src >> 30) & Int4(0x3)); } break; default: