Skip to content

Commit

Permalink
Updated spirv-tools.
Browse files Browse the repository at this point in the history
  • Loading branch information
bkaradzic committed Jul 30, 2023
1 parent d15c26d commit efb7f66
Show file tree
Hide file tree
Showing 30 changed files with 806 additions and 159 deletions.
2 changes: 1 addition & 1 deletion 3rdparty/spirv-tools/include/generated/build-version.inc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
"v2023.3", "SPIRV-Tools v2023.3 v2022.4-269-g34399abb"
"v2023.4", "SPIRV-Tools v2023.4 v2022.4-291-ga913df4a"

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions 3rdparty/spirv-tools/include/generated/extension_enum.inc
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ kSPV_INTEL_debug_module,
kSPV_INTEL_device_side_avc_motion_estimation,
kSPV_INTEL_float_controls2,
kSPV_INTEL_fp_fast_math_mode,
kSPV_INTEL_fp_max_error,
kSPV_INTEL_fpga_argument_interfaces,
kSPV_INTEL_fpga_buffer_location,
kSPV_INTEL_fpga_cluster_attributes,
Expand Down
16 changes: 10 additions & 6 deletions 3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ static const spv::Capability pygen_variable_caps_FPGALatencyControlINTEL[] = {sp
static const spv::Capability pygen_variable_caps_FPGALoopControlsINTEL[] = {spv::Capability::FPGALoopControlsINTEL};
static const spv::Capability pygen_variable_caps_FPGAMemoryAccessesINTEL[] = {spv::Capability::FPGAMemoryAccessesINTEL};
static const spv::Capability pygen_variable_caps_FPGAMemoryAttributesINTEL[] = {spv::Capability::FPGAMemoryAttributesINTEL};
static const spv::Capability pygen_variable_caps_FPMaxErrorINTEL[] = {spv::Capability::FPMaxErrorINTEL};
static const spv::Capability pygen_variable_caps_FragmentBarycentricNVFragmentBarycentricKHR[] = {spv::Capability::FragmentBarycentricNV, spv::Capability::FragmentBarycentricKHR};
static const spv::Capability pygen_variable_caps_FragmentDensityEXTShadingRateNV[] = {spv::Capability::FragmentDensityEXT, spv::Capability::ShadingRateNV};
static const spv::Capability pygen_variable_caps_FragmentFullyCoveredEXT[] = {spv::Capability::FragmentFullyCoveredEXT};
Expand Down Expand Up @@ -169,6 +170,7 @@ static const spvtools::Extension pygen_variable_exts_SPV_INTEL_debug_module[] =
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_device_side_avc_motion_estimation[] = {spvtools::Extension::kSPV_INTEL_device_side_avc_motion_estimation};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_float_controls2[] = {spvtools::Extension::kSPV_INTEL_float_controls2};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fp_fast_math_mode[] = {spvtools::Extension::kSPV_INTEL_fp_fast_math_mode};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fp_max_error[] = {spvtools::Extension::kSPV_INTEL_fp_max_error};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fpga_argument_interfaces[] = {spvtools::Extension::kSPV_INTEL_fpga_argument_interfaces};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fpga_buffer_location[] = {spvtools::Extension::kSPV_INTEL_fpga_buffer_location};
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fpga_cluster_attributes[] = {spvtools::Extension::kSPV_INTEL_fpga_cluster_attributes};
Expand Down Expand Up @@ -855,6 +857,7 @@ static const spv_operand_desc_t pygen_variable_DecorationEntries[] = {
{"SingleElementVectorINTEL", 6085, 1, pygen_variable_caps_VectorComputeINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"VectorComputeCallableFunctionINTEL", 6087, 1, pygen_variable_caps_VectorComputeINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MediaBlockIOINTEL", 6140, 1, pygen_variable_caps_VectorComputeINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"FPMaxErrorDecorationINTEL", 6170, 1, pygen_variable_caps_FPMaxErrorINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_FLOAT}, 0xffffffffu, 0xffffffffu},
{"LatencyControlLabelINTEL", 6172, 1, pygen_variable_caps_FPGALatencyControlINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu, 0xffffffffu},
{"LatencyControlConstraintINTEL", 6173, 1, pygen_variable_caps_FPGALatencyControlINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu, 0xffffffffu},
{"ConduitKernelArgumentINTEL", 6175, 1, pygen_variable_caps_FPGAArgumentInterfacesINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
Expand Down Expand Up @@ -1272,6 +1275,7 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
{"BFloat16ConversionINTEL", 6115, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_bfloat16_conversion, {}, 0xffffffffu, 0xffffffffu},
{"SplitBarrierINTEL", 6141, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_split_barrier, {}, 0xffffffffu, 0xffffffffu},
{"FPGAKernelAttributesv2INTEL", 6161, 1, pygen_variable_caps_FPGAKernelAttributesINTEL, 1, pygen_variable_exts_SPV_INTEL_kernel_attributes, {}, 0xffffffffu, 0xffffffffu},
{"FPMaxErrorINTEL", 6169, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fp_max_error, {}, 0xffffffffu, 0xffffffffu},
{"FPGALatencyControlINTEL", 6171, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fpga_latency_control, {}, 0xffffffffu, 0xffffffffu},
{"FPGAArgumentInterfacesINTEL", 6174, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fpga_argument_interfaces, {}, 0xffffffffu, 0xffffffffu},
{"GroupUniformArithmeticKHR", 6400, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_uniform_group_instructions, {}, 0xffffffffu, 0xffffffffu}
Expand Down Expand Up @@ -1299,12 +1303,12 @@ static const spv_operand_desc_t pygen_variable_PackedVectorFormatEntries[] = {
};

static const spv_operand_desc_t pygen_variable_CooperativeMatrixOperandsEntries[] = {
{"None", 0x0000, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixASignedComponents", 0x0001, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixBSignedComponents", 0x0002, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixCSignedComponents", 0x0004, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixResultSignedComponents", 0x0008, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"SaturatingAccumulation", 0x0010, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
{"NoneKHR", 0x0000, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixASignedComponentsKHR", 0x0001, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixBSignedComponentsKHR", 0x0002, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixCSignedComponentsKHR", 0x0004, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"MatrixResultSignedComponentsKHR", 0x0008, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
{"SaturatingAccumulationKHR", 0x0010, 1, pygen_variable_caps_CooperativeMatrixKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
};

static const spv_operand_desc_t pygen_variable_CooperativeMatrixLayoutEntries[] = {
Expand Down
1 change: 1 addition & 0 deletions 3rdparty/spirv-tools/include/spirv-tools/libspirv.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ typedef enum spv_operand_type_t {
// may be larger than 32, which would require such a typed literal value to
// occupy multiple SPIR-V words.
SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER,
SPV_OPERAND_TYPE_LITERAL_FLOAT, // Always 32-bit float.

// Set 3: The literal string operand type.
SPV_OPERAND_TYPE_LITERAL_STRING,
Expand Down
11 changes: 11 additions & 0 deletions 3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,17 @@ Optimizer::PassToken CreateRemoveDontInlinePass();
// object, currently the pass would remove accesschain pointer argument passed
// to the function
Optimizer::PassToken CreateFixFuncCallArgumentsPass();

// Creates a trim-capabilities pass.
// This pass removes unused capabilities for a given module, and if possible,
// associated extensions.
// See `trim_capabilities.h` for the list of supported capabilities.
//
// If the module contains unsupported capabilities, this pass will ignore them.
// This should be fine in most cases, but could yield to incorrect results if
// the unknown capability interacts with one of the trimmed capabilities.
Optimizer::PassToken CreateTrimCapabilitiesPass();

} // namespace spvtools

#endif // INCLUDE_SPIRV_TOOLS_OPTIMIZER_HPP_
7 changes: 7 additions & 0 deletions 3rdparty/spirv-tools/source/binary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,13 @@ spv_result_t Parser::parseOperand(size_t inst_offset,
parsed_operand.number_bit_width = 32;
break;

case SPV_OPERAND_TYPE_LITERAL_FLOAT:
// These are regular single-word literal float operands.
parsed_operand.type = SPV_OPERAND_TYPE_LITERAL_FLOAT;
parsed_operand.number_kind = SPV_NUMBER_FLOATING;
parsed_operand.number_bit_width = 32;
break;

case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
parsed_operand.type = SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER;
Expand Down
4 changes: 4 additions & 0 deletions 3rdparty/spirv-tools/source/diff/diff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2038,6 +2038,10 @@ spv_number_kind_t Differ::GetNumberKind(const IdInstructions& id_to,
// Always unsigned integers.
*number_bit_width = 32;
return SPV_NUMBER_UNSIGNED_INT;
case SPV_OPERAND_TYPE_LITERAL_FLOAT:
// Always float.
*number_bit_width = 32;
return SPV_NUMBER_FLOATING;
case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
switch (inst.opcode()) {
Expand Down
3 changes: 2 additions & 1 deletion 3rdparty/spirv-tools/source/disassemble.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,8 @@ void InstructionDisassembler::EmitOperand(const spv_parsed_instruction_t& inst,
stream_ << opcode_desc->name;
} break;
case SPV_OPERAND_TYPE_LITERAL_INTEGER:
case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER: {
case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
case SPV_OPERAND_TYPE_LITERAL_FLOAT: {
SetRed();
EmitNumericLiteral(&stream_, inst, operand);
ResetColor();
Expand Down
18 changes: 18 additions & 0 deletions 3rdparty/spirv-tools/source/enum_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

#include <algorithm>
#include <cassert>
#include <cstdint>
#include <functional>
Expand Down Expand Up @@ -203,6 +204,14 @@ class EnumSet {
}
}

// Creates a set initialized with the content of the range [begin; end[.
template <class InputIt>
EnumSet(InputIt begin, InputIt end) : EnumSet() {
for (; begin != end; ++begin) {
insert(*begin);
}
}

// Copies the EnumSet `other` into a new EnumSet.
EnumSet(const EnumSet& other)
: buckets_(other.buckets_), size_(other.size_) {}
Expand Down Expand Up @@ -255,6 +264,15 @@ class EnumSet {
// insertion.
iterator insert(const_iterator, T&& value) { return insert(value).first; }

// Inserts all the values in the range [`first`; `last[.
// Similar to `std::unordered_set::insert`.
template <class InputIt>
void insert(InputIt first, InputIt last) {
for (auto it = first; it != last; ++it) {
insert(*it);
}
}

// Removes the value `value` into the set.
// Similar to `std::unordered_set::erase`.
// Returns the number of erased elements.
Expand Down
2 changes: 2 additions & 0 deletions 3rdparty/spirv-tools/source/operand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ const char* spvOperandTypeStr(spv_operand_type_t type) {
case SPV_OPERAND_TYPE_LITERAL_INTEGER:
case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
case SPV_OPERAND_TYPE_LITERAL_FLOAT:
return "literal number";
case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
return "possibly multi-word literal integer";
Expand Down Expand Up @@ -332,6 +333,7 @@ bool spvOperandIsConcrete(spv_operand_type_t type) {
}
switch (type) {
case SPV_OPERAND_TYPE_LITERAL_INTEGER:
case SPV_OPERAND_TYPE_LITERAL_FLOAT:
case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,9 @@ std::vector<uint32_t> AggressiveDCEPass::GetLoadedVariablesFromFunctionCall(
const Instruction* inst) {
assert(inst->opcode() == spv::Op::OpFunctionCall);
std::vector<uint32_t> live_variables;
// NOTE: we should only be checking function call parameters here, not the
// function itself, however, `IsPtr` will trivially return false for
// OpFunction
inst->ForEachInId([this, &live_variables](const uint32_t* operand_id) {
if (!IsPtr(*operand_id)) return;
uint32_t var_id = GetVariableId(*operand_id);
Expand Down Expand Up @@ -995,6 +998,7 @@ void AggressiveDCEPass::InitExtensions() {
"SPV_KHR_uniform_group_instructions",
"SPV_KHR_fragment_shader_barycentric",
"SPV_NV_bindless_texture",
"SPV_EXT_shader_atomic_float_add",
});
}

Expand Down
5 changes: 5 additions & 0 deletions 3rdparty/spirv-tools/source/opt/const_folding_rules.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,11 @@ const analysis::Constant* FoldScalarFPDivide(
return FoldFPScalarDivideByZero(result_type, numerator, const_mgr);
}

uint32_t width = denominator->type()->AsFloat()->width();
if (width != 32 && width != 64) {
return nullptr;
}

const analysis::FloatConstant* denominator_float =
denominator->AsFloatConstant();
if (denominator_float && denominator->GetValueAsDouble() == -0.0) {
Expand Down
7 changes: 6 additions & 1 deletion 3rdparty/spirv-tools/source/opt/convert_to_half_pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ bool ConvertToHalfPass::IsRelaxed(uint32_t id) {

void ConvertToHalfPass::AddRelaxed(uint32_t id) { relaxed_ids_set_.insert(id); }

bool ConvertToHalfPass::CanRelaxOpOperands(Instruction* inst) {
return image_ops_.count(inst->opcode()) == 0;
}

analysis::Type* ConvertToHalfPass::FloatScalarType(uint32_t width) {
analysis::Float float_ty(width);
return context()->get_type_mgr()->GetRegisteredType(&float_ty);
Expand Down Expand Up @@ -313,7 +317,8 @@ bool ConvertToHalfPass::CloseRelaxInst(Instruction* inst) {
relax = true;
get_def_use_mgr()->ForEachUser(inst, [&relax, this](Instruction* uinst) {
if (uinst->result_id() == 0 || !IsFloat(uinst, 32) ||
(!IsDecoratedRelaxed(uinst) && !IsRelaxed(uinst->result_id()))) {
(!IsDecoratedRelaxed(uinst) && !IsRelaxed(uinst->result_id())) ||
!CanRelaxOpOperands(uinst)) {
relax = false;
return;
}
Expand Down
9 changes: 6 additions & 3 deletions 3rdparty/spirv-tools/source/opt/convert_to_half_pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ class ConvertToHalfPass : public Pass {
// Add |id| to the relaxed id set
void AddRelaxed(uint32_t id);

// Return true if the instruction's operands can be relaxed
bool CanRelaxOpOperands(Instruction* inst);

// Return type id for float with |width|
analysis::Type* FloatScalarType(uint32_t width);

Expand Down Expand Up @@ -133,13 +136,13 @@ class ConvertToHalfPass : public Pass {
// Set of 450 extension operations to be processed
std::unordered_set<uint32_t> target_ops_450_;

// Set of sample operations
// Set of all sample operations, including dref and non-dref operations
std::unordered_set<spv::Op, hasher> image_ops_;

// Set of dref sample operations
// Set of only dref sample operations
std::unordered_set<spv::Op, hasher> dref_image_ops_;

// Set of dref sample operations
// Set of operations that can be marked as relaxed
std::unordered_set<spv::Op, hasher> closure_ops_;

// Set of ids of all relaxed instructions
Expand Down
43 changes: 24 additions & 19 deletions 3rdparty/spirv-tools/source/opt/feature_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,19 @@ namespace opt {
// Tracks features enabled by a module. The IRContext has a FeatureManager.
class FeatureManager {
public:
explicit FeatureManager(const AssemblyGrammar& grammar) : grammar_(grammar) {}

// Returns true if |ext| is an enabled extension in the module.
bool HasExtension(Extension ext) const { return extensions_.contains(ext); }

// Removes the given |extension| from the current FeatureManager.
void RemoveExtension(Extension extension);

// Returns true if |cap| is an enabled capability in the module.
bool HasCapability(spv::Capability cap) const {
return capabilities_.contains(cap);
}

// Removes the given |capability| from the current FeatureManager.
void RemoveCapability(spv::Capability capability);

// Analyzes |module| and records enabled extensions and capabilities.
void Analyze(Module* module);
// Returns the capabilities the module declares.
inline const CapabilitySet& GetCapabilities() const { return capabilities_; }

CapabilitySet* GetCapabilities() { return &capabilities_; }
const CapabilitySet* GetCapabilities() const { return &capabilities_; }
// Returns the extensions the module imports.
inline const ExtensionSet& GetExtensions() const { return extensions_; }

uint32_t GetExtInstImportId_GLSLstd450() const {
return extinst_importid_GLSLstd450_;
Expand All @@ -64,23 +56,34 @@ class FeatureManager {
return !(a == b);
}

// Adds the given |capability| and all implied capabilities into the current
// FeatureManager.
void AddCapability(spv::Capability capability);
private:
explicit FeatureManager(const AssemblyGrammar& grammar) : grammar_(grammar) {}

// Analyzes |module| and records enabled extensions and capabilities.
void Analyze(Module* module);

// Add the extension |ext| to the feature manager.
void AddExtension(Instruction* ext);

// Analyzes |module| and records imported external instruction sets.
void AddExtInstImportIds(Module* module);

private:
// Analyzes |module| and records enabled extensions.
void AddExtensions(Module* module);

// Removes the given |extension| from the current FeatureManager.
void RemoveExtension(Extension extension);

// Adds the given |capability| and all implied capabilities into the current
// FeatureManager.
void AddCapability(spv::Capability capability);

// Analyzes |module| and records enabled capabilities.
void AddCapabilities(Module* module);

// Removes the given |capability| from the current FeatureManager.
void RemoveCapability(spv::Capability capability);

// Analyzes |module| and records imported external instruction sets.
void AddExtInstImportIds(Module* module);

// Auxiliary object for querying SPIR-V grammar facts.
const AssemblyGrammar& grammar_;

Expand All @@ -100,6 +103,8 @@ class FeatureManager {
// Common NonSemanticShader100DebugInfo external instruction import ids,
// cached for performance.
uint32_t extinst_importid_Shader100DebugInfo_ = 0;

friend class IRContext;
};

} // namespace opt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -573,9 +573,9 @@ uint32_t GraphicsRobustAccessPass::GetGlslInsts() {
context()->module()->AddExtInstImport(std::move(import_inst));
module_status_.modified = true;
context()->AnalyzeDefUse(inst);
// Reanalyze the feature list, since we added an extended instruction
// set improt.
context()->get_feature_mgr()->Analyze(context()->module());
// Invalidates the feature manager, since we added an extended instruction
// set import.
context()->ResetFeatureManager();
}
}
return module_status_.glsl_insts_id;
Expand Down
10 changes: 1 addition & 9 deletions 3rdparty/spirv-tools/source/opt/inst_debug_printf_pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,15 +241,7 @@ Pass::Status InstDebugPrintfPass::ProcessImpl() {
}
}
if (!non_sem_set_seen) {
for (auto c_itr = context()->module()->extension_begin();
c_itr != context()->module()->extension_end(); ++c_itr) {
const std::string ext_name = c_itr->GetInOperand(0).AsString();
if (ext_name == "SPV_KHR_non_semantic_info") {
context()->KillInst(&*c_itr);
break;
}
}
context()->get_feature_mgr()->RemoveExtension(kSPV_KHR_non_semantic_info);
context()->RemoveExtension(kSPV_KHR_non_semantic_info);
}
return Status::SuccessWithChange;
}
Expand Down
Loading

0 comments on commit efb7f66

Please sign in to comment.