Browse Source

Merge pull request #55669 from lawnjelly/rid_fixes

Rémi Verschelde 3 years ago
parent
commit
dbe9bb85c9

+ 3 - 0
drivers/gles2/rasterizer_gles2.cpp

@@ -537,5 +537,8 @@ RasterizerGLES2::RasterizerGLES2() {
 RasterizerGLES2::~RasterizerGLES2() {
 	memdelete(scene);
 	memdelete(canvas);
+
+	// Storage needs to be deleted after canvas as canvas destructor frees RIDs
+	// stored in storage RID owners.
 	memdelete(storage);
 }

+ 25 - 0
drivers/gles2/rasterizer_scene_gles2.cpp

@@ -4077,3 +4077,28 @@ void RasterizerSceneGLES2::finalize() {
 RasterizerSceneGLES2::RasterizerSceneGLES2() {
 	_light_counter = 0;
 }
+
+RasterizerSceneGLES2::~RasterizerSceneGLES2() {
+	storage->free(default_material);
+	default_material = RID();
+	storage->free(default_material_twosided);
+	default_material_twosided = RID();
+	storage->free(default_shader);
+	default_shader = RID();
+	storage->free(default_shader_twosided);
+	default_shader_twosided = RID();
+
+	storage->free(default_worldcoord_material);
+	default_worldcoord_material = RID();
+	storage->free(default_worldcoord_material_twosided);
+	default_worldcoord_material_twosided = RID();
+	storage->free(default_worldcoord_shader);
+	default_worldcoord_shader = RID();
+	storage->free(default_worldcoord_shader_twosided);
+	default_worldcoord_shader_twosided = RID();
+
+	storage->free(default_overdraw_material);
+	default_overdraw_material = RID();
+	storage->free(default_overdraw_shader);
+	default_overdraw_shader = RID();
+}

+ 1 - 0
drivers/gles2/rasterizer_scene_gles2.h

@@ -773,6 +773,7 @@ public:
 	void initialize();
 	void finalize();
 	RasterizerSceneGLES2();
+	~RasterizerSceneGLES2();
 };
 
 #endif // RASTERIZERSCENEGLES2_H

+ 3 - 0
drivers/gles3/rasterizer_gles3.cpp

@@ -499,5 +499,8 @@ RasterizerGLES3::RasterizerGLES3() {
 RasterizerGLES3::~RasterizerGLES3() {
 	memdelete(scene);
 	memdelete(canvas);
+
+	// storage must be deleted last,
+	// because it contains RID_owners that are used by scene and canvas destructors
 	memdelete(storage);
 }

+ 22 - 12
drivers/gles3/rasterizer_scene_gles3.cpp

@@ -5282,18 +5282,28 @@ RasterizerSceneGLES3::RasterizerSceneGLES3() {
 }
 
 RasterizerSceneGLES3::~RasterizerSceneGLES3() {
-	memdelete(storage->material_owner.getptr(default_material));
-	memdelete(storage->material_owner.getptr(default_material_twosided));
-	memdelete(storage->shader_owner.getptr(default_shader));
-	memdelete(storage->shader_owner.getptr(default_shader_twosided));
-
-	memdelete(storage->material_owner.getptr(default_worldcoord_material));
-	memdelete(storage->material_owner.getptr(default_worldcoord_material_twosided));
-	memdelete(storage->shader_owner.getptr(default_worldcoord_shader));
-	memdelete(storage->shader_owner.getptr(default_worldcoord_shader_twosided));
-
-	memdelete(storage->material_owner.getptr(default_overdraw_material));
-	memdelete(storage->shader_owner.getptr(default_overdraw_shader));
+	storage->free(default_material);
+	default_material = RID();
+	storage->free(default_material_twosided);
+	default_material_twosided = RID();
+	storage->free(default_shader);
+	default_shader = RID();
+	storage->free(default_shader_twosided);
+	default_shader_twosided = RID();
+
+	storage->free(default_worldcoord_material);
+	default_worldcoord_material = RID();
+	storage->free(default_worldcoord_material_twosided);
+	default_worldcoord_material_twosided = RID();
+	storage->free(default_worldcoord_shader);
+	default_worldcoord_shader = RID();
+	storage->free(default_worldcoord_shader_twosided);
+	default_worldcoord_shader_twosided = RID();
+
+	storage->free(default_overdraw_material);
+	default_overdraw_material = RID();
+	storage->free(default_overdraw_shader);
+	default_overdraw_shader = RID();
 
 	memfree(state.spot_array_tmp);
 	memfree(state.omni_array_tmp);