Merge pull request #106996 from Ivorforce/no-oa-hashmap

Core: Remove `OAHashMap`, in favour of `AHashMap`
This commit is contained in:
Rémi Verschelde
2025-06-05 13:12:34 +02:00
16 changed files with 219 additions and 878 deletions

View File

@ -570,10 +570,10 @@ bool ShaderGLES3::_load_from_cache(Version *p_version) {
int cache_variant_count = static_cast<int>(f->get_32());
ERR_FAIL_COND_V_MSG(cache_variant_count != variant_count, false, "shader cache variant count mismatch, expected " + itos(variant_count) + " got " + itos(cache_variant_count)); //should not happen but check
LocalVector<OAHashMap<uint64_t, Version::Specialization>> variants;
LocalVector<AHashMap<uint64_t, Version::Specialization>> variants;
for (int i = 0; i < cache_variant_count; i++) {
uint32_t cache_specialization_count = f->get_32();
OAHashMap<uint64_t, Version::Specialization> variant;
AHashMap<uint64_t, Version::Specialization> variant;
for (uint32_t j = 0; j < cache_specialization_count; j++) {
uint64_t specialization_key = f->get_64();
uint32_t variant_size = f->get_32();
@ -648,18 +648,14 @@ void ShaderGLES3::_save_to_cache(Version *p_version) {
f->store_32(variant_count);
for (int i = 0; i < variant_count; i++) {
int cache_specialization_count = p_version->variants[i].get_num_elements();
int cache_specialization_count = p_version->variants[i].size();
f->store_32(cache_specialization_count);
for (OAHashMap<uint64_t, ShaderGLES3::Version::Specialization>::Iterator it = p_version->variants[i].iter(); it.valid; it = p_version->variants[i].next_iter(it)) {
const uint64_t specialization_key = *it.key;
for (KeyValue<uint64_t, ShaderGLES3::Version::Specialization> &kv : p_version->variants[i]) {
const uint64_t specialization_key = kv.key;
f->store_64(specialization_key);
const Version::Specialization *specialization = it.value;
if (specialization == nullptr) {
f->store_32(0);
continue;
}
const Version::Specialization *specialization = &kv.value;
GLint program_size = 0;
glGetProgramiv(specialization->id, GL_PROGRAM_BINARY_LENGTH, &program_size);
if (program_size == 0) {
@ -689,11 +685,11 @@ void ShaderGLES3::_clear_version(Version *p_version) {
}
for (int i = 0; i < variant_count; i++) {
for (OAHashMap<uint64_t, Version::Specialization>::Iterator it = p_version->variants[i].iter(); it.valid; it = p_version->variants[i].next_iter(it)) {
if (it.value->id != 0) {
glDeleteShader(it.value->vert_id);
glDeleteShader(it.value->frag_id);
glDeleteProgram(it.value->id);
for (KeyValue<uint64_t, Version::Specialization> &kv : p_version->variants[i]) {
if (kv.value.id != 0) {
glDeleteShader(kv.value.vert_id);
glDeleteShader(kv.value.frag_id);
glDeleteProgram(kv.value.id);
}
}
}
@ -709,7 +705,7 @@ void ShaderGLES3::_initialize_version(Version *p_version) {
}
p_version->variants.reserve(variant_count);
for (int i = 0; i < variant_count; i++) {
OAHashMap<uint64_t, Version::Specialization> variant;
AHashMap<uint64_t, Version::Specialization> variant;
p_version->variants.push_back(variant);
Version::Specialization spec;
_compile_specialization(spec, i, p_version, specialization_default_mask);

View File

@ -102,7 +102,7 @@ private:
}
};
LocalVector<OAHashMap<uint64_t, Specialization>> variants;
LocalVector<AHashMap<uint64_t, Specialization>> variants;
};
Mutex variant_set_mutex;
@ -192,25 +192,25 @@ protected:
_initialize_version(version); //may lack initialization
}
Version::Specialization *spec = version->variants[p_variant].lookup_ptr(p_specialization);
Version::Specialization *spec = version->variants[p_variant].getptr(p_specialization);
if (!spec) {
if (false) {
// Queue load this specialization and use defaults in the meantime (TODO)
spec = version->variants[p_variant].lookup_ptr(specialization_default_mask);
spec = version->variants[p_variant].getptr(specialization_default_mask);
} else {
// Compile on the spot
Version::Specialization s;
_compile_specialization(s, p_variant, version, p_specialization);
version->variants[p_variant].insert(p_specialization, s);
spec = version->variants[p_variant].lookup_ptr(p_specialization);
spec = version->variants[p_variant].getptr(p_specialization);
if (shader_cache_dir_valid) {
_save_to_cache(version);
}
}
} else if (spec->build_queued) {
// Still queued, wait
spec = version->variants[p_variant].lookup_ptr(specialization_default_mask);
spec = version->variants[p_variant].getptr(specialization_default_mask);
}
if (!spec || !spec->ok) {
@ -228,7 +228,7 @@ protected:
Version *version = version_owner.get_or_null(p_version);
ERR_FAIL_NULL_V(version, -1);
ERR_FAIL_INDEX_V(p_variant, int(version->variants.size()), -1);
Version::Specialization *spec = version->variants[p_variant].lookup_ptr(p_specialization);
Version::Specialization *spec = version->variants[p_variant].getptr(p_specialization);
ERR_FAIL_NULL_V(spec, -1);
ERR_FAIL_INDEX_V(p_which, int(spec->uniform_location.size()), -1);
return spec->uniform_location[p_which];