Commit 12e857a3 by Chris Forbes

Refactor vertex fetch to use VkFormat more aggressively

Bug: b/152218432 Change-Id: I71eb0cbda5ae98ab39d9953fe049368b8341193a Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42748Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 95b77b44
...@@ -225,226 +225,137 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -225,226 +225,137 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St
transpose4xN(v.x, v.y, v.z, v.w, componentCount); 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; break;
case VK_FORMAT_B8G8R8A8_UNORM: case VK_FORMAT_B8G8R8A8_UNORM:
bgra = true; bgra = true;
// [[fallthrough]]
case VK_FORMAT_R8_UNORM: case VK_FORMAT_R8_UNORM:
case VK_FORMAT_R8G8_UNORM: case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_R8G8B8A8_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_R8_UINT:
case VK_FORMAT_R8G8_UINT: case VK_FORMAT_R8G8_UINT:
case VK_FORMAT_R8G8B8A8_UINT: case VK_FORMAT_R8G8B8A8_UINT:
case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
case VK_FORMAT_A8B8G8R8_UINT_PACK32: case VK_FORMAT_A8B8G8R8_UINT_PACK32:
if(isNativeFloatAttrib) // Stream: UByte, Shader attrib: Float v.x = As<Float4>(Int4(*Pointer<Byte4>(source0)));
{ v.y = As<Float4>(Int4(*Pointer<Byte4>(source1)));
v.x = Float4(*Pointer<Byte4>(source0)); v.z = As<Float4>(Int4(*Pointer<Byte4>(source2)));
v.y = Float4(*Pointer<Byte4>(source1)); v.w = As<Float4>(Int4(*Pointer<Byte4>(source3)));
v.z = Float4(*Pointer<Byte4>(source2));
v.w = Float4(*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; break;
case VK_FORMAT_R8_SNORM: case VK_FORMAT_R8_SNORM:
case VK_FORMAT_R8_SINT:
case VK_FORMAT_R8G8_SNORM: case VK_FORMAT_R8G8_SNORM:
case VK_FORMAT_R8G8_SINT:
case VK_FORMAT_R8G8B8A8_SNORM: case VK_FORMAT_R8G8B8A8_SNORM:
case VK_FORMAT_R8G8B8A8_SINT:
case VK_FORMAT_A8B8G8R8_SNORM_PACK32: case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
case VK_FORMAT_A8B8G8R8_SINT_PACK32: v.x = Float4(*Pointer<SByte4>(source0));
if(isNativeFloatAttrib) // Stream: SByte, Shader attrib: Float v.y = Float4(*Pointer<SByte4>(source1));
{ v.z = Float4(*Pointer<SByte4>(source2));
v.x = Float4(*Pointer<SByte4>(source0)); v.w = Float4(*Pointer<SByte4>(source3));
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); 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 >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); break;
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); case VK_FORMAT_R8_SINT:
} case VK_FORMAT_R8G8_SINT:
} case VK_FORMAT_R8G8B8A8_SINT:
else // Stream: SByte, Shader attrib: Int / UInt case VK_FORMAT_A8B8G8R8_SINT_PACK32:
{ v.x = As<Float4>(Int4(*Pointer<SByte4>(source0)));
v.x = As<Float4>(Int4(*Pointer<SByte4>(source0))); v.y = As<Float4>(Int4(*Pointer<SByte4>(source1)));
v.y = As<Float4>(Int4(*Pointer<SByte4>(source1))); v.z = As<Float4>(Int4(*Pointer<SByte4>(source2)));
v.z = As<Float4>(Int4(*Pointer<SByte4>(source2))); v.w = As<Float4>(Int4(*Pointer<SByte4>(source3)));
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; break;
case VK_FORMAT_R16_SNORM: case VK_FORMAT_R16_SNORM:
case VK_FORMAT_R16_SINT:
case VK_FORMAT_R16G16_SNORM: case VK_FORMAT_R16G16_SNORM:
case VK_FORMAT_R16G16_SINT:
case VK_FORMAT_R16G16B16A16_SNORM: case VK_FORMAT_R16G16B16A16_SNORM:
case VK_FORMAT_R16G16B16A16_SINT: v.x = Float4(*Pointer<Short4>(source0));
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float v.y = Float4(*Pointer<Short4>(source1));
{ v.z = Float4(*Pointer<Short4>(source2));
v.x = Float4(*Pointer<Short4>(source0)); v.w = Float4(*Pointer<Short4>(source3));
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); 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 >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); break;
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); case VK_FORMAT_R16_SINT:
} case VK_FORMAT_R16G16_SINT:
} case VK_FORMAT_R16G16B16A16_SINT:
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.x = As<Float4>(Int4(*Pointer<Short4>(source0))); v.z = As<Float4>(Int4(*Pointer<Short4>(source2)));
v.y = As<Float4>(Int4(*Pointer<Short4>(source1))); v.w = As<Float4>(Int4(*Pointer<Short4>(source3)));
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; break;
case VK_FORMAT_R16_UNORM: case VK_FORMAT_R16_UNORM:
case VK_FORMAT_R16_UINT:
case VK_FORMAT_R16G16_UNORM: case VK_FORMAT_R16G16_UNORM:
case VK_FORMAT_R16G16_UINT:
case VK_FORMAT_R16G16B16A16_UNORM: case VK_FORMAT_R16G16B16A16_UNORM:
case VK_FORMAT_R16G16B16A16_UINT: v.x = Float4(*Pointer<UShort4>(source0));
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float v.y = Float4(*Pointer<UShort4>(source1));
{ v.z = Float4(*Pointer<UShort4>(source2));
v.x = Float4(*Pointer<UShort4>(source0)); v.w = Float4(*Pointer<UShort4>(source3));
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); 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 >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); break;
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); case VK_FORMAT_R16_UINT:
} case VK_FORMAT_R16G16_UINT:
} case VK_FORMAT_R16G16B16A16_UINT:
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.x = As<Float4>(Int4(*Pointer<UShort4>(source0))); v.z = As<Float4>(Int4(*Pointer<UShort4>(source2)));
v.y = As<Float4>(Int4(*Pointer<UShort4>(source1))); v.w = As<Float4>(Int4(*Pointer<UShort4>(source3)));
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; break;
case VK_FORMAT_R32_SINT: case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32G32_SINT: case VK_FORMAT_R32G32_SINT:
case VK_FORMAT_R32G32B32_SINT: case VK_FORMAT_R32G32B32_SINT:
case VK_FORMAT_R32G32B32A32_SINT: case VK_FORMAT_R32G32B32A32_SINT:
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float v.x = *Pointer<Float4>(source0);
{ v.y = *Pointer<Float4>(source1);
v.x = Float4(*Pointer<Int4>(source0)); v.z = *Pointer<Float4>(source2);
v.y = Float4(*Pointer<Int4>(source1)); v.w = *Pointer<Float4>(source3);
v.z = Float4(*Pointer<Int4>(source2));
v.w = Float4(*Pointer<Int4>(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; break;
case VK_FORMAT_R32_UINT: case VK_FORMAT_R32_UINT:
case VK_FORMAT_R32G32_UINT: case VK_FORMAT_R32G32_UINT:
case VK_FORMAT_R32G32B32_UINT: case VK_FORMAT_R32G32B32_UINT:
case VK_FORMAT_R32G32B32A32_UINT: case VK_FORMAT_R32G32B32A32_UINT:
if(isNativeFloatAttrib) // Stream: UInt, Shader attrib: Float v.x = *Pointer<Float4>(source0);
{ v.y = *Pointer<Float4>(source1);
v.x = Float4(*Pointer<UInt4>(source0)); v.z = *Pointer<Float4>(source2);
v.y = Float4(*Pointer<UInt4>(source1)); v.w = *Pointer<Float4>(source3);
v.z = Float4(*Pointer<UInt4>(source2));
v.w = Float4(*Pointer<UInt4>(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; break;
case VK_FORMAT_R16_SFLOAT: case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R16G16_SFLOAT: case VK_FORMAT_R16G16_SFLOAT:
...@@ -504,9 +415,29 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -504,9 +415,29 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St
} }
break; break;
case VK_FORMAT_A2R10G10B10_SNORM_PACK32: case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
case VK_FORMAT_A2R10G10B10_SINT_PACK32:
bgra = true; bgra = true;
// [[fallthrough]]
case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 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;
// [[fallthrough]]
case VK_FORMAT_A2B10G10R10_SINT_PACK32: case VK_FORMAT_A2B10G10R10_SINT_PACK32:
{ {
Int4 src; Int4 src;
...@@ -514,35 +445,16 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -514,35 +445,16 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St
src = Insert(src, *Pointer<Int>(source1), 1); src = Insert(src, *Pointer<Int>(source1), 1);
src = Insert(src, *Pointer<Int>(source2), 2); src = Insert(src, *Pointer<Int>(source2), 2);
src = Insert(src, *Pointer<Int>(source3), 3); src = Insert(src, *Pointer<Int>(source3), 3);
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float v.x = As<Float4>((src << 22) >> 22);
{ v.y = As<Float4>((src << 12) >> 22);
v.x = Float4((src << 22) >> 22); v.z = As<Float4>((src << 02) >> 22);
v.y = Float4((src << 12) >> 22); v.w = As<Float4>(src >> 30);
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);
}
} }
break; break;
case VK_FORMAT_A2R10G10B10_UNORM_PACK32: case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
case VK_FORMAT_A2R10G10B10_UINT_PACK32:
bgra = true; bgra = true;
// [[fallthrough]]
case VK_FORMAT_A2B10G10R10_UNORM_PACK32: case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
{ {
Int4 src; Int4 src;
src = Insert(src, *Pointer<Int>(source0), 0); src = Insert(src, *Pointer<Int>(source0), 0);
...@@ -550,28 +462,32 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -550,28 +462,32 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St
src = Insert(src, *Pointer<Int>(source2), 2); src = Insert(src, *Pointer<Int>(source2), 2);
src = Insert(src, *Pointer<Int>(source3), 3); 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.x = Float4(src & Int4(0x3FF)); v.z = Float4((src >> 20) & Int4(0x3FF));
v.y = Float4((src >> 10) & Int4(0x3FF)); v.w = Float4((src >> 30) & Int4(0x3));
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.x *= Float4(1.0f / 0x3FF); v.z *= Float4(1.0f / 0x3FF);
v.y *= Float4(1.0f / 0x3FF); v.w *= Float4(1.0f / 0x3);
v.z *= Float4(1.0f / 0x3FF); }
v.w *= Float4(1.0f / 0x3); break;
} case VK_FORMAT_A2R10G10B10_UINT_PACK32:
} bgra = true;
else // Stream: UInt, Shader attrib: Int/UInt, no type conversion // [[fallthrough]]
{ case VK_FORMAT_A2B10G10R10_UINT_PACK32:
v.x = As<Float4>(src & Int4(0x3FF)); {
v.y = As<Float4>((src >> 10) & Int4(0x3FF)); Int4 src;
v.z = As<Float4>((src >> 20) & Int4(0x3FF)); src = Insert(src, *Pointer<Int>(source0), 0);
v.w = As<Float4>((src >> 30) & Int4(0x3)); src = Insert(src, *Pointer<Int>(source1), 1);
} src = Insert(src, *Pointer<Int>(source2), 2);
src = Insert(src, *Pointer<Int>(source3), 3);
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; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment