Command-line: Add support for setting language's environment.
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 92991d1..1e2c8f7 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -148,6 +148,10 @@
const char* shaderStageName = nullptr;
const char* variableName = nullptr;
std::vector<std::string> IncludeDirectoryList;
+int ClientInputSemanticsVersion = 100; // maps to, say, #define VULKAN 100
+int VulkanClientVersion = 100; // would map to, say, Vulkan 1.0
+int OpenGLClientVersion = 450; // doesn't influence anything yet, but maps to OpenGL 4.50
+unsigned int TargetVersion = 0x00001000; // maps to, say, SPIR-V 1.0
std::array<unsigned int, EShLangCount> baseSamplerBinding;
std::array<unsigned int, EShLangCount> baseTextureBinding;
@@ -294,15 +298,15 @@
base[lang].push_back(argv[2]);
base[lang].push_back(argv[3]);
base[lang].push_back(argv[4]);
- argc-= 4;
- argv+= 4;
+ argc -= 4;
+ argv += 4;
while(argv[1] != NULL) {
if(argv[1][0] != '-') {
base[lang].push_back(argv[1]);
base[lang].push_back(argv[2]);
base[lang].push_back(argv[3]);
- argc-= 3;
- argv+= 3;
+ argc -= 3;
+ argv += 3;
}
else {
break;
@@ -352,6 +356,31 @@
return argv[0] + 2;
};
+ // read a number attached to a single-letter option
+ const auto getAttachedNumber = [&](const char* desc) {
+ int num = atoi(argv[0] + 2);
+ if (num == 0) {
+ printf("%s: expected attached non-0 number\n", desc);
+ exit(EFailUsage);
+ }
+ return num;
+ };
+
+ // minimum needed (without overriding something else) to target Vulkan SPIR-V
+ const auto setVulkanSpv = []() {
+ Options |= EOptionSpv;
+ Options |= EOptionVulkanRules;
+ Options |= EOptionLinkProgram;
+ };
+
+ // minimum needed (without overriding something else) to target OpenGL SPIR-V
+ const auto setOpenGlSpv = []() {
+ Options |= EOptionSpv;
+ Options |= EOptionLinkProgram;
+ // undo a -H default to Vulkan
+ Options &= ~EOptionVulkanRules;
+ };
+
for (bumpArg(); argc >= 1; bumpArg()) {
if (argv[0][0] == '-') {
switch (argv[0][1]) {
@@ -362,12 +391,22 @@
// handle --word style options
if (lowerword == "auto-map-bindings" || // synonyms
- lowerword == "auto-map-binding" ||
- lowerword == "amb") {
+ lowerword == "auto-map-binding" ||
+ lowerword == "amb") {
Options |= EOptionAutoMapBindings;
} else if (lowerword == "auto-map-locations" || // synonyms
lowerword == "aml") {
Options |= EOptionAutoMapLocations;
+ } else if (lowerword == "client") {
+ if (argc > 1) {
+ if (strcmp(argv[1], "vulkan100") == 0)
+ setVulkanSpv();
+ else if (strcmp(argv[1], "opengl100") == 0)
+ setOpenGlSpv();
+ else
+ Error("--client expects vulkan100 or opengl100");
+ }
+ bumpArg();
} else if (lowerword == "flatten-uniform-arrays" || // synonyms
lowerword == "flatten-uniform-array" ||
lowerword == "fua") {
@@ -422,6 +461,18 @@
sourceEntryPointName = argv[1];
bumpArg();
break;
+ } else if (lowerword == "target-env") {
+ if (argc > 1) {
+ if (strcmp(argv[1], "vulkan1.0") == 0) {
+ setVulkanSpv();
+ VulkanClientVersion = 100;
+ } else if (strcmp(argv[1], "opengl") == 0) {
+ setOpenGlSpv();
+ OpenGLClientVersion = 450;
+ } else
+ Error("--target-env expected vulkan1.0 or opengl");
+ }
+ bumpArg();
} else if (lowerword == "variable-name" || // synonyms
lowerword == "vn") {
Options |= EOptionOutputHexadecimal;
@@ -448,18 +499,16 @@
Options |= EOptionOutputPreprocessed;
break;
case 'G':
- Options |= EOptionSpv;
- Options |= EOptionLinkProgram;
- // undo a -H default to Vulkan
- Options &= ~EOptionVulkanRules;
+ // OpenGL Client
+ setOpenGlSpv();
+ if (argv[0][2] != 0)
+ ClientInputSemanticsVersion = getAttachedNumber("-G<num> client input semantics");
break;
case 'H':
Options |= EOptionHumanReadableSpv;
if ((Options & EOptionSpv) == 0) {
// default to Vulkan
- Options |= EOptionSpv;
- Options |= EOptionVulkanRules;
- Options |= EOptionLinkProgram;
+ setVulkanSpv();
}
break;
case 'I':
@@ -475,9 +524,9 @@
UserPreamble.addUndef(getStringOperand("-U<macro>: macro name"));
break;
case 'V':
- Options |= EOptionSpv;
- Options |= EOptionVulkanRules;
- Options |= EOptionLinkProgram;
+ setVulkanSpv();
+ if (argv[0][2] != 0)
+ ClientInputSemanticsVersion = getAttachedNumber("-G<num> client input semantics");
break;
case 'c':
Options |= EOptionDumpConfig;
@@ -716,15 +765,15 @@
if (Options & EOptionVulkanRules) {
shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl
: glslang::EShSourceGlsl,
- compUnit.stage, glslang::EShClientVulkan, 100);
- shader->setEnvClient(glslang::EShClientVulkan, 100);
- shader->setEnvTarget(glslang::EshTargetSpv, 0x00001000);
+ compUnit.stage, glslang::EShClientVulkan, ClientInputSemanticsVersion);
+ shader->setEnvClient(glslang::EShClientVulkan, VulkanClientVersion);
+ shader->setEnvTarget(glslang::EshTargetSpv, TargetVersion);
} else {
shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl
: glslang::EShSourceGlsl,
- compUnit.stage, glslang::EShClientOpenGL, 100);
- shader->setEnvClient(glslang::EShClientOpenGL, 450);
- shader->setEnvTarget(glslang::EshTargetSpv, 0x00001000);
+ compUnit.stage, glslang::EShClientOpenGL, ClientInputSemanticsVersion);
+ shader->setEnvClient(glslang::EShClientOpenGL, OpenGLClientVersion);
+ shader->setEnvTarget(glslang::EshTargetSpv, TargetVersion);
}
}
@@ -1085,16 +1134,24 @@
" -D<macro> define a pre-processor macro\n"
" -E print pre-processed GLSL; cannot be used with -l;\n"
" errors will appear on stderr.\n"
- " -G create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
+ " -G[ver] create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
" default file name is <stage>.spv (-o overrides this)\n"
+ " 'ver', when present, is the version of the input semantics,\n"
+ " which will appear in #define GL_SPIRV ver\n"
+ " '--client opengl100' is the same as -G100\n"
+ " a '--target-env' for OpenGL will also imply '-G'\n"
" -H print human readable form of SPIR-V; turns on -V\n"
" -I<dir> add dir to the include search path; includer's directory\n"
" is searched first, followed by left-to-right order of -I\n"
" -S <stage> uses specified stage rather than parsing the file extension\n"
" choices for <stage> are vert, tesc, tese, geom, frag, or comp\n"
- " -U<macro> undefine a pre-precossor macro\n"
- " -V create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
+ " -U<macro> undefine a pre-processor macro\n"
+ " -V[ver] create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
" default file name is <stage>.spv (-o overrides this)\n"
+ " 'ver', when present, is the version of the input semantics,\n"
+ " which will appear in #define VULKAN ver\n"
+ " '--client vulkan100' is the same as -V100\n"
+ " a '--target-env' for Vulkan will also imply '-V'\n"
" -c configuration dump;\n"
" creates the default configuration file (redirect to a .conf file)\n"
" -d default to desktop (#version 110) when there is no shader #version\n"
@@ -1119,6 +1176,7 @@
" --auto-map-locations automatically locate input/output lacking\n"
" 'location' (fragile, not cross stage)\n"
" --aml synonym for --auto-map-locations\n"
+ " --client {vulkan<ver>|opengl<ver>} see -V and -G\n"
" --flatten-uniform-arrays flatten uniform texture/sampler arrays to\n"
" scalars\n"
" --fua synonym for --flatten-uniform-arrays\n"
@@ -1147,6 +1205,11 @@
" --source-entrypoint name the given shader source function is\n"
" renamed to be the entry point given in -e\n"
" --sep synonym for --source-entrypoint\n"
+ " --target-env {vulkan1.0|opengl} set the execution environment the generated\n"
+ " code will execute in (as opposed to language\n"
+ " semantics selected by --client)\n"
+ " default is 'vulkan1.0' under '--client vulkan'\n"
+ " default is 'opengl' under '--client opengl'\n"
" --variable-name <name> Creates a C header file that contains a\n"
" uint32_t array named <name>\n"
" initialized with the shader binary code.\n"