mirror of
https://github.com/godotengine/godot.git
synced 2025-12-08 06:09:55 +00:00
Change RID_Owner::get_owned_list.
This commit is contained in:
parent
2d3bdcac35
commit
1a70a06a43
11 changed files with 74 additions and 102 deletions
|
|
@ -2670,16 +2670,15 @@ bool RendererCanvasCull::free(RID p_rid) {
|
|||
|
||||
template <typename T>
|
||||
void RendererCanvasCull::_free_rids(T &p_owner, const char *p_type) {
|
||||
List<RID> owned;
|
||||
p_owner.get_owned_list(&owned);
|
||||
LocalVector<RID> owned = p_owner.get_owned_list();
|
||||
if (owned.size()) {
|
||||
if (owned.size() == 1) {
|
||||
WARN_PRINT(vformat("1 RID of type \"%s\" was leaked.", p_type));
|
||||
} else {
|
||||
WARN_PRINT(vformat("%d RIDs of type \"%s\" were leaked.", owned.size(), p_type));
|
||||
}
|
||||
for (const RID &E : owned) {
|
||||
free(E);
|
||||
for (const RID &rid : owned) {
|
||||
free(rid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -748,10 +748,8 @@ void ShaderRD::enable_group(int p_group) {
|
|||
group_enabled.write[p_group] = true;
|
||||
|
||||
// Compile all versions again to include the new group.
|
||||
List<RID> all_versions;
|
||||
version_owner.get_owned_list(&all_versions);
|
||||
for (const RID &E : all_versions) {
|
||||
Version *version = version_owner.get_or_null(E);
|
||||
for (const RID &version_rid : version_owner.get_owned_list()) {
|
||||
Version *version = version_owner.get_or_null(version_rid);
|
||||
version->mutex->lock();
|
||||
_compile_version_start(version, p_group);
|
||||
version->mutex->unlock();
|
||||
|
|
@ -907,13 +905,11 @@ bool ShaderRD::shader_cache_save_compressed_zstd = true;
|
|||
bool ShaderRD::shader_cache_save_debug = true;
|
||||
|
||||
ShaderRD::~ShaderRD() {
|
||||
List<RID> remaining;
|
||||
version_owner.get_owned_list(&remaining);
|
||||
LocalVector<RID> remaining = version_owner.get_owned_list();
|
||||
if (remaining.size()) {
|
||||
ERR_PRINT(itos(remaining.size()) + " shaders of type " + name + " were never freed");
|
||||
while (remaining.size()) {
|
||||
version_free(remaining.front()->get());
|
||||
remaining.pop_front();
|
||||
for (const RID &version_rid : remaining) {
|
||||
version_free(version_rid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1640,10 +1640,7 @@ void TextureStorage::texture_set_detect_roughness_callback(RID p_texture, RS::Te
|
|||
}
|
||||
|
||||
void TextureStorage::texture_debug_usage(List<RS::TextureInfo> *r_info) {
|
||||
List<RID> textures;
|
||||
texture_owner.get_owned_list(&textures);
|
||||
|
||||
for (const RID &rid : textures) {
|
||||
for (const RID &rid : texture_owner.get_owned_list()) {
|
||||
Texture *t = texture_owner.get_or_null(rid);
|
||||
if (!t) {
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -6946,21 +6946,20 @@ void RenderingDevice::_save_pipeline_cache(void *p_data) {
|
|||
|
||||
template <typename T>
|
||||
void RenderingDevice::_free_rids(T &p_owner, const char *p_type) {
|
||||
List<RID> owned;
|
||||
p_owner.get_owned_list(&owned);
|
||||
LocalVector<RID> owned = p_owner.get_owned_list();
|
||||
if (owned.size()) {
|
||||
if (owned.size() == 1) {
|
||||
WARN_PRINT(vformat("1 RID of type \"%s\" was leaked.", p_type));
|
||||
} else {
|
||||
WARN_PRINT(vformat("%d RIDs of type \"%s\" were leaked.", owned.size(), p_type));
|
||||
}
|
||||
for (const RID &E : owned) {
|
||||
for (const RID &rid : owned) {
|
||||
#ifdef DEV_ENABLED
|
||||
if (resource_names.has(E)) {
|
||||
print_line(String(" - ") + resource_names[E]);
|
||||
if (resource_names.has(rid)) {
|
||||
print_line(String(" - ") + resource_names[rid]);
|
||||
}
|
||||
#endif
|
||||
free(E);
|
||||
free(rid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7157,36 +7156,35 @@ void RenderingDevice::finalize() {
|
|||
_free_rids(sampler_owner, "Sampler");
|
||||
{
|
||||
// For textures it's a bit more difficult because they may be shared.
|
||||
List<RID> owned;
|
||||
texture_owner.get_owned_list(&owned);
|
||||
LocalVector<RID> owned = texture_owner.get_owned_list();
|
||||
if (owned.size()) {
|
||||
if (owned.size() == 1) {
|
||||
WARN_PRINT("1 RID of type \"Texture\" was leaked.");
|
||||
} else {
|
||||
WARN_PRINT(vformat("%d RIDs of type \"Texture\" were leaked.", owned.size()));
|
||||
}
|
||||
LocalVector<RID> owned_non_shared;
|
||||
// Free shared first.
|
||||
for (List<RID>::Element *E = owned.front(); E;) {
|
||||
List<RID>::Element *N = E->next();
|
||||
if (texture_is_shared(E->get())) {
|
||||
for (const RID &texture_rid : owned) {
|
||||
if (texture_is_shared(texture_rid)) {
|
||||
#ifdef DEV_ENABLED
|
||||
if (resource_names.has(E->get())) {
|
||||
print_line(String(" - ") + resource_names[E->get()]);
|
||||
if (resource_names.has(texture_rid)) {
|
||||
print_line(String(" - ") + resource_names[texture_rid]);
|
||||
}
|
||||
#endif
|
||||
free(E->get());
|
||||
owned.erase(E);
|
||||
free(texture_rid);
|
||||
} else {
|
||||
owned_non_shared.push_back(texture_rid);
|
||||
}
|
||||
E = N;
|
||||
}
|
||||
// Free non shared second, this will avoid an error trying to free unexisting textures due to dependencies.
|
||||
for (const RID &E : owned) {
|
||||
for (const RID &texture_rid : owned_non_shared) {
|
||||
#ifdef DEV_ENABLED
|
||||
if (resource_names.has(E)) {
|
||||
print_line(String(" - ") + resource_names[E]);
|
||||
if (resource_names.has(texture_rid)) {
|
||||
print_line(String(" - ") + resource_names[texture_rid]);
|
||||
}
|
||||
#endif
|
||||
free(E);
|
||||
free(texture_rid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,9 +57,7 @@ void RendererCompositorStorage::compositor_effect_free(RID p_rid) {
|
|||
ERR_FAIL_NULL(effect);
|
||||
|
||||
// Remove this RID from any compositor that uses it.
|
||||
List<RID> compositor_rids;
|
||||
compositor_owner.get_owned_list(&compositor_rids);
|
||||
for (const RID &compositor_rid : compositor_rids) {
|
||||
for (const RID &compositor_rid : compositor_owner.get_owned_list()) {
|
||||
Compositor *compositor = compositor_owner.get_or_null(compositor_rid);
|
||||
if (compositor) {
|
||||
compositor->compositor_effects.erase(p_rid);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue