HLSL: Manually configure descriptor set and binding number for resources
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 3faadec..b21f20d 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -168,6 +168,7 @@
std::array<unsigned int, EShLangCount> baseUboBinding;
std::array<unsigned int, EShLangCount> baseSsboBinding;
std::array<unsigned int, EShLangCount> baseUavBinding;
+std::array<std::vector<std::string>, EShLangCount> baseResourceSetBinding;
//
// Create the default name for saving a binary if -o is not provided.
@@ -245,6 +246,45 @@
}
}
+void ProcessResourceSetBindingBase(int& argc, char**& argv, std::array<std::vector<std::string>, EShLangCount>& base)
+{
+ if (argc < 2)
+ usage();
+
+ if (!isdigit(argv[1][0])) {
+ if (argc < 5) // this form needs one more argument
+ usage();
+
+ // Parse form: --argname stage base
+ const EShLanguage lang = FindLanguage(argv[1], false);
+
+ base[lang].push_back(argv[2]);
+ base[lang].push_back(argv[3]);
+ base[lang].push_back(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;
+ }
+ else {
+ break;
+ }
+ }
+ } else {
+ // Parse form: --argname base
+ for (int lang=0; lang<EShLangCount; ++lang)
+ base[lang].push_back(argv[1]);
+
+ argc--;
+ argv++;
+ }
+}
+
//
// Do all command-line argument parsing. This includes building up the work-items
// to be processed later, and saving all the command-line options.
@@ -297,6 +337,10 @@
lowerword == "shift-ssbo-binding" ||
lowerword == "sbb") {
ProcessBindingBase(argc, argv, baseSsboBinding);
+ } else if (lowerword == "resource-set-bindings" || // synonyms
+ lowerword == "resource-set-binding" ||
+ lowerword == "rsb") {
+ ProcessResourceSetBindingBase(argc, argv, baseResourceSetBinding);
} else if (lowerword == "shift-uav-bindings" || // synonyms
lowerword == "shift-uav-binding" ||
lowerword == "suavb") {
@@ -594,6 +638,7 @@
shader->setShiftUavBinding(baseUavBinding[compUnit.stage]);
shader->setFlattenUniformArrays((Options & EOptionFlattenUniformArrays) != 0);
shader->setNoStorageFormat((Options & EOptionNoStorageFormat) != 0);
+ shader->setResourceSetBinding(baseResourceSetBinding[compUnit.stage]);
if (Options & EOptionHlslIoMapping)
shader->setHlslIoMapping(true);
@@ -1006,6 +1051,9 @@
" --shift-ssbo-binding [stage] num set base binding number for SSBOs\n"
" --sbb [stage] num synonym for --shift-ssbo-binding\n"
"\n"
+ " --resource-set-binding [stage] num set descriptor set and binding number for resources\n"
+ " --rsb [stage] type set binding synonym for --resource-set-binding\n"
+ "\n"
" --shift-uav-binding [stage] num set base binding number for UAVs\n"
" --suavb [stage] num synonym for --shift-uav-binding\n"
"\n"