Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2021-11-07 14:36:42 +0300
committerGitHub <noreply@github.com>2021-11-07 14:36:42 +0300
commitf1d4aff85ef9a1edfa595ef800f8c5a69e5a362b (patch)
tree4470dd4cb9f82b1dc6edfcb7b47db4515eeb8f0c /spirv_cross.cpp
parent2c53d306643033f312291e2623f0acf939a61458 (diff)
parent4561ecddbd8c0569506d968a28acd611cb0d45c8 (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.cpp60
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;
}