Merge pull request #93866 from Chaosus/shader_fix_global_func_set

Improve code for setup of `global_func_set` in `ShaderLanguage`
This commit is contained in:
Rémi Verschelde 2024-07-09 16:47:13 +02:00
commit 40cb283dd7
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 15 additions and 9 deletions

View file

@ -39,6 +39,8 @@
#define HAS_WARNING(flag) (warning_flags & flag) #define HAS_WARNING(flag) (warning_flags & flag)
int ShaderLanguage::instance_counter = 0;
String ShaderLanguage::get_operator_text(Operator p_op) { String ShaderLanguage::get_operator_text(Operator p_op) {
static const char *op_names[OP_MAX] = { "==", static const char *op_names[OP_MAX] = { "==",
"!=", "!=",
@ -10812,17 +10814,16 @@ ShaderLanguage::ShaderLanguage() {
nodes = nullptr; nodes = nullptr;
completion_class = TAG_GLOBAL; completion_class = TAG_GLOBAL;
int idx = 0; if (instance_counter == 0) {
while (builtin_func_defs[idx].name) { int idx = 0;
if (builtin_func_defs[idx].tag == SubClassTag::TAG_GLOBAL) { while (builtin_func_defs[idx].name) {
const StringName &name = StringName(builtin_func_defs[idx].name); if (builtin_func_defs[idx].tag == SubClassTag::TAG_GLOBAL) {
global_func_set.insert(builtin_func_defs[idx].name);
if (!global_func_set.has(name)) {
global_func_set.insert(name);
} }
idx++;
} }
idx++;
} }
instance_counter++;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants); warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants);
@ -10837,5 +10838,8 @@ ShaderLanguage::ShaderLanguage() {
ShaderLanguage::~ShaderLanguage() { ShaderLanguage::~ShaderLanguage() {
clear(); clear();
global_func_set.clear(); instance_counter--;
if (instance_counter == 0) {
global_func_set.clear();
}
} }

View file

@ -800,6 +800,8 @@ public:
static bool is_control_flow_keyword(String p_keyword); static bool is_control_flow_keyword(String p_keyword);
static void get_builtin_funcs(List<String> *r_keywords); static void get_builtin_funcs(List<String> *r_keywords);
static int instance_counter;
struct BuiltInInfo { struct BuiltInInfo {
DataType type = TYPE_VOID; DataType type = TYPE_VOID;
bool constant = false; bool constant = false;