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: