From 7ea7ff4cd444fd884acb5d50047adfa2c3674a4f Mon Sep 17 00:00:00 2001 From: steve-lunarg Date: Tue, 3 Jan 2017 14:42:18 -0700 Subject: [PATCH] Add EOpD3DCOLORtoUBYTE4 decomposition --- .../hlsl.intrinsics.d3dcolortoubyte4.frag.out | 111 ++++++++++++++++++ .../hlsl.intrinsics.negative.frag.out | 38 +++++- Test/hlsl.intrinsics.d3dcolortoubyte4.frag | 7 ++ glslang/Include/intermediate.h | 1 + gtests/Hlsl.FromFile.cpp | 1 + hlsl/hlslParseHelper.cpp | 21 ++++ hlsl/hlslParseables.cpp | 2 +- 7 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out create mode 100644 Test/hlsl.intrinsics.d3dcolortoubyte4.frag diff --git a/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out new file mode 100644 index 000000000..0bd429b52 --- /dev/null +++ b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out @@ -0,0 +1,111 @@ +hlsl.intrinsics.d3dcolortoubyte4.frag +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:5 Function Definition: main( (temp 4-component vector of int) +0:5 Function Parameters: +0:? Sequence +0:6 Sequence +0:6 move second child to first child (temp 4-component vector of int) +0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of int) +0:6 Convert float to int (temp 4-component vector of int) +0:6 vector-scale (temp 4-component vector of float) +0:6 Constant: +0:6 255.001953 +0:6 vector swizzle (temp 4-component vector of float) +0:6 col4: direct index for structure (layout(offset=0 ) uniform 4-component vector of float) +0:6 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform 4-component vector of float col4}) +0:6 Constant: +0:6 0 (const uint) +0:6 Sequence +0:6 Constant: +0:6 2 (const int) +0:6 Constant: +0:6 1 (const int) +0:6 Constant: +0:6 0 (const int) +0:6 Constant: +0:6 3 (const int) +0:6 Branch: Return +0:? Linker Objects +0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of int) +0:? 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform 4-component vector of float col4}) + + +Linked fragment stage: + + +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:5 Function Definition: main( (temp 4-component vector of int) +0:5 Function Parameters: +0:? Sequence +0:6 Sequence +0:6 move second child to first child (temp 4-component vector of int) +0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of int) +0:6 Convert float to int (temp 4-component vector of int) +0:6 vector-scale (temp 4-component vector of float) +0:6 Constant: +0:6 255.001953 +0:6 vector swizzle (temp 4-component vector of float) +0:6 col4: direct index for structure (layout(offset=0 ) uniform 4-component vector of float) +0:6 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform 4-component vector of float col4}) +0:6 Constant: +0:6 0 (const uint) +0:6 Sequence +0:6 Constant: +0:6 2 (const int) +0:6 Constant: +0:6 1 (const int) +0:6 Constant: +0:6 0 (const int) +0:6 Constant: +0:6 3 (const int) +0:6 Branch: Return +0:? Linker Objects +0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of int) +0:? 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform 4-component vector of float col4}) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 24 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 9 + ExecutionMode 4 OriginUpperLeft + Name 4 "main" + Name 9 "@entryPointOutput" + Name 13 "$Global" + MemberName 13($Global) 0 "col4" + Name 15 "" + Decorate 9(@entryPointOutput) Location 0 + MemberDecorate 13($Global) 0 Offset 0 + Decorate 13($Global) Block + Decorate 15 DescriptorSet 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7: TypeVector 6(int) 4 + 8: TypePointer Output 7(ivec4) +9(@entryPointOutput): 8(ptr) Variable Output + 10: TypeFloat 32 + 11: 10(float) Constant 1132396672 + 12: TypeVector 10(float) 4 + 13($Global): TypeStruct 12(fvec4) + 14: TypePointer Uniform 13($Global) + 15: 14(ptr) Variable Uniform + 16: 6(int) Constant 0 + 17: TypePointer Uniform 12(fvec4) + 4(main): 2 Function None 3 + 5: Label + 18: 17(ptr) AccessChain 15 16 + 19: 12(fvec4) Load 18 + 20: 12(fvec4) VectorShuffle 19 19 2 1 0 3 + 21: 12(fvec4) VectorTimesScalar 20 11 + 22: 7(ivec4) ConvertFToS 21 + Store 9(@entryPointOutput) 22 + Return + FunctionEnd diff --git a/Test/baseResults/hlsl.intrinsics.negative.frag.out b/Test/baseResults/hlsl.intrinsics.negative.frag.out index e27505432..17601dd1c 100644 --- a/Test/baseResults/hlsl.intrinsics.negative.frag.out +++ b/Test/baseResults/hlsl.intrinsics.negative.frag.out @@ -89,9 +89,22 @@ ERROR: node is still EOpNull! 0:8 'inF0' (in float) 0:8 Construct vec3 (in 3-component vector of float) 0:8 'inF1' (in float) -0:9 Function Call: D3DCOLORtoUBYTE4(vf4; (temp 4-component vector of int) -0:9 Construct vec4 (in 4-component vector of float) -0:9 'inF0' (in float) +0:9 Convert float to int (temp 4-component vector of int) +0:9 vector-scale (temp 4-component vector of float) +0:9 Constant: +0:9 255.001953 +0:9 vector swizzle (temp 4-component vector of float) +0:9 Construct vec4 (in 4-component vector of float) +0:9 'inF0' (in float) +0:9 Sequence +0:9 Constant: +0:9 2 (const int) +0:9 Constant: +0:9 1 (const int) +0:9 Constant: +0:9 0 (const int) +0:9 Constant: +0:9 3 (const int) 0:10 Constant: 0:10 0.000000 0:12 ERROR: Bad unary op @@ -445,9 +458,22 @@ ERROR: node is still EOpNull! 0:8 'inF0' (in float) 0:8 Construct vec3 (in 3-component vector of float) 0:8 'inF1' (in float) -0:9 Function Call: D3DCOLORtoUBYTE4(vf4; (temp 4-component vector of int) -0:9 Construct vec4 (in 4-component vector of float) -0:9 'inF0' (in float) +0:9 Convert float to int (temp 4-component vector of int) +0:9 vector-scale (temp 4-component vector of float) +0:9 Constant: +0:9 255.001953 +0:9 vector swizzle (temp 4-component vector of float) +0:9 Construct vec4 (in 4-component vector of float) +0:9 'inF0' (in float) +0:9 Sequence +0:9 Constant: +0:9 2 (const int) +0:9 Constant: +0:9 1 (const int) +0:9 Constant: +0:9 0 (const int) +0:9 Constant: +0:9 3 (const int) 0:10 Constant: 0:10 0.000000 0:12 ERROR: Bad unary op diff --git a/Test/hlsl.intrinsics.d3dcolortoubyte4.frag b/Test/hlsl.intrinsics.d3dcolortoubyte4.frag new file mode 100644 index 000000000..295374fb7 --- /dev/null +++ b/Test/hlsl.intrinsics.d3dcolortoubyte4.frag @@ -0,0 +1,7 @@ + +uniform float4 col4; + +int4 main() : SV_Target0 +{ + return D3DCOLORtoUBYTE4(col4); +} diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h index 8f7ffcc0d..7fb98cff7 100644 --- a/glslang/Include/intermediate.h +++ b/glslang/Include/intermediate.h @@ -597,6 +597,7 @@ enum TOperator { EOpLit, // HLSL lighting coefficient vector EOpTextureBias, // HLSL texture bias: will be lowered to EOpTexture EOpAsDouble, // slightly different from EOpUint64BitsToDouble + EOpD3DCOLORtoUBYTE4, // convert and swizzle 4-component color to UBYTE4 range EOpMethodSample, // Texture object methods. These are translated to existing EOpMethodSampleBias, // AST methods, and exist to represent HLSL semantics until that diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index f0332aac6..3a03d962f 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -127,6 +127,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"}, {"hlsl.intrinsics.comp", "ComputeShaderFunction"}, {"hlsl.intrinsics.evalfns.frag", "main"}, + {"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"}, {"hlsl.intrinsics.double.frag", "PixelShaderFunction"}, {"hlsl.intrinsics.f1632.frag", "PixelShaderFunction"}, {"hlsl.intrinsics.frag", "main"}, diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 5978ae38a..efda85fc0 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -2629,6 +2629,27 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*& break; } + case EOpD3DCOLORtoUBYTE4: + { + // ivec4 ( x.zyxw * 255.001953 ); + TIntermTyped* arg0 = node->getAsUnaryNode()->getOperand(); + TVectorFields fields(2,1,0,3); + TIntermTyped* swizzleIdx = intermediate.addSwizzle(fields, loc); + TIntermTyped* swizzled = intermediate.addIndex(EOpVectorSwizzle, arg0, swizzleIdx, loc); + swizzled->setType(arg0->getType()); + swizzled->getWritableType().getQualifier().makeTemporary(); + + TIntermTyped* conversion = intermediate.addConstantUnion(255.001953f, EbtFloat, loc, true); + TIntermTyped* rangeConverted = handleBinaryMath(loc, "mul", EOpMul, conversion, swizzled); + rangeConverted->setType(arg0->getType()); + rangeConverted->getWritableType().getQualifier().makeTemporary(); + + node = intermediate.addConversion(EOpConstructInt, TType(EbtInt, EvqTemporary, 4), rangeConverted); + node->setLoc(loc); + node->setType(TType(EbtInt, EvqTemporary, 4)); + break; + } + default: break; // most pass through unchanged } diff --git a/hlsl/hlslParseables.cpp b/hlsl/hlslParseables.cpp index 8ecaec9dd..562a067ca 100755 --- a/hlsl/hlslParseables.cpp +++ b/hlsl/hlslParseables.cpp @@ -1022,7 +1022,7 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil symbolTable.relateToOperator("cosh", EOpCosh); symbolTable.relateToOperator("countbits", EOpBitCount); symbolTable.relateToOperator("cross", EOpCross); - // symbolTable.relateToOperator("D3DCOLORtoUBYTE4", EOpD3DCOLORtoUBYTE4); + symbolTable.relateToOperator("D3DCOLORtoUBYTE4", EOpD3DCOLORtoUBYTE4); symbolTable.relateToOperator("ddx", EOpDPdx); symbolTable.relateToOperator("ddx_coarse", EOpDPdxCoarse); symbolTable.relateToOperator("ddx_fine", EOpDPdxFine);