1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-19 14:31:59 +00:00

Fix resource leaks in VoxelGI

This commit is contained in:
Bastiaan Olij
2022-08-09 15:18:03 +10:00
parent 7355dfb502
commit f50f0844e9
3 changed files with 48 additions and 25 deletions

View File

@@ -1140,6 +1140,7 @@ void GI::SDFGI::erase() {
RD::get_singleton()->free(lightprobe_data);
RD::get_singleton()->free(lightprobe_history_scroll);
RD::get_singleton()->free(lightprobe_average_scroll);
RD::get_singleton()->free(occlusion_data);
RD::get_singleton()->free(ambient_texture);
@@ -2427,18 +2428,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID
if (last_probe_data_version != data_version) {
//need to re-create everything
if (texture.is_valid()) {
RD::get_singleton()->free(texture);
RD::get_singleton()->free(write_buffer);
mipmaps.clear();
}
for (int i = 0; i < dynamic_maps.size(); i++) {
RD::get_singleton()->free(dynamic_maps[i].texture);
RD::get_singleton()->free(dynamic_maps[i].depth);
}
dynamic_maps.clear();
free_resources();
Vector3i octree_size = gi->voxel_gi_get_octree_size(probe);
@@ -3130,6 +3120,37 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID
last_probe_version = gi->voxel_gi_get_version(probe);
}
void GI::VoxelGIInstance::free_resources() {
if (texture.is_valid()) {
RD::get_singleton()->free(texture);
RD::get_singleton()->free(write_buffer);
texture = RID();
write_buffer = RID();
mipmaps.clear();
}
for (int i = 0; i < dynamic_maps.size(); i++) {
RD::get_singleton()->free(dynamic_maps[i].texture);
RD::get_singleton()->free(dynamic_maps[i].depth);
// these only exist on the first level...
if (dynamic_maps[i].fb_depth.is_valid()) {
RD::get_singleton()->free(dynamic_maps[i].fb_depth);
}
if (dynamic_maps[i].albedo.is_valid()) {
RD::get_singleton()->free(dynamic_maps[i].albedo);
}
if (dynamic_maps[i].normal.is_valid()) {
RD::get_singleton()->free(dynamic_maps[i].normal);
}
if (dynamic_maps[i].orm.is_valid()) {
RD::get_singleton()->free(dynamic_maps[i].orm);
}
}
dynamic_maps.clear();
}
void GI::VoxelGIInstance::debug(RD::DrawListID p_draw_list, RID p_framebuffer, const Projection &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha) {
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
@@ -3936,6 +3957,12 @@ RID GI::voxel_gi_instance_create(RID p_base) {
return rid;
}
void GI::voxel_gi_instance_free(RID p_rid) {
GI::VoxelGIInstance *voxel_gi = voxel_gi_instance_owner.get_or_null(p_rid);
voxel_gi->free_resources();
voxel_gi_instance_owner.free(p_rid);
}
void GI::voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) {
VoxelGIInstance *voxel_gi = get_probe_instance(p_probe);
ERR_FAIL_COND(!voxel_gi);