diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-11-07 14:36:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-07 14:36:42 +0300 |
commit | f1d4aff85ef9a1edfa595ef800f8c5a69e5a362b (patch) | |
tree | 4470dd4cb9f82b1dc6edfcb7b47db4515eeb8f0c /spirv_cross.cpp | |
parent | 2c53d306643033f312291e2623f0acf939a61458 (diff) | |
parent | 4561ecddbd8c0569506d968a28acd611cb0d45c8 (diff) |
Merge pull request #1805 from KhronosGroup/fix-1776
Handle Modf/Frexp in more cases.
Diffstat (limited to 'spirv_cross.cpp')
-rw-r--r-- | spirv_cross.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/spirv_cross.cpp b/spirv_cross.cpp index edcf8e7c..99b69ad9 100644 --- a/spirv_cross.cpp +++ b/spirv_cross.cpp @@ -181,6 +181,30 @@ bool Compiler::block_is_pure(const SPIRBlock &block) // This is a global side effect of the function. return false; + case OpExtInst: + { + uint32_t extension_set = ops[2]; + if (get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL) + { + auto op_450 = static_cast<GLSLstd450>(ops[3]); + switch (op_450) + { + case GLSLstd450Modf: + case GLSLstd450Frexp: + { + auto &type = expression_type(ops[5]); + if (type.storage != StorageClassFunction) + return false; + break; + } + + default: + break; + } + } + break; + } + default: break; } @@ -716,6 +740,15 @@ bool Compiler::InterfaceVariableAccessHandler::handle(Op opcode, const uint32_t break; } + case GLSLstd450Modf: + case GLSLstd450Fract: + { + auto *var = compiler.maybe_get<SPIRVariable>(args[5]); + if (var && storage_class_is_interface(var->storage)) + variables.insert(args[5]); + break; + } + default: break; } @@ -3290,6 +3323,33 @@ bool Compiler::AnalyzeVariableScopeAccessHandler::handle(spv::Op op, const uint3 for (uint32_t i = 4; i < length; i++) notify_variable_access(args[i], current_block->self); notify_variable_access(args[1], current_block->self); + + uint32_t extension_set = args[2]; + if (compiler.get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL) + { + auto op_450 = static_cast<GLSLstd450>(args[3]); + switch (op_450) + { + case GLSLstd450Modf: + case GLSLstd450Frexp: + { + uint32_t ptr = args[5]; + auto *var = compiler.maybe_get_backing_variable(ptr); + if (var) + { + accessed_variables_to_block[var->self].insert(current_block->self); + if (var->self == ptr) + complete_write_variables_to_block[var->self].insert(current_block->self); + else + partial_write_variables_to_block[var->self].insert(current_block->self); + } + break; + } + + default: + break; + } + } break; } |