diff options
| author | azhirnov <zh1dron@gmail.com> | 2020-09-08 19:20:39 +0000 |
|---|---|---|
| committer | azhirnov <zh1dron@gmail.com> | 2020-09-08 19:20:39 +0000 |
| commit | 33f1e79c50bb75f496dc3cad0bebbebacd390ab3 (patch) | |
| tree | a3f8d779580fb1e47f3b2457c152ed73c2a2e088 /Graphics/GLSLTools | |
| parent | removed DILIGENT_HAS_SPIRV_DXCOMPILER, it not needed because used dynamic loa... (diff) | |
| download | DiligentCore-33f1e79c50bb75f496dc3cad0bebbebacd390ab3.tar.gz DiligentCore-33f1e79c50bb75f496dc3cad0bebbebacd390ab3.zip | |
removed StripReflectInfoPass2 - changes will be added to spirv-tools
Diffstat (limited to 'Graphics/GLSLTools')
| -rw-r--r-- | Graphics/GLSLTools/include/SPIRVUtils.hpp | 2 | ||||
| -rw-r--r-- | Graphics/GLSLTools/src/SPIRVUtils.cpp | 161 |
2 files changed, 0 insertions, 163 deletions
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<unsigned int> HLSLtoSPIRV(const ShaderCreateInfo& Attribs, const char* ExtraDefinitions, IDataBlob** ppCompilerOutput); -std::vector<uint32_t> StripReflection(const std::vector<uint32_t>& 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<unsigned int> 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<Instruction*> 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<const char*>(&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<uint32_t> 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<const char*>(&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<opt::Pass> p) : - pass(std::move(p)) {} - - std::unique_ptr<opt::Pass> pass; // Internal implementation pass. -}; - -namespace Diligent -{ - -std::vector<uint32_t> StripReflection(const std::vector<uint32_t>& OriginalSPIRV) -{ - std::vector<uint32_t> 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::Optimizer::PassToken::Impl>(spvtools::MakeUnique<StripReflectInfoPass2>())); - //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 |
