diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index e96680d531cab75940796321b9d23c43177f3510..8480ca67374f491a563e4451dec4dca9c022b361 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -156,6 +156,7 @@ const char* entryPointName = nullptr; const char* sourceEntryPointName = nullptr; const char* shaderStageName = nullptr; const char* variableName = nullptr; +bool HlslEnable16BitTypes = false; std::vector<std::string> IncludeDirectoryList; int ClientInputSemanticsVersion = 100; // maps to, say, #define VULKAN 100 glslang::EshTargetClientVersion VulkanClientVersion = @@ -453,6 +454,8 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem lowerword == "hlsl-iomapper" || lowerword == "hlsl-iomapping") { Options |= EOptionHlslIoMapping; + } else if (lowerword == "hlsl-enable-16bit-types") { + HlslEnable16BitTypes = true; } else if (lowerword == "invert-y" || // synonyms lowerword == "iy") { Options |= EOptionInvertY; @@ -520,7 +523,7 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem setOpenGlSpv(); OpenGLClientVersion = glslang::EShTargetOpenGL_450; } else - Error("--target-env expected vulkan1.0 or opengl"); + Error("--target-env expected vulkan1.0, opengl, or hlsl-16bit-types"); } bumpArg(); } else if (lowerword == "variable-name" || // synonyms @@ -708,6 +711,8 @@ void SetMessageOptions(EShMessages& messages) messages = (EShMessages)(messages | EShMsgHlslOffsets); if (Options & EOptionDebug) messages = (EShMessages)(messages | EShMsgDebugInfo); + if (HlslEnable16BitTypes) + messages = (EShMessages)(messages | EShMsgHlslEnable16BitTypes); } // @@ -1341,6 +1346,7 @@ void usage() " --hlsl-offsets Allow block offsets to follow HLSL rules\n" " Works independently of source language\n" " --hlsl-iomap Perform IO mapping in HLSL register space\n" + " --hlsl-enable-16bit-types Allow use of 16-bit types in SPIR-V for HLSL\n" " --invert-y | --iy invert position.Y output in vertex shader\n" " --keep-uncalled don't eliminate uncalled functions\n" " --ku synonym for --keep-uncalled\n" diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 1d5cebf4bd2626c099c23738e7fc7bf8ea71e8c4..4b56547509d4a8bb07a2cf923121de8128686950 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -1,3 +1,3 @@ // This header is generated by the make-revision script. -#define GLSLANG_PATCH_LEVEL 2601 +#define GLSLANG_PATCH_LEVEL 2604 diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h index df65f6c1fa2eb0225d2431e8dfc82605c9eac6cb..b2aaa39955f6d7f4316b17f202f2f1d91877d9df 100755 --- a/glslang/MachineIndependent/parseVersions.h +++ b/glslang/MachineIndependent/parseVersions.h @@ -119,6 +119,7 @@ public: bool relaxedErrors() const { return (messages & EShMsgRelaxedErrors) != 0; } bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; } bool isReadingHLSL() const { return (messages & EShMsgReadHlsl) == EShMsgReadHlsl; } + bool hlslEnable16BitTypes() const { return (messages & EShMsgHlslEnable16BitTypes) != 0; } TInfoSink& infoSink; diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index 6f0bc5411193dbc5bef580f8338421691f4ae15f..67cb3baaad0bc0540386e960fd4efc43ce8608a7 100644 --- a/glslang/Public/ShaderLang.h +++ b/glslang/Public/ShaderLang.h @@ -70,7 +70,7 @@ // This should always increase, as some paths to do not consume // a more major number. // It should increment by one when new functionality is added. -#define GLSLANG_MINOR_VERSION 2 +#define GLSLANG_MINOR_VERSION 3 // // Call before doing any other compiler/linker operations. @@ -211,6 +211,7 @@ enum EShMessages { EShMsgKeepUncalled = (1 << 8), // for testing, don't eliminate uncalled functions EShMsgHlslOffsets = (1 << 9), // allow block offsets to follow HLSL rules instead of GLSL rules EShMsgDebugInfo = (1 << 10), // save debug information + EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL }; // diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 8bcee50e78ddadf36d196251d888e723a067af69..72d636dae7178c7eae3841547c79d04e850a8260 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -1379,12 +1379,23 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList) { // Basic types for min* types, broken out here in case of future // changes, e.g, to use native halfs. +#ifdef AMD_EXTENSIONS + bool enable16BitTypes = parseContext.hlslEnable16BitTypes(); + + const TBasicType min16float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType min10float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType half_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType min16int_bt = enable16BitTypes ? EbtInt16 : EbtInt; + const TBasicType min12int_bt = enable16BitTypes ? EbtInt16 : EbtInt; + const TBasicType min16uint_bt = enable16BitTypes ? EbtUint16 : EbtUint; +#else static const TBasicType min16float_bt = EbtFloat; static const TBasicType min10float_bt = EbtFloat; static const TBasicType half_bt = EbtFloat; static const TBasicType min16int_bt = EbtInt; static const TBasicType min12int_bt = EbtInt; static const TBasicType min16uint_bt = EbtUint; +#endif // Some types might have turned into identifiers. Take the hit for checking // when this has happened.