From b0df68c490363ac347e454f79886293f661ce4f6 Mon Sep 17 00:00:00 2001 From: Nathaniel Cesario Date: Fri, 15 Dec 2023 12:08:05 -0700 Subject: [PATCH] Add support for GL_ARB_shading_language_include Add support for GL_ARB_shading_language_include. Usage is identical to the way GL_GOOGLE_include_directive currently works glslang (since GL_ARB_shading_language_include is inherently a runtime feature and glslang is an offline compiler). Users can simulate their runtime environment by using a custom glslang::TShader::Includer or using filenames that match their GL runtime names. Closes #249. --- ...cess.arb_shading_language_include.vert.err | 4 ++++ ...cess.arb_shading_language_include.vert.out | 0 ...clude_directive_missing_extension.vert.err | 7 +++++++ ...clude_directive_missing_extension.vert.out | 0 .../preprocessor.include.disabled.vert.err | 20 ++++++++++++++----- ...eprocess.arb_shading_language_include.vert | 14 +++++++++++++ ...s.include_directive_missing_extension.vert | 6 ++++++ glslang/MachineIndependent/Versions.cpp | 3 +++ glslang/MachineIndependent/Versions.h | 1 + glslang/MachineIndependent/parseVersions.h | 5 +++++ .../MachineIndependent/preprocessor/Pp.cpp | 3 ++- gtests/Pp.FromFile.cpp | 2 ++ 12 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 Test/baseResults/preprocess.arb_shading_language_include.vert.err create mode 100644 Test/baseResults/preprocess.arb_shading_language_include.vert.out create mode 100644 Test/baseResults/preprocess.include_directive_missing_extension.vert.err create mode 100644 Test/baseResults/preprocess.include_directive_missing_extension.vert.out create mode 100644 Test/preprocess.arb_shading_language_include.vert create mode 100644 Test/preprocess.include_directive_missing_extension.vert diff --git a/Test/baseResults/preprocess.arb_shading_language_include.vert.err b/Test/baseResults/preprocess.arb_shading_language_include.vert.err new file mode 100644 index 00000000..29c6952e --- /dev/null +++ b/Test/baseResults/preprocess.arb_shading_language_include.vert.err @@ -0,0 +1,4 @@ +ERROR: 0:7: '#include' : Could not process include directive for header name: bar.h +ERROR: 1 compilation errors. No code generated. + + diff --git a/Test/baseResults/preprocess.arb_shading_language_include.vert.out b/Test/baseResults/preprocess.arb_shading_language_include.vert.out new file mode 100644 index 00000000..e69de29b diff --git a/Test/baseResults/preprocess.include_directive_missing_extension.vert.err b/Test/baseResults/preprocess.include_directive_missing_extension.vert.err new file mode 100644 index 00000000..9675dfa0 --- /dev/null +++ b/Test/baseResults/preprocess.include_directive_missing_extension.vert.err @@ -0,0 +1,7 @@ +ERROR: 0:3: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include +ERROR: 0:3: '#include' : Could not process include directive for header name: bar.h +ERROR: 2 compilation errors. No code generated. + + diff --git a/Test/baseResults/preprocess.include_directive_missing_extension.vert.out b/Test/baseResults/preprocess.include_directive_missing_extension.vert.out new file mode 100644 index 00000000..e69de29b diff --git a/Test/baseResults/preprocessor.include.disabled.vert.err b/Test/baseResults/preprocessor.include.disabled.vert.err index 14192046..b0b82962 100644 --- a/Test/baseResults/preprocessor.include.disabled.vert.err +++ b/Test/baseResults/preprocessor.include.disabled.vert.err @@ -1,12 +1,22 @@ -ERROR: 0:8000: '#include' : required extension not requested: GL_GOOGLE_include_directive +ERROR: 0:8000: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include ERROR: 0:8000: '#include' : must be followed by a header name -ERROR: 0:8001: '#include' : required extension not requested: GL_GOOGLE_include_directive +ERROR: 0:8001: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include ERROR: 0:8001: '#include' : must be followed by a header name -ERROR: 0:8002: '#include' : required extension not requested: GL_GOOGLE_include_directive +ERROR: 0:8002: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include ERROR: 0:8002: '#include' : Could not process include directive for header name: foo -ERROR: 0:8003: '#include' : required extension not requested: GL_GOOGLE_include_directive +ERROR: 0:8003: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include ERROR: 0:8003: '#include' : extra content after header name: foo -ERROR: 0:8004: '#include' : required extension not requested: GL_GOOGLE_include_directive +ERROR: 0:8004: '#include' : required extension not requested: Possible extensions include: +GL_GOOGLE_include_directive +GL_ARB_shading_language_include ERROR: 0:8004: '#include' : expected newline after header name: no-eol ERROR: 10 compilation errors. No code generated. diff --git a/Test/preprocess.arb_shading_language_include.vert b/Test/preprocess.arb_shading_language_include.vert new file mode 100644 index 00000000..9920951e --- /dev/null +++ b/Test/preprocess.arb_shading_language_include.vert @@ -0,0 +1,14 @@ +#version 150 + +#extension GL_ARB_shading_language_include : enable + +#define float4 vec4 + +#include "bar.h" + +out vec4 color; + +void main() +{ + color = i1 + vec4(1.0); +} diff --git a/Test/preprocess.include_directive_missing_extension.vert b/Test/preprocess.include_directive_missing_extension.vert new file mode 100644 index 00000000..dbe5b942 --- /dev/null +++ b/Test/preprocess.include_directive_missing_extension.vert @@ -0,0 +1,6 @@ +#version 150 + +#include "bar.h" + +void main() {} + diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index 4019371a..0eb86a47 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -269,6 +269,7 @@ void TParseVersions::initializeExtensionBehavior() // #line and #include extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable; extensionBehavior[E_GL_GOOGLE_include_directive] = EBhDisable; + extensionBehavior[E_GL_ARB_shading_language_include] = EBhDisable; extensionBehavior[E_GL_AMD_shader_ballot] = EBhDisable; extensionBehavior[E_GL_AMD_shader_trinary_minmax] = EBhDisable; @@ -983,6 +984,8 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString); else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); + else if (strcmp(extension, "GL_ARB_shading_language_include") == 0) + updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); // subgroup_* to subgroup_basic else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0) updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index 70240ffb..833c9e3f 100755 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -241,6 +241,7 @@ const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multi // #line and #include const char* const E_GL_GOOGLE_cpp_style_line_directive = "GL_GOOGLE_cpp_style_line_directive"; const char* const E_GL_GOOGLE_include_directive = "GL_GOOGLE_include_directive"; +const char* const E_GL_ARB_shading_language_include = "GL_ARB_shading_language_include"; const char* const E_GL_AMD_shader_ballot = "GL_AMD_shader_ballot"; const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader_trinary_minmax"; diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h index 63841c40..5c77e42c 100644 --- a/glslang/MachineIndependent/parseVersions.h +++ b/glslang/MachineIndependent/parseVersions.h @@ -83,6 +83,11 @@ public: const char* featureDesc); virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc); + template + constexpr void ppRequireExtensions(const TSourceLoc& loc, Container extensions, const char* featureDesc) { + ppRequireExtensions(loc, static_cast(extensions.size()), extensions.data(), featureDesc); + } + virtual TExtensionBehavior getExtensionBehavior(const char*); virtual bool extensionTurnedOn(const char* const extension); virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]); diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 16b9d243..5f18c4e9 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -973,7 +973,8 @@ int TPpContext::readCPPline(TPpToken* ppToken) break; case PpAtomInclude: if(!parseContext.isReadingHLSL()) { - parseContext.ppRequireExtensions(ppToken->loc, 1, &E_GL_GOOGLE_include_directive, "#include"); + const std::array exts = { E_GL_GOOGLE_include_directive, E_GL_ARB_shading_language_include }; + parseContext.ppRequireExtensions(ppToken->loc, exts, "#include"); } token = CPPinclude(ppToken); break; diff --git a/gtests/Pp.FromFile.cpp b/gtests/Pp.FromFile.cpp index 92b4d249..1f960847 100644 --- a/gtests/Pp.FromFile.cpp +++ b/gtests/Pp.FromFile.cpp @@ -67,6 +67,8 @@ INSTANTIATE_TEST_SUITE_P( "preprocessor.defined.vert", "preprocessor.many.endif.vert", "preprocessor.eof_missing.vert", + "preprocess.arb_shading_language_include.vert", + "preprocess.include_directive_missing_extension.vert", })), FileNameAsCustomTestSuffix );