|
|
@@ -33,6 +33,15 @@
|
|
|
|
|
|
namespace spvtools {
|
|
|
|
|
|
+std::vector<std::string> GetVectorOfStrings(const char** strings,
|
|
|
+ const size_t string_count) {
|
|
|
+ std::vector<std::string> result;
|
|
|
+ for (uint32_t i = 0; i < string_count; i++) {
|
|
|
+ result.emplace_back(strings[i]);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
struct Optimizer::PassToken::Impl {
|
|
|
Impl(std::unique_ptr<opt::Pass> p) : pass(std::move(p)) {}
|
|
|
|
|
|
@@ -256,8 +265,13 @@ Optimizer& Optimizer::RegisterSizePasses(bool preserve_interface) {
|
|
|
Optimizer& Optimizer::RegisterSizePasses() { return RegisterSizePasses(false); }
|
|
|
|
|
|
bool Optimizer::RegisterPassesFromFlags(const std::vector<std::string>& flags) {
|
|
|
+ return RegisterPassesFromFlags(flags, false);
|
|
|
+}
|
|
|
+
|
|
|
+bool Optimizer::RegisterPassesFromFlags(const std::vector<std::string>& flags,
|
|
|
+ bool preserve_interface) {
|
|
|
for (const auto& flag : flags) {
|
|
|
- if (!RegisterPassFromFlag(flag)) {
|
|
|
+ if (!RegisterPassFromFlag(flag, preserve_interface)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -281,6 +295,11 @@ bool Optimizer::FlagHasValidForm(const std::string& flag) const {
|
|
|
}
|
|
|
|
|
|
bool Optimizer::RegisterPassFromFlag(const std::string& flag) {
|
|
|
+ return RegisterPassFromFlag(flag, false);
|
|
|
+}
|
|
|
+
|
|
|
+bool Optimizer::RegisterPassFromFlag(const std::string& flag,
|
|
|
+ bool preserve_interface) {
|
|
|
if (!FlagHasValidForm(flag)) {
|
|
|
return false;
|
|
|
}
|
|
|
@@ -342,7 +361,7 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) {
|
|
|
} else if (pass_name == "descriptor-scalar-replacement") {
|
|
|
RegisterPass(CreateDescriptorScalarReplacementPass());
|
|
|
} else if (pass_name == "eliminate-dead-code-aggressive") {
|
|
|
- RegisterPass(CreateAggressiveDCEPass());
|
|
|
+ RegisterPass(CreateAggressiveDCEPass(preserve_interface));
|
|
|
} else if (pass_name == "eliminate-insert-extract") {
|
|
|
RegisterPass(CreateInsertExtractElimPass());
|
|
|
} else if (pass_name == "eliminate-local-single-block") {
|
|
|
@@ -513,11 +532,11 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) {
|
|
|
} else if (pass_name == "fix-storage-class") {
|
|
|
RegisterPass(CreateFixStorageClassPass());
|
|
|
} else if (pass_name == "O") {
|
|
|
- RegisterPerformancePasses();
|
|
|
+ RegisterPerformancePasses(preserve_interface);
|
|
|
} else if (pass_name == "Os") {
|
|
|
- RegisterSizePasses();
|
|
|
+ RegisterSizePasses(preserve_interface);
|
|
|
} else if (pass_name == "legalize-hlsl") {
|
|
|
- RegisterLegalizationPasses();
|
|
|
+ RegisterLegalizationPasses(preserve_interface);
|
|
|
} else if (pass_name == "remove-unused-interface-variables") {
|
|
|
RegisterPass(CreateRemoveUnusedInterfaceVariablesPass());
|
|
|
} else if (pass_name == "graphics-robust-access") {
|
|
|
@@ -1170,13 +1189,19 @@ SPIRV_TOOLS_EXPORT bool spvOptimizerRegisterPassFromFlag(
|
|
|
|
|
|
SPIRV_TOOLS_EXPORT bool spvOptimizerRegisterPassesFromFlags(
|
|
|
spv_optimizer_t* optimizer, const char** flags, const size_t flag_count) {
|
|
|
- std::vector<std::string> opt_flags;
|
|
|
- for (uint32_t i = 0; i < flag_count; i++) {
|
|
|
- opt_flags.emplace_back(flags[i]);
|
|
|
- }
|
|
|
+ std::vector<std::string> opt_flags =
|
|
|
+ spvtools::GetVectorOfStrings(flags, flag_count);
|
|
|
+ return reinterpret_cast<spvtools::Optimizer*>(optimizer)
|
|
|
+ ->RegisterPassesFromFlags(opt_flags, false);
|
|
|
+}
|
|
|
|
|
|
- return reinterpret_cast<spvtools::Optimizer*>(optimizer)->
|
|
|
- RegisterPassesFromFlags(opt_flags);
|
|
|
+SPIRV_TOOLS_EXPORT bool
|
|
|
+spvOptimizerRegisterPassesFromFlagsWhilePreservingTheInterface(
|
|
|
+ spv_optimizer_t* optimizer, const char** flags, const size_t flag_count) {
|
|
|
+ std::vector<std::string> opt_flags =
|
|
|
+ spvtools::GetVectorOfStrings(flags, flag_count);
|
|
|
+ return reinterpret_cast<spvtools::Optimizer*>(optimizer)
|
|
|
+ ->RegisterPassesFromFlags(opt_flags, true);
|
|
|
}
|
|
|
|
|
|
SPIRV_TOOLS_EXPORT
|