diff --git a/Test/baseResults/hlsl.pp.line.frag.out b/Test/baseResults/hlsl.pp.line.frag.out new file mode 100644 index 0000000000000000000000000000000000000000..6484eb0d9e68141015bfa3de3580203d38570ed3 --- /dev/null +++ b/Test/baseResults/hlsl.pp.line.frag.out @@ -0,0 +1,124 @@ +hlsl.pp.line.frag +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:131 Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:4 Function Parameters: +0:? Sequence +0:124 Sequence +0:124 move second child to first child (temp int) +0:124 'thisLineIs' (temp int) +0:124 Constant: +0:124 124 (const int) +0:126 move second child to first child (temp 4-component vector of float) +0:126 Color: direct index for structure (temp 4-component vector of float) +0:126 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:126 Constant: +0:126 0 (const int) +0:? Construct vec4 (temp 4-component vector of float) +0:126 Convert int to float (temp float) +0:126 'thisLineIs' (temp int) +0:126 Constant: +0:126 0.000000 +0:126 Constant: +0:126 0.000000 +0:126 Constant: +0:126 1.000000 +0:127 move second child to first child (temp float) +0:127 Depth: direct index for structure (temp float FragDepth) +0:127 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 1.000000 +0:129 Branch: Return with expression +0:129 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:? Linker Objects + + +Linked fragment stage: + + +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:131 Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:4 Function Parameters: +0:? Sequence +0:124 Sequence +0:124 move second child to first child (temp int) +0:124 'thisLineIs' (temp int) +0:124 Constant: +0:124 124 (const int) +0:126 move second child to first child (temp 4-component vector of float) +0:126 Color: direct index for structure (temp 4-component vector of float) +0:126 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:126 Constant: +0:126 0 (const int) +0:? Construct vec4 (temp 4-component vector of float) +0:126 Convert int to float (temp float) +0:126 'thisLineIs' (temp int) +0:126 Constant: +0:126 0.000000 +0:126 Constant: +0:126 0.000000 +0:126 Constant: +0:126 1.000000 +0:127 move second child to first child (temp float) +0:127 Depth: direct index for structure (temp float FragDepth) +0:127 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 1.000000 +0:129 Branch: Return with expression +0:129 'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth}) +0:? Linker Objects + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 28 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source HLSL 450 + Name 4 "main" + Name 8 "thisLineIs" + Name 12 "PS_OUTPUT" + MemberName 12(PS_OUTPUT) 0 "Color" + MemberName 12(PS_OUTPUT) 1 "Depth" + Name 14 "psout" + MemberDecorate 12(PS_OUTPUT) 1 BuiltIn FragDepth + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7: TypePointer Function 6(int) + 9: 6(int) Constant 124 + 10: TypeFloat 32 + 11: TypeVector 10(float) 4 + 12(PS_OUTPUT): TypeStruct 11(fvec4) 10(float) + 13: TypePointer Function 12(PS_OUTPUT) + 15: 6(int) Constant 0 + 18: 10(float) Constant 0 + 19: 10(float) Constant 1065353216 + 21: TypePointer Function 11(fvec4) + 23: 6(int) Constant 1 + 24: TypePointer Function 10(float) + 4(main): 2 Function None 3 + 5: Label + 8(thisLineIs): 7(ptr) Variable Function + 14(psout): 13(ptr) Variable Function + Store 8(thisLineIs) 9 + 16: 6(int) Load 8(thisLineIs) + 17: 10(float) ConvertSToF 16 + 20: 11(fvec4) CompositeConstruct 17 18 18 19 + 22: 21(ptr) AccessChain 14(psout) 15 + Store 22 20 + 25: 24(ptr) AccessChain 14(psout) 23 + Store 25 19 + 26:12(PS_OUTPUT) Load 14(psout) + ReturnValue 26 + FunctionEnd diff --git a/Test/hlsl.pp.line.frag b/Test/hlsl.pp.line.frag new file mode 100644 index 0000000000000000000000000000000000000000..6f0273dcb2d9adb50c9ce0a755d370f904e5574a --- /dev/null +++ b/Test/hlsl.pp.line.frag @@ -0,0 +1,24 @@ + +#line 1 + +struct PS_OUTPUT +{ + float4 Color : SV_Target0; + float Depth : SV_Depth; +}; + +#line 2 + +PS_OUTPUT main() +{ + PS_OUTPUT psout; + +#line 123 "SomeFile.frag" + + int thisLineIs = __LINE__; // gets 124 + + psout.Color = float4(thisLineIs, 0, 0, 1); + psout.Depth = 1.0; + + return psout; +} diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h index c0c8945742251dfbe802564df1f0a2778fec08ca..dc51682beb274634c8dbc4669f7ef7acd5f02463 100755 --- a/glslang/MachineIndependent/parseVersions.h +++ b/glslang/MachineIndependent/parseVersions.h @@ -119,12 +119,12 @@ public: TIntermediate& intermediate; // helper for making and hooking up pieces of the parse tree protected: + TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to EShMessages messages; // errors/warnings/rule-sets int numErrors; // number of compile-time errors encountered TInputScanner* currentScanner; private: - TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to explicit TParseVersions(const TParseVersions&); TParseVersions& operator=(const TParseVersions&); }; diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 0be8850cfe609af42d3fdf755b6de3c93124af8c..5a5418cd053edda060b865221d85b3451845d70c 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -101,6 +101,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.load.basic.dx10.frag", "main"}, {"hlsl.load.offset.dx10.frag", "main"}, {"hlsl.load.offsetarray.dx10.frag", "main"}, + {"hlsl.pp.line.frag", "main"}, {"hlsl.sample.array.dx10.frag", "main"}, {"hlsl.sample.basic.dx10.frag", "main"}, {"hlsl.sample.offset.dx10.frag", "main"}, diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 5b265f1b573378b5eb69f59ee82f0e5125a4412e..17f0d0172947225db3162e50e630ff9369995375 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -88,6 +88,14 @@ HlslParseContext::~HlslParseContext() { } +void HlslParseContext::initializeExtensionBehavior() +{ + TParseContextBase::initializeExtensionBehavior(); + + // HLSL allows #line by default. + extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhEnable; +} + void HlslParseContext::setLimits(const TBuiltInResource& r) { resources = r; diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index 9c404ae4669f0f7d373f94c067091ff2d2753767..a3ca85bbbf94b229541a5b4221ff3f309d733c3e 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -47,6 +47,8 @@ public: int version, EProfile, const SpvVersion& spvVersion, EShLanguage, TInfoSink&, bool forwardCompatible = false, EShMessages messages = EShMsgDefault); virtual ~HlslParseContext(); + void initializeExtensionBehavior(); + void setLimits(const TBuiltInResource&); bool parseShaderStrings(TPpContext&, TInputScanner& input, bool versionWillBeError = false); void getPreamble(std::string&); @@ -182,7 +184,6 @@ protected: HlslParseContext(HlslParseContext&); HlslParseContext& operator=(HlslParseContext&); - TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2 * 2)); // see computeSamplerTypeIndex() bool afterEOF; TQualifier globalBufferDefaults;