From 33f1e79c50bb75f496dc3cad0bebbebacd390ab3 Mon Sep 17 00:00:00 2001 From: azhirnov Date: Tue, 8 Sep 2020 22:20:39 +0300 Subject: removed StripReflectInfoPass2 - changes will be added to spirv-tools --- Graphics/GLSLTools/include/SPIRVUtils.hpp | 2 - Graphics/GLSLTools/src/SPIRVUtils.cpp | 161 ------------------------------ 2 files changed, 163 deletions(-) (limited to 'Graphics/GLSLTools') diff --git a/Graphics/GLSLTools/include/SPIRVUtils.hpp b/Graphics/GLSLTools/include/SPIRVUtils.hpp index 8c645a64..50025303 100644 --- a/Graphics/GLSLTools/include/SPIRVUtils.hpp +++ b/Graphics/GLSLTools/include/SPIRVUtils.hpp @@ -46,6 +46,4 @@ std::vector HLSLtoSPIRV(const ShaderCreateInfo& Attribs, const char* ExtraDefinitions, IDataBlob** ppCompilerOutput); -std::vector StripReflection(const std::vector& OriginalSPIRV); - } // namespace Diligent \ No newline at end of file diff --git a/Graphics/GLSLTools/src/SPIRVUtils.cpp b/Graphics/GLSLTools/src/SPIRVUtils.cpp index 24daebf1..f550e88e 100644 --- a/Graphics/GLSLTools/src/SPIRVUtils.cpp +++ b/Graphics/GLSLTools/src/SPIRVUtils.cpp @@ -565,166 +565,5 @@ std::vector GLSLtoSPIRV(const SHADER_TYPE ShaderType, const char* return std::move(SPIRV); } } -} // namespace Diligent - -// This is modified version of StripReflectInfoPass from SPIRV-Tools -// Original source code licensed under the Apache License, Version 2.0 -// For full license text see "ThirdParty\SPIRV-Tools\LICENSE". -class StripReflectInfoPass2 : public spvtools::opt::Pass -{ -public: - const char* name() const override { return "strip-reflect-2"; } - - // Return the mask of preserved Analyses. - spvtools::opt::IRContext::Analysis GetPreservedAnalyses() override - { - using namespace spvtools::opt; - return IRContext::kAnalysisInstrToBlockMapping | - IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | - IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisNameMap | - IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; - } - - Status Process() override - { - using namespace spvtools::opt; - bool modified = false; - - std::vector to_remove; - - for (auto& inst : context()->module()->annotations()) - { - switch (inst.opcode()) - { - case SpvOpDecorateStringGOOGLE: - to_remove.push_back(&inst); - break; - - case SpvOpMemberDecorateStringGOOGLE: - to_remove.push_back(&inst); - break; - - case SpvOpDecorateId: - if (inst.GetSingleWordInOperand(1) == - SpvDecorationHlslCounterBufferGOOGLE) - { - to_remove.push_back(&inst); - } - break; - - default: - break; - } - } - - for (auto& inst : context()->module()->extensions()) - { - const char* ext_name = - reinterpret_cast(&inst.GetInOperand(0).words[0]); - if (0 == std::strcmp(ext_name, "SPV_GOOGLE_hlsl_functionality1")) - { - to_remove.push_back(&inst); - } - else if (0 == std::strcmp(ext_name, "SPV_GOOGLE_decorate_string")) - { - to_remove.push_back(&inst); - } - else if (0 == std::strcmp(ext_name, "SPV_GOOGLE_user_type")) - { - to_remove.push_back(&inst); - } - else if (0 == std::strcmp(ext_name, "SPV_KHR_non_semantic_info")) - { - to_remove.push_back(&inst); - } - } - - // clear all debug data now if it hasn't been cleared already, to remove any - // remaining OpString that may have been referenced by non-semantic extinsts - for (auto& dbg : context()->debugs1()) to_remove.push_back(&dbg); - for (auto& dbg : context()->debugs2()) to_remove.push_back(&dbg); - for (auto& dbg : context()->debugs3()) to_remove.push_back(&dbg); - for (auto& dbg : context()->ext_inst_debuginfo()) to_remove.push_back(&dbg); - - // remove any extended inst imports that are non semantic - std::unordered_set non_semantic_sets; - for (auto& inst : context()->module()->ext_inst_imports()) - { - assert(inst.opcode() == SpvOpExtInstImport && - "Expecting an import of an extension's instruction set."); - const char* extension_name = - reinterpret_cast(&inst.GetInOperand(0).words[0]); - if (0 == std::strncmp(extension_name, "NonSemantic.", 12)) - { - non_semantic_sets.insert(inst.result_id()); - to_remove.push_back(&inst); - } - } - - // if we removed some non-semantic sets, then iterate over the instructions in - // the module to remove any OpExtInst that referenced those sets - if (!non_semantic_sets.empty()) - { - context()->module()->ForEachInst( - [&non_semantic_sets, &to_remove](Instruction* inst) { - if (inst->opcode() == SpvOpExtInst) - { - if (non_semantic_sets.find(inst->GetSingleWordInOperand(0)) != - non_semantic_sets.end()) - { - to_remove.push_back(inst); - } - } - }); - } - - // OpName must come first, since they may refer to other debug instructions. - // If they are after the instructions that refer to, then they will be killed - // when that instruction is killed, which will lead to a double kill. - std::sort(to_remove.begin(), to_remove.end(), - [](Instruction* lhs, Instruction* rhs) -> bool { - if (lhs->opcode() == SpvOpName && rhs->opcode() != SpvOpName) - return true; - return false; - }); - - for (auto* inst : to_remove) - { - modified = true; - context()->KillInst(inst); - } - - return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; - } -}; - -struct spvtools::Optimizer::PassToken::Impl -{ - explicit Impl(std::unique_ptr p) : - pass(std::move(p)) {} - - std::unique_ptr pass; // Internal implementation pass. -}; - -namespace Diligent -{ - -std::vector StripReflection(const std::vector& OriginalSPIRV) -{ - std::vector StrippedSPIRV; - spvtools::Optimizer SpirvOptimizer(SPV_ENV_VULKAN_1_0); - // Decorations defined in SPV_GOOGLE_hlsl_functionality1 are the only instructions - // removed by strip-reflect-info pass. SPIRV offsets become INVALID after this operation. - SpirvOptimizer.RegisterPass(spvtools::MakeUnique(spvtools::MakeUnique())); - //SpirvOptimizer.RegisterPass(spvtools::CreateStripReflectInfoPass()); - auto res = SpirvOptimizer.Run(OriginalSPIRV.data(), OriginalSPIRV.size(), &StrippedSPIRV); - if (!res) - { - // Optimized SPIRV may be invalid - StrippedSPIRV.clear(); - } - return StrippedSPIRV; -} } // namespace Diligent -- cgit v1.2.3