summaryrefslogtreecommitdiffstats
path: root/Graphics/GLSLTools
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2020-09-08 19:20:39 +0000
committerazhirnov <zh1dron@gmail.com>2020-09-08 19:20:39 +0000
commit33f1e79c50bb75f496dc3cad0bebbebacd390ab3 (patch)
treea3f8d779580fb1e47f3b2457c152ed73c2a2e088 /Graphics/GLSLTools
parentremoved DILIGENT_HAS_SPIRV_DXCOMPILER, it not needed because used dynamic loa... (diff)
downloadDiligentCore-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.hpp2
-rw-r--r--Graphics/GLSLTools/src/SPIRVUtils.cpp161
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