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,39 +225,16 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -225,39 +225,16 @@ 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_R8_UINT:
case VK_FORMAT_R8G8_UINT:
case VK_FORMAT_R8G8B8A8_UINT:
case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 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.x = Float4(*Pointer<Byte4>(source0));
v.y = Float4(*Pointer<Byte4>(source1)); v.y = Float4(*Pointer<Byte4>(source1));
v.z = Float4(*Pointer<Byte4>(source2)); v.z = Float4(*Pointer<Byte4>(source2));
...@@ -265,34 +242,26 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -265,34 +242,26 @@ 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);
if(normalized)
{
if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
if(componentCount >= 2) v.y *= *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 >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
} break;
} case VK_FORMAT_R8_UINT:
else // Stream: UByte, Shader attrib: Int / UInt case VK_FORMAT_R8G8_UINT:
{ case VK_FORMAT_R8G8B8A8_UINT:
case VK_FORMAT_A8B8G8R8_UINT_PACK32:
v.x = As<Float4>(Int4(*Pointer<Byte4>(source0))); v.x = As<Float4>(Int4(*Pointer<Byte4>(source0)));
v.y = As<Float4>(Int4(*Pointer<Byte4>(source1))); v.y = As<Float4>(Int4(*Pointer<Byte4>(source1)));
v.z = As<Float4>(Int4(*Pointer<Byte4>(source2))); v.z = As<Float4>(Int4(*Pointer<Byte4>(source2)));
v.w = As<Float4>(Int4(*Pointer<Byte4>(source3))); 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:
if(isNativeFloatAttrib) // Stream: SByte, Shader attrib: Float
{
v.x = Float4(*Pointer<SByte4>(source0)); v.x = Float4(*Pointer<SByte4>(source0));
v.y = Float4(*Pointer<SByte4>(source1)); v.y = Float4(*Pointer<SByte4>(source1));
v.z = Float4(*Pointer<SByte4>(source2)); v.z = Float4(*Pointer<SByte4>(source2));
...@@ -300,32 +269,25 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -300,32 +269,25 @@ 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);
if(normalized)
{
if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
if(componentCount >= 2) v.y *= *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 >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
} break;
} case VK_FORMAT_R8_SINT:
else // Stream: SByte, Shader attrib: Int / UInt case VK_FORMAT_R8G8_SINT:
{ case VK_FORMAT_R8G8B8A8_SINT:
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:
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float
{
v.x = Float4(*Pointer<Short4>(source0)); v.x = Float4(*Pointer<Short4>(source0));
v.y = Float4(*Pointer<Short4>(source1)); v.y = Float4(*Pointer<Short4>(source1));
v.z = Float4(*Pointer<Short4>(source2)); v.z = Float4(*Pointer<Short4>(source2));
...@@ -333,32 +295,24 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -333,32 +295,24 @@ 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);
if(normalized)
{
if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
if(componentCount >= 2) v.y *= *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 >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
} break;
} case VK_FORMAT_R16_SINT:
else // Stream: Short, Shader attrib: Int/UInt, no type conversion case VK_FORMAT_R16G16_SINT:
{ case VK_FORMAT_R16G16B16A16_SINT:
v.x = As<Float4>(Int4(*Pointer<Short4>(source0))); v.x = As<Float4>(Int4(*Pointer<Short4>(source0)));
v.y = As<Float4>(Int4(*Pointer<Short4>(source1))); v.y = As<Float4>(Int4(*Pointer<Short4>(source1)));
v.z = As<Float4>(Int4(*Pointer<Short4>(source2))); v.z = As<Float4>(Int4(*Pointer<Short4>(source2)));
v.w = As<Float4>(Int4(*Pointer<Short4>(source3))); 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:
if(isNativeFloatAttrib) // Stream: Int, Shader attrib: Float
{
v.x = Float4(*Pointer<UShort4>(source0)); v.x = Float4(*Pointer<UShort4>(source0));
v.y = Float4(*Pointer<UShort4>(source1)); v.y = Float4(*Pointer<UShort4>(source1));
v.z = Float4(*Pointer<UShort4>(source2)); v.z = Float4(*Pointer<UShort4>(source2));
...@@ -366,85 +320,42 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -366,85 +320,42 @@ 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);
if(normalized)
{
if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
if(componentCount >= 2) v.y *= *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 >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort)); if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
} break;
} case VK_FORMAT_R16_UINT:
else // Stream: UShort, Shader attrib: Int/UInt, no type conversion case VK_FORMAT_R16G16_UINT:
{ case VK_FORMAT_R16G16B16A16_UINT:
v.x = As<Float4>(Int4(*Pointer<UShort4>(source0))); v.x = As<Float4>(Int4(*Pointer<UShort4>(source0)));
v.y = As<Float4>(Int4(*Pointer<UShort4>(source1))); v.y = As<Float4>(Int4(*Pointer<UShort4>(source1)));
v.z = As<Float4>(Int4(*Pointer<UShort4>(source2))); v.z = As<Float4>(Int4(*Pointer<UShort4>(source2)));
v.w = As<Float4>(Int4(*Pointer<UShort4>(source3))); 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 = Float4(*Pointer<Int4>(source0));
v.y = Float4(*Pointer<Int4>(source1));
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.x = *Pointer<Float4>(source0);
v.y = *Pointer<Float4>(source1); v.y = *Pointer<Float4>(source1);
v.z = *Pointer<Float4>(source2); v.z = *Pointer<Float4>(source2);
v.w = *Pointer<Float4>(source3); 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 = Float4(*Pointer<UInt4>(source0));
v.y = Float4(*Pointer<UInt4>(source1));
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.x = *Pointer<Float4>(source0);
v.y = *Pointer<Float4>(source1); v.y = *Pointer<Float4>(source1);
v.z = *Pointer<Float4>(source2); v.z = *Pointer<Float4>(source2);
v.w = *Pointer<Float4>(source3); 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,45 +415,46 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -504,45 +415,46 @@ 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:
case VK_FORMAT_A2B10G10R10_SINT_PACK32:
{ {
Int4 src; Int4 src;
src = Insert(src, *Pointer<Int>(source0), 0); src = Insert(src, *Pointer<Int>(source0), 0);
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 = Float4((src << 22) >> 22); v.x = Float4((src << 22) >> 22);
v.y = Float4((src << 12) >> 22); v.y = Float4((src << 12) >> 22);
v.z = Float4((src << 02) >> 22); v.z = Float4((src << 02) >> 22);
v.w = Float4(src >> 30); v.w = Float4(src >> 30);
if(normalized)
{
v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f)); 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.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f));
v.z = Max(v.z * 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)); v.w = Max(v.w, Float4(-1.0f));
} }
} break;
else // Stream: UInt, Shader attrib: Int/UInt, no type conversion case VK_FORMAT_A2R10G10B10_SINT_PACK32:
bgra = true;
// [[fallthrough]]
case VK_FORMAT_A2B10G10R10_SINT_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 = As<Float4>((src << 22) >> 22); v.x = As<Float4>((src << 22) >> 22);
v.y = As<Float4>((src << 12) >> 22); v.y = As<Float4>((src << 12) >> 22);
v.z = As<Float4>((src << 02) >> 22); v.z = As<Float4>((src << 02) >> 22);
v.w = As<Float4>(src >> 30); 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,29 +462,33 @@ Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const St ...@@ -550,29 +462,33 @@ 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.x = Float4(src & Int4(0x3FF));
v.y = Float4((src >> 10) & Int4(0x3FF)); v.y = Float4((src >> 10) & Int4(0x3FF));
v.z = Float4((src >> 20) & Int4(0x3FF)); v.z = Float4((src >> 20) & Int4(0x3FF));
v.w = Float4((src >> 30) & Int4(0x3)); v.w = Float4((src >> 30) & Int4(0x3));
if(normalized)
{
v.x *= Float4(1.0f / 0x3FF); v.x *= Float4(1.0f / 0x3FF);
v.y *= Float4(1.0f / 0x3FF); v.y *= Float4(1.0f / 0x3FF);
v.z *= Float4(1.0f / 0x3FF); v.z *= Float4(1.0f / 0x3FF);
v.w *= Float4(1.0f / 0x3); v.w *= Float4(1.0f / 0x3);
} }
} break;
else // Stream: UInt, Shader attrib: Int/UInt, no type conversion case VK_FORMAT_A2R10G10B10_UINT_PACK32:
bgra = true;
// [[fallthrough]]
case VK_FORMAT_A2B10G10R10_UINT_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 = As<Float4>(src & Int4(0x3FF)); v.x = As<Float4>(src & Int4(0x3FF));
v.y = As<Float4>((src >> 10) & Int4(0x3FF)); v.y = As<Float4>((src >> 10) & Int4(0x3FF));
v.z = As<Float4>((src >> 20) & Int4(0x3FF)); v.z = As<Float4>((src >> 20) & Int4(0x3FF));
v.w = As<Float4>((src >> 30) & Int4(0x3)); v.w = As<Float4>((src >> 30) & Int4(0x3));
} }
}
break; break;
default: default:
UNSUPPORTED("stream.format %d", int(stream.format)); UNSUPPORTED("stream.format %d", int(stream.format));
......
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