Преглед изворни кода

Merge pull request #69972 from adamscott/add-server-checks-before-free

Add safety-checks before some servers `free()`
Rémi Verschelde пре 2 година
родитељ
комит
1b634c06d0
65 измењених фајлова са 125 додато и 1 уклоњено
  1. 3 0
      editor/plugins/editor_preview_plugins.cpp
  2. 2 0
      editor/plugins/node_3d_editor_gizmos.cpp
  3. 2 0
      editor/plugins/node_3d_editor_plugin.cpp
  4. 1 0
      modules/gridmap/editor/grid_map_editor_plugin.cpp
  5. 9 0
      modules/gridmap/grid_map.cpp
  6. 1 0
      modules/noise/noise_texture_2d.cpp
  7. 1 0
      scene/2d/collision_object_2d.cpp
  8. 1 0
      scene/2d/cpu_particles_2d.cpp
  9. 1 0
      scene/2d/gpu_particles_2d.cpp
  10. 1 0
      scene/2d/joint_2d.cpp
  11. 1 0
      scene/2d/light_2d.cpp
  12. 3 0
      scene/2d/light_occluder_2d.cpp
  13. 1 0
      scene/2d/navigation_agent_2d.cpp
  14. 1 0
      scene/2d/navigation_link_2d.cpp
  15. 1 0
      scene/2d/navigation_obstacle_2d.cpp
  16. 1 0
      scene/2d/navigation_region_2d.cpp
  17. 1 0
      scene/2d/polygon_2d.cpp
  18. 2 0
      scene/2d/skeleton_2d.cpp
  19. 4 0
      scene/2d/tile_map.cpp
  20. 2 0
      scene/3d/camera_3d.cpp
  21. 6 0
      scene/3d/collision_object_3d.cpp
  22. 1 0
      scene/3d/cpu_particles_3d.cpp
  23. 1 0
      scene/3d/decal.cpp
  24. 1 0
      scene/3d/fog_volume.cpp
  25. 1 0
      scene/3d/gpu_particles_3d.cpp
  26. 2 0
      scene/3d/gpu_particles_collision_3d.cpp
  27. 1 0
      scene/3d/joint_3d.cpp
  28. 1 0
      scene/3d/label_3d.cpp
  29. 1 0
      scene/3d/light_3d.cpp
  30. 1 0
      scene/3d/lightmap_gi.cpp
  31. 1 0
      scene/3d/navigation_agent_3d.cpp
  32. 2 0
      scene/3d/navigation_link_3d.cpp
  33. 1 0
      scene/3d/navigation_obstacle_3d.cpp
  34. 3 0
      scene/3d/navigation_region_3d.cpp
  35. 1 0
      scene/3d/occluder_instance_3d.cpp
  36. 1 0
      scene/3d/path_3d.cpp
  37. 1 0
      scene/3d/physics_body_3d.cpp
  38. 1 0
      scene/3d/reflection_probe.cpp
  39. 1 1
      scene/3d/skeleton_3d.cpp
  40. 1 0
      scene/3d/soft_body_3d.cpp
  41. 1 0
      scene/3d/sprite_3d.cpp
  42. 1 0
      scene/3d/visible_on_screen_notifier_3d.cpp
  43. 1 0
      scene/3d/visual_instance_3d.cpp
  44. 2 0
      scene/3d/voxel_gi.cpp
  45. 2 0
      scene/main/canvas_item.cpp
  46. 1 0
      scene/main/canvas_layer.cpp
  47. 6 0
      scene/main/viewport.cpp
  48. 1 0
      scene/resources/camera_attributes.cpp
  49. 2 0
      scene/resources/canvas_item_material.cpp
  50. 1 0
      scene/resources/environment.cpp
  51. 1 0
      scene/resources/fog_material.cpp
  52. 1 0
      scene/resources/immediate_mesh.cpp
  53. 2 0
      scene/resources/material.cpp
  54. 2 0
      scene/resources/mesh.cpp
  55. 1 0
      scene/resources/multimesh.cpp
  56. 1 0
      scene/resources/particle_process_material.cpp
  57. 1 0
      scene/resources/primitive_meshes.cpp
  58. 1 0
      scene/resources/shader.cpp
  59. 1 0
      scene/resources/sky.cpp
  60. 18 0
      scene/resources/texture.cpp
  61. 3 0
      scene/resources/world_2d.cpp
  62. 3 0
      scene/resources/world_3d.cpp
  63. 1 0
      servers/camera/camera_feed.cpp
  64. 2 0
      servers/rendering/renderer_scene_occlusion_cull.cpp
  65. 1 0
      servers/xr/xr_interface.cpp

+ 3 - 0
editor/plugins/editor_preview_plugins.cpp

@@ -436,6 +436,7 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
 }
 }
 
 
 EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() {
 EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(sphere);
 	RS::get_singleton()->free(sphere);
 	RS::get_singleton()->free(sphere_instance);
 	RS::get_singleton()->free(sphere_instance);
 	RS::get_singleton()->free(viewport);
 	RS::get_singleton()->free(viewport);
@@ -767,6 +768,7 @@ EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
 }
 }
 
 
 EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() {
 EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	//RS::get_singleton()->free(sphere);
 	//RS::get_singleton()->free(sphere);
 	RS::get_singleton()->free(mesh_instance);
 	RS::get_singleton()->free(mesh_instance);
 	RS::get_singleton()->free(viewport);
 	RS::get_singleton()->free(viewport);
@@ -867,6 +869,7 @@ EditorFontPreviewPlugin::EditorFontPreviewPlugin() {
 }
 }
 
 
 EditorFontPreviewPlugin::~EditorFontPreviewPlugin() {
 EditorFontPreviewPlugin::~EditorFontPreviewPlugin() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(canvas_item);
 	RS::get_singleton()->free(canvas_item);
 	RS::get_singleton()->free(canvas);
 	RS::get_singleton()->free(canvas);
 	RS::get_singleton()->free(viewport);
 	RS::get_singleton()->free(viewport);

+ 2 - 0
editor/plugins/node_3d_editor_gizmos.cpp

@@ -100,6 +100,7 @@ bool EditorNode3DGizmo::is_editable() const {
 }
 }
 
 
 void EditorNode3DGizmo::clear() {
 void EditorNode3DGizmo::clear() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	for (int i = 0; i < instances.size(); i++) {
 	for (int i = 0; i < instances.size(); i++) {
 		if (instances[i].instance.is_valid()) {
 		if (instances[i].instance.is_valid()) {
 			RS::get_singleton()->free(instances[i].instance);
 			RS::get_singleton()->free(instances[i].instance);
@@ -809,6 +810,7 @@ void EditorNode3DGizmo::transform() {
 }
 }
 
 
 void EditorNode3DGizmo::free() {
 void EditorNode3DGizmo::free() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	ERR_FAIL_COND(!spatial_node);
 	ERR_FAIL_COND(!spatial_node);
 	ERR_FAIL_COND(!valid);
 	ERR_FAIL_COND(!valid);
 
 

+ 2 - 0
editor/plugins/node_3d_editor_plugin.cpp

@@ -3557,6 +3557,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
 }
 }
 
 
 void Node3DEditorViewport::_finish_gizmo_instances() {
 void Node3DEditorViewport::_finish_gizmo_instances() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	for (int i = 0; i < 3; i++) {
 	for (int i = 0; i < 3; i++) {
 		RS::get_singleton()->free(move_gizmo_instance[i]);
 		RS::get_singleton()->free(move_gizmo_instance[i]);
 		RS::get_singleton()->free(move_plane_gizmo_instance[i]);
 		RS::get_singleton()->free(move_plane_gizmo_instance[i]);
@@ -5536,6 +5537,7 @@ Node3DEditorViewportContainer::Node3DEditorViewportContainer() {
 Node3DEditor *Node3DEditor::singleton = nullptr;
 Node3DEditor *Node3DEditor::singleton = nullptr;
 
 
 Node3DEditorSelectedItem::~Node3DEditorSelectedItem() {
 Node3DEditorSelectedItem::~Node3DEditorSelectedItem() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (sbox_instance.is_valid()) {
 	if (sbox_instance.is_valid()) {
 		RenderingServer::get_singleton()->free(sbox_instance);
 		RenderingServer::get_singleton()->free(sbox_instance);
 	}
 	}

+ 1 - 0
modules/gridmap/editor/grid_map_editor_plugin.cpp

@@ -1405,6 +1405,7 @@ GridMapEditor::GridMapEditor() {
 }
 }
 
 
 GridMapEditor::~GridMapEditor() {
 GridMapEditor::~GridMapEditor() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	_clear_clipboard_data();
 	_clear_clipboard_data();
 
 
 	for (int i = 0; i < 3; i++) {
 	for (int i = 0; i < 3; i++) {

+ 9 - 0
modules/gridmap/grid_map.cpp

@@ -796,6 +796,10 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
 }
 }
 
 
 void GridMap::_octant_exit_world(const OctantKey &p_key) {
 void GridMap::_octant_exit_world(const OctantKey &p_key) {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
+
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	Octant &g = *octant_map[p_key];
 	Octant &g = *octant_map[p_key];
 	PhysicsServer3D::get_singleton()->body_set_state(g.static_body, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
 	PhysicsServer3D::get_singleton()->body_set_state(g.static_body, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
@@ -834,6 +838,10 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
 }
 }
 
 
 void GridMap::_octant_clean_up(const OctantKey &p_key) {
 void GridMap::_octant_clean_up(const OctantKey &p_key) {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
+
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	Octant &g = *octant_map[p_key];
 	Octant &g = *octant_map[p_key];
 
 
@@ -1186,6 +1194,7 @@ Vector3 GridMap::_get_offset() const {
 }
 }
 
 
 void GridMap::clear_baked_meshes() {
 void GridMap::clear_baked_meshes() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	for (int i = 0; i < baked_meshes.size(); i++) {
 	for (int i = 0; i < baked_meshes.size(); i++) {
 		RS::get_singleton()->free(baked_meshes[i].instance);
 		RS::get_singleton()->free(baked_meshes[i].instance);
 	}
 	}

+ 1 - 0
modules/noise/noise_texture_2d.cpp

@@ -40,6 +40,7 @@ NoiseTexture2D::NoiseTexture2D() {
 }
 }
 
 
 NoiseTexture2D::~NoiseTexture2D() {
 NoiseTexture2D::~NoiseTexture2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}

+ 1 - 0
scene/2d/collision_object_2d.cpp

@@ -661,5 +661,6 @@ CollisionObject2D::CollisionObject2D() {
 }
 }
 
 
 CollisionObject2D::~CollisionObject2D() {
 CollisionObject2D::~CollisionObject2D() {
+	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	PhysicsServer2D::get_singleton()->free(rid);
 	PhysicsServer2D::get_singleton()->free(rid);
 }
 }

+ 1 - 0
scene/2d/cpu_particles_2d.cpp

@@ -1507,6 +1507,7 @@ CPUParticles2D::CPUParticles2D() {
 }
 }
 
 
 CPUParticles2D::~CPUParticles2D() {
 CPUParticles2D::~CPUParticles2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(multimesh);
 	RS::get_singleton()->free(multimesh);
 	RS::get_singleton()->free(mesh);
 	RS::get_singleton()->free(mesh);
 }
 }

+ 1 - 0
scene/2d/gpu_particles_2d.cpp

@@ -688,6 +688,7 @@ GPUParticles2D::GPUParticles2D() {
 }
 }
 
 
 GPUParticles2D::~GPUParticles2D() {
 GPUParticles2D::~GPUParticles2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(particles);
 	RS::get_singleton()->free(particles);
 	RS::get_singleton()->free(mesh);
 	RS::get_singleton()->free(mesh);
 }
 }

+ 1 - 0
scene/2d/joint_2d.cpp

@@ -246,6 +246,7 @@ Joint2D::Joint2D() {
 }
 }
 
 
 Joint2D::~Joint2D() {
 Joint2D::~Joint2D() {
+	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	PhysicsServer2D::get_singleton()->free(joint);
 	PhysicsServer2D::get_singleton()->free(joint);
 }
 }
 
 

+ 1 - 0
scene/2d/light_2d.cpp

@@ -321,6 +321,7 @@ Light2D::Light2D() {
 }
 }
 
 
 Light2D::~Light2D() {
 Light2D::~Light2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(canvas_light);
 	RenderingServer::get_singleton()->free(canvas_light);
 }
 }
 
 

+ 3 - 0
scene/2d/light_occluder_2d.cpp

@@ -148,6 +148,7 @@ OccluderPolygon2D::OccluderPolygon2D() {
 }
 }
 
 
 OccluderPolygon2D::~OccluderPolygon2D() {
 OccluderPolygon2D::~OccluderPolygon2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(occ_polygon);
 	RS::get_singleton()->free(occ_polygon);
 }
 }
 
 
@@ -291,5 +292,7 @@ LightOccluder2D::LightOccluder2D() {
 }
 }
 
 
 LightOccluder2D::~LightOccluder2D() {
 LightOccluder2D::~LightOccluder2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	RS::get_singleton()->free(occluder);
 	RS::get_singleton()->free(occluder);
 }
 }

+ 1 - 0
scene/2d/navigation_agent_2d.cpp

@@ -197,6 +197,7 @@ NavigationAgent2D::NavigationAgent2D() {
 }
 }
 
 
 NavigationAgent2D::~NavigationAgent2D() {
 NavigationAgent2D::~NavigationAgent2D() {
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	NavigationServer2D::get_singleton()->free(agent);
 	NavigationServer2D::get_singleton()->free(agent);
 	agent = RID(); // Pointless
 	agent = RID(); // Pointless
 }
 }

+ 1 - 0
scene/2d/navigation_link_2d.cpp

@@ -285,6 +285,7 @@ NavigationLink2D::NavigationLink2D() {
 }
 }
 
 
 NavigationLink2D::~NavigationLink2D() {
 NavigationLink2D::~NavigationLink2D() {
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	NavigationServer2D::get_singleton()->free(link);
 	NavigationServer2D::get_singleton()->free(link);
 	link = RID();
 	link = RID();
 }
 }

+ 1 - 0
scene/2d/navigation_obstacle_2d.cpp

@@ -116,6 +116,7 @@ NavigationObstacle2D::NavigationObstacle2D() {
 }
 }
 
 
 NavigationObstacle2D::~NavigationObstacle2D() {
 NavigationObstacle2D::~NavigationObstacle2D() {
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	NavigationServer2D::get_singleton()->free(agent);
 	NavigationServer2D::get_singleton()->free(agent);
 	agent = RID(); // Pointless
 	agent = RID(); // Pointless
 }
 }

+ 1 - 0
scene/2d/navigation_region_2d.cpp

@@ -343,6 +343,7 @@ NavigationRegion2D::NavigationRegion2D() {
 }
 }
 
 
 NavigationRegion2D::~NavigationRegion2D() {
 NavigationRegion2D::~NavigationRegion2D() {
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	NavigationServer2D::get_singleton()->free(region);
 	NavigationServer2D::get_singleton()->free(region);
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED

+ 1 - 0
scene/2d/polygon_2d.cpp

@@ -664,6 +664,7 @@ Polygon2D::Polygon2D() {
 
 
 Polygon2D::~Polygon2D() {
 Polygon2D::~Polygon2D() {
 	// This will free the internally-allocated mesh instance, if allocated.
 	// This will free the internally-allocated mesh instance, if allocated.
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->canvas_item_attach_skeleton(get_canvas_item(), RID());
 	RS::get_singleton()->canvas_item_attach_skeleton(get_canvas_item(), RID());
 	RS::get_singleton()->free(mesh);
 	RS::get_singleton()->free(mesh);
 }
 }

+ 2 - 0
scene/2d/skeleton_2d.cpp

@@ -529,6 +529,7 @@ Bone2D::Bone2D() {
 Bone2D::~Bone2D() {
 Bone2D::~Bone2D() {
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	if (!editor_gizmo_rid.is_null()) {
 	if (!editor_gizmo_rid.is_null()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RenderingServer::get_singleton()->free(editor_gizmo_rid);
 		RenderingServer::get_singleton()->free(editor_gizmo_rid);
 	}
 	}
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
@@ -803,5 +804,6 @@ Skeleton2D::Skeleton2D() {
 }
 }
 
 
 Skeleton2D::~Skeleton2D() {
 Skeleton2D::~Skeleton2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(skeleton);
 	RS::get_singleton()->free(skeleton);
 }
 }

+ 4 - 0
scene/2d/tile_map.cpp

@@ -1108,6 +1108,7 @@ void TileMap::_rendering_update_layer(int p_layer) {
 void TileMap::_rendering_cleanup_layer(int p_layer) {
 void TileMap::_rendering_cleanup_layer(int p_layer) {
 	ERR_FAIL_INDEX(p_layer, (int)layers.size());
 	ERR_FAIL_INDEX(p_layer, (int)layers.size());
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer *rs = RenderingServer::get_singleton();
 	RenderingServer *rs = RenderingServer::get_singleton();
 	if (layers[p_layer].canvas_item.is_valid()) {
 	if (layers[p_layer].canvas_item.is_valid()) {
 		rs->free(layers[p_layer].canvas_item);
 		rs->free(layers[p_layer].canvas_item);
@@ -1280,6 +1281,7 @@ void TileMap::_rendering_create_quadrant(TileMapQuadrant *p_quadrant) {
 }
 }
 
 
 void TileMap::_rendering_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 void TileMap::_rendering_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	// Free the canvas items.
 	// Free the canvas items.
 	for (const RID &ci : p_quadrant->canvas_items) {
 	for (const RID &ci : p_quadrant->canvas_items) {
 		RenderingServer::get_singleton()->free(ci);
 		RenderingServer::get_singleton()->free(ci);
@@ -1596,6 +1598,7 @@ void TileMap::_physics_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r
 
 
 void TileMap::_physics_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 void TileMap::_physics_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 	// Remove a quadrant.
 	// Remove a quadrant.
+	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	for (RID body : p_quadrant->bodies) {
 	for (RID body : p_quadrant->bodies) {
 		bodies_coords.erase(body);
 		bodies_coords.erase(body);
 		PhysicsServer2D::get_singleton()->free(body);
 		PhysicsServer2D::get_singleton()->free(body);
@@ -1754,6 +1757,7 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List
 
 
 void TileMap::_navigation_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 void TileMap::_navigation_cleanup_quadrant(TileMapQuadrant *p_quadrant) {
 	// Clear navigation shapes in the quadrant.
 	// Clear navigation shapes in the quadrant.
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	for (const KeyValue<Vector2i, Vector<RID>> &E : p_quadrant->navigation_regions) {
 	for (const KeyValue<Vector2i, Vector<RID>> &E : p_quadrant->navigation_regions) {
 		for (int i = 0; i < E.value.size(); i++) {
 		for (int i = 0; i < E.value.size(); i++) {
 			RID region = E.value[i];
 			RID region = E.value[i];

+ 2 - 0
scene/3d/camera_3d.cpp

@@ -744,8 +744,10 @@ Camera3D::Camera3D() {
 }
 }
 
 
 Camera3D::~Camera3D() {
 Camera3D::~Camera3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(camera);
 	RenderingServer::get_singleton()->free(camera);
 	if (pyramid_shape.is_valid()) {
 	if (pyramid_shape.is_valid()) {
+		ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 		PhysicsServer3D::get_singleton()->free(pyramid_shape);
 		PhysicsServer3D::get_singleton()->free(pyramid_shape);
 	}
 	}
 }
 }

+ 6 - 0
scene/3d/collision_object_3d.cpp

@@ -352,6 +352,8 @@ void CollisionObject3D::_shape_changed(const Ref<Shape3D> &p_shape) {
 }
 }
 
 
 void CollisionObject3D::_update_debug_shapes() {
 void CollisionObject3D::_update_debug_shapes() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	if (!is_inside_tree()) {
 	if (!is_inside_tree()) {
 		debug_shapes_to_update.clear();
 		debug_shapes_to_update.clear();
 		return;
 		return;
@@ -393,6 +395,8 @@ void CollisionObject3D::_update_debug_shapes() {
 }
 }
 
 
 void CollisionObject3D::_clear_debug_shapes() {
 void CollisionObject3D::_clear_debug_shapes() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	for (KeyValue<uint32_t, ShapeData> &E : shapes) {
 	for (KeyValue<uint32_t, ShapeData> &E : shapes) {
 		ShapeData &shapedata = E.value;
 		ShapeData &shapedata = E.value;
 		ShapeData::ShapeBase *shape_bases = shapedata.shapes.ptrw();
 		ShapeData::ShapeBase *shape_bases = shapedata.shapes.ptrw();
@@ -627,6 +631,7 @@ int CollisionObject3D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape
 }
 }
 
 
 void CollisionObject3D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) {
 void CollisionObject3D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	ERR_FAIL_COND(!shapes.has(p_owner));
 	ERR_FAIL_COND(!shapes.has(p_owner));
 	ERR_FAIL_INDEX(p_shape, shapes[p_owner].shapes.size());
 	ERR_FAIL_INDEX(p_shape, shapes[p_owner].shapes.size());
 
 
@@ -722,5 +727,6 @@ CollisionObject3D::CollisionObject3D() {
 }
 }
 
 
 CollisionObject3D::~CollisionObject3D() {
 CollisionObject3D::~CollisionObject3D() {
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	PhysicsServer3D::get_singleton()->free(rid);
 	PhysicsServer3D::get_singleton()->free(rid);
 }
 }

+ 1 - 0
scene/3d/cpu_particles_3d.cpp

@@ -1701,5 +1701,6 @@ CPUParticles3D::CPUParticles3D() {
 }
 }
 
 
 CPUParticles3D::~CPUParticles3D() {
 CPUParticles3D::~CPUParticles3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(multimesh);
 	RS::get_singleton()->free(multimesh);
 }
 }

+ 1 - 0
scene/3d/decal.cpp

@@ -254,5 +254,6 @@ Decal::Decal() {
 }
 }
 
 
 Decal::~Decal() {
 Decal::~Decal() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(decal);
 	RS::get_singleton()->free(decal);
 }
 }

+ 1 - 0
scene/3d/fog_volume.cpp

@@ -118,5 +118,6 @@ FogVolume::FogVolume() {
 }
 }
 
 
 FogVolume::~FogVolume() {
 FogVolume::~FogVolume() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(volume);
 	RS::get_singleton()->free(volume);
 }
 }

+ 1 - 0
scene/3d/gpu_particles_3d.cpp

@@ -634,5 +634,6 @@ GPUParticles3D::GPUParticles3D() {
 }
 }
 
 
 GPUParticles3D::~GPUParticles3D() {
 GPUParticles3D::~GPUParticles3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(particles);
 	RS::get_singleton()->free(particles);
 }
 }

+ 2 - 0
scene/3d/gpu_particles_collision_3d.cpp

@@ -58,6 +58,7 @@ GPUParticlesCollision3D::GPUParticlesCollision3D(RS::ParticlesCollisionType p_ty
 }
 }
 
 
 GPUParticlesCollision3D::~GPUParticlesCollision3D() {
 GPUParticlesCollision3D::~GPUParticlesCollision3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(collision);
 	RS::get_singleton()->free(collision);
 }
 }
 
 
@@ -819,6 +820,7 @@ GPUParticlesAttractor3D::GPUParticlesAttractor3D(RS::ParticlesCollisionType p_ty
 	set_base(collision);
 	set_base(collision);
 }
 }
 GPUParticlesAttractor3D::~GPUParticlesAttractor3D() {
 GPUParticlesAttractor3D::~GPUParticlesAttractor3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(collision);
 	RS::get_singleton()->free(collision);
 }
 }
 
 

+ 1 - 0
scene/3d/joint_3d.cpp

@@ -234,6 +234,7 @@ Joint3D::Joint3D() {
 }
 }
 
 
 Joint3D::~Joint3D() {
 Joint3D::~Joint3D() {
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	PhysicsServer3D::get_singleton()->free(joint);
 	PhysicsServer3D::get_singleton()->free(joint);
 }
 }
 
 

+ 1 - 0
scene/3d/label_3d.cpp

@@ -966,6 +966,7 @@ Label3D::~Label3D() {
 
 
 	TS->free_rid(text_rid);
 	TS->free_rid(text_rid);
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(mesh);
 	RenderingServer::get_singleton()->free(mesh);
 	for (KeyValue<SurfaceKey, SurfaceData> E : surfaces) {
 	for (KeyValue<SurfaceKey, SurfaceData> E : surfaces) {
 		RenderingServer::get_singleton()->free(E.value.material);
 		RenderingServer::get_singleton()->free(E.value.material);

+ 1 - 0
scene/3d/light_3d.cpp

@@ -476,6 +476,7 @@ Light3D::Light3D() {
 }
 }
 
 
 Light3D::~Light3D() {
 Light3D::~Light3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->instance_set_base(get_instance(), RID());
 	RS::get_singleton()->instance_set_base(get_instance(), RID());
 
 
 	if (light.is_valid()) {
 	if (light.is_valid()) {

+ 1 - 0
scene/3d/lightmap_gi.cpp

@@ -313,6 +313,7 @@ LightmapGIData::LightmapGIData() {
 }
 }
 
 
 LightmapGIData::~LightmapGIData() {
 LightmapGIData::~LightmapGIData() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(lightmap);
 	RS::get_singleton()->free(lightmap);
 }
 }
 
 

+ 1 - 0
scene/3d/navigation_agent_3d.cpp

@@ -204,6 +204,7 @@ NavigationAgent3D::NavigationAgent3D() {
 }
 }
 
 
 NavigationAgent3D::~NavigationAgent3D() {
 NavigationAgent3D::~NavigationAgent3D() {
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	NavigationServer3D::get_singleton()->free(agent);
 	NavigationServer3D::get_singleton()->free(agent);
 	agent = RID(); // Pointless
 	agent = RID(); // Pointless
 }
 }

+ 2 - 0
scene/3d/navigation_link_3d.cpp

@@ -227,10 +227,12 @@ NavigationLink3D::NavigationLink3D() {
 }
 }
 
 
 NavigationLink3D::~NavigationLink3D() {
 NavigationLink3D::~NavigationLink3D() {
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	NavigationServer3D::get_singleton()->free(link);
 	NavigationServer3D::get_singleton()->free(link);
 	link = RID();
 	link = RID();
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (debug_instance.is_valid()) {
 	if (debug_instance.is_valid()) {
 		RenderingServer::get_singleton()->free(debug_instance);
 		RenderingServer::get_singleton()->free(debug_instance);
 	}
 	}

+ 1 - 0
scene/3d/navigation_obstacle_3d.cpp

@@ -122,6 +122,7 @@ NavigationObstacle3D::NavigationObstacle3D() {
 }
 }
 
 
 NavigationObstacle3D::~NavigationObstacle3D() {
 NavigationObstacle3D::~NavigationObstacle3D() {
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	NavigationServer3D::get_singleton()->free(agent);
 	NavigationServer3D::get_singleton()->free(agent);
 	agent = RID(); // Pointless
 	agent = RID(); // Pointless
 }
 }

+ 3 - 0
scene/3d/navigation_region_3d.cpp

@@ -375,12 +375,15 @@ NavigationRegion3D::~NavigationRegion3D() {
 	if (navigation_mesh.is_valid()) {
 	if (navigation_mesh.is_valid()) {
 		navigation_mesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed));
 		navigation_mesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed));
 	}
 	}
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	NavigationServer3D::get_singleton()->free(region);
 	NavigationServer3D::get_singleton()->free(region);
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	NavigationServer3D::get_singleton_mut()->disconnect("map_changed", callable_mp(this, &NavigationRegion3D::_navigation_map_changed));
 	NavigationServer3D::get_singleton_mut()->disconnect("map_changed", callable_mp(this, &NavigationRegion3D::_navigation_map_changed));
 	NavigationServer3D::get_singleton_mut()->disconnect("navigation_debug_changed", callable_mp(this, &NavigationRegion3D::_update_debug_mesh));
 	NavigationServer3D::get_singleton_mut()->disconnect("navigation_debug_changed", callable_mp(this, &NavigationRegion3D::_update_debug_mesh));
 	NavigationServer3D::get_singleton_mut()->disconnect("navigation_debug_changed", callable_mp(this, &NavigationRegion3D::_update_debug_edge_connections_mesh));
 	NavigationServer3D::get_singleton_mut()->disconnect("navigation_debug_changed", callable_mp(this, &NavigationRegion3D::_update_debug_edge_connections_mesh));
+
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (debug_instance.is_valid()) {
 	if (debug_instance.is_valid()) {
 		RenderingServer::get_singleton()->free(debug_instance);
 		RenderingServer::get_singleton()->free(debug_instance);
 	}
 	}

+ 1 - 0
scene/3d/occluder_instance_3d.cpp

@@ -139,6 +139,7 @@ Occluder3D::Occluder3D() {
 
 
 Occluder3D::~Occluder3D() {
 Occluder3D::~Occluder3D() {
 	if (occluder.is_valid()) {
 	if (occluder.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(occluder);
 		RS::get_singleton()->free(occluder);
 	}
 	}
 }
 }

+ 1 - 0
scene/3d/path_3d.cpp

@@ -40,6 +40,7 @@ Path3D::Path3D() {
 }
 }
 
 
 Path3D::~Path3D() {
 Path3D::~Path3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (debug_instance.is_valid()) {
 	if (debug_instance.is_valid()) {
 		RS::get_singleton()->free(debug_instance);
 		RS::get_singleton()->free(debug_instance);
 	}
 	}

+ 1 - 0
scene/3d/physics_body_3d.cpp

@@ -3358,6 +3358,7 @@ PhysicalBone3D::~PhysicalBone3D() {
 	if (joint_data) {
 	if (joint_data) {
 		memdelete(joint_data);
 		memdelete(joint_data);
 	}
 	}
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	PhysicsServer3D::get_singleton()->free(joint);
 	PhysicsServer3D::get_singleton()->free(joint);
 }
 }
 
 

+ 1 - 0
scene/3d/reflection_probe.cpp

@@ -257,5 +257,6 @@ ReflectionProbe::ReflectionProbe() {
 }
 }
 
 
 ReflectionProbe::~ReflectionProbe() {
 ReflectionProbe::~ReflectionProbe() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(probe);
 	RS::get_singleton()->free(probe);
 }
 }

+ 1 - 1
scene/3d/skeleton_3d.cpp

@@ -58,10 +58,10 @@ Ref<Skin> SkinReference::get_skin() const {
 }
 }
 
 
 SkinReference::~SkinReference() {
 SkinReference::~SkinReference() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (skeleton_node) {
 	if (skeleton_node) {
 		skeleton_node->skin_bindings.erase(this);
 		skeleton_node->skin_bindings.erase(this);
 	}
 	}
-
 	RS::get_singleton()->free(skeleton);
 	RS::get_singleton()->free(skeleton);
 }
 }
 
 

+ 1 - 0
scene/3d/soft_body_3d.cpp

@@ -704,6 +704,7 @@ SoftBody3D::SoftBody3D() :
 
 
 SoftBody3D::~SoftBody3D() {
 SoftBody3D::~SoftBody3D() {
 	memdelete(rendering_server_handler);
 	memdelete(rendering_server_handler);
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	PhysicsServer3D::get_singleton()->free(physics_rid);
 	PhysicsServer3D::get_singleton()->free(physics_rid);
 }
 }
 
 

+ 1 - 0
scene/3d/sprite_3d.cpp

@@ -611,6 +611,7 @@ SpriteBase3D::SpriteBase3D() {
 }
 }
 
 
 SpriteBase3D::~SpriteBase3D() {
 SpriteBase3D::~SpriteBase3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(mesh);
 	RenderingServer::get_singleton()->free(mesh);
 	RenderingServer::get_singleton()->free(material);
 	RenderingServer::get_singleton()->free(material);
 }
 }

+ 1 - 0
scene/3d/visible_on_screen_notifier_3d.cpp

@@ -99,6 +99,7 @@ VisibleOnScreenNotifier3D::VisibleOnScreenNotifier3D() {
 VisibleOnScreenNotifier3D::~VisibleOnScreenNotifier3D() {
 VisibleOnScreenNotifier3D::~VisibleOnScreenNotifier3D() {
 	RID base_old = get_base();
 	RID base_old = get_base();
 	set_base(RID());
 	set_base(RID());
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(base_old);
 	RS::get_singleton()->free(base_old);
 }
 }
 
 

+ 1 - 0
scene/3d/visual_instance_3d.cpp

@@ -157,6 +157,7 @@ VisualInstance3D::VisualInstance3D() {
 }
 }
 
 
 VisualInstance3D::~VisualInstance3D() {
 VisualInstance3D::~VisualInstance3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(instance);
 	RenderingServer::get_singleton()->free(instance);
 }
 }
 
 

+ 2 - 0
scene/3d/voxel_gi.cpp

@@ -242,6 +242,7 @@ VoxelGIData::VoxelGIData() {
 }
 }
 
 
 VoxelGIData::~VoxelGIData() {
 VoxelGIData::~VoxelGIData() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(probe);
 	RS::get_singleton()->free(probe);
 }
 }
 
 
@@ -516,5 +517,6 @@ VoxelGI::VoxelGI() {
 }
 }
 
 
 VoxelGI::~VoxelGI() {
 VoxelGI::~VoxelGI() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(voxel_gi);
 	RS::get_singleton()->free(voxel_gi);
 }
 }

+ 2 - 0
scene/main/canvas_item.cpp

@@ -1305,6 +1305,7 @@ CanvasItem::CanvasItem() :
 }
 }
 
 
 CanvasItem::~CanvasItem() {
 CanvasItem::~CanvasItem() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(canvas_item);
 	RenderingServer::get_singleton()->free(canvas_item);
 }
 }
 
 
@@ -1459,5 +1460,6 @@ CanvasTexture::CanvasTexture() {
 	canvas_texture = RS::get_singleton()->canvas_texture_create();
 	canvas_texture = RS::get_singleton()->canvas_texture_create();
 }
 }
 CanvasTexture::~CanvasTexture() {
 CanvasTexture::~CanvasTexture() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(canvas_texture);
 	RS::get_singleton()->free(canvas_texture);
 }
 }

+ 1 - 0
scene/main/canvas_layer.cpp

@@ -360,5 +360,6 @@ CanvasLayer::CanvasLayer() {
 }
 }
 
 
 CanvasLayer::~CanvasLayer() {
 CanvasLayer::~CanvasLayer() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(canvas);
 	RS::get_singleton()->free(canvas);
 }
 }

+ 6 - 0
scene/main/viewport.cpp

@@ -80,6 +80,7 @@ void ViewportTexture::setup_local_to_scene() {
 
 
 	vp->viewport_textures.insert(this);
 	vp->viewport_textures.insert(this);
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (proxy_ph.is_valid()) {
 	if (proxy_ph.is_valid()) {
 		RS::get_singleton()->texture_proxy_update(proxy, vp->texture_rid);
 		RS::get_singleton()->texture_proxy_update(proxy, vp->texture_rid);
 		RS::get_singleton()->free(proxy_ph);
 		RS::get_singleton()->free(proxy_ph);
@@ -153,6 +154,8 @@ ViewportTexture::~ViewportTexture() {
 		vp->viewport_textures.erase(this);
 		vp->viewport_textures.erase(this);
 	}
 	}
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	if (proxy_ph.is_valid()) {
 	if (proxy_ph.is_valid()) {
 		RS::get_singleton()->free(proxy_ph);
 		RS::get_singleton()->free(proxy_ph);
 	}
 	}
@@ -301,6 +304,8 @@ void Viewport::_sub_window_remove(Window *p_window) {
 	int index = _sub_window_find(p_window);
 	int index = _sub_window_find(p_window);
 	ERR_FAIL_COND(index == -1);
 	ERR_FAIL_COND(index == -1);
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	RS::get_singleton()->free(gui.sub_windows[index].canvas_item);
 	RS::get_singleton()->free(gui.sub_windows[index].canvas_item);
 	gui.sub_windows.remove_at(index);
 	gui.sub_windows.remove_at(index);
 
 
@@ -4117,6 +4122,7 @@ Viewport::~Viewport() {
 	for (ViewportTexture *E : viewport_textures) {
 	for (ViewportTexture *E : viewport_textures) {
 		E->vp = nullptr;
 		E->vp = nullptr;
 	}
 	}
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(viewport);
 	RenderingServer::get_singleton()->free(viewport);
 }
 }
 
 

+ 1 - 0
scene/resources/camera_attributes.cpp

@@ -135,6 +135,7 @@ CameraAttributes::CameraAttributes() {
 }
 }
 
 
 CameraAttributes::~CameraAttributes() {
 CameraAttributes::~CameraAttributes() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(camera_attributes);
 	RS::get_singleton()->free(camera_attributes);
 }
 }
 
 

+ 2 - 0
scene/resources/canvas_item_material.cpp

@@ -294,6 +294,8 @@ CanvasItemMaterial::CanvasItemMaterial() :
 CanvasItemMaterial::~CanvasItemMaterial() {
 CanvasItemMaterial::~CanvasItemMaterial() {
 	MutexLock lock(material_mutex);
 	MutexLock lock(material_mutex);
 
 
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+
 	if (shader_map.has(current_key)) {
 	if (shader_map.has(current_key)) {
 		shader_map[current_key].users--;
 		shader_map[current_key].users--;
 		if (shader_map[current_key].users == 0) {
 		if (shader_map[current_key].users == 0) {

+ 1 - 0
scene/resources/environment.cpp

@@ -1550,5 +1550,6 @@ Environment::Environment() {
 }
 }
 
 
 Environment::~Environment() {
 Environment::~Environment() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(environment);
 	RS::get_singleton()->free(environment);
 }
 }

+ 1 - 0
scene/resources/fog_material.cpp

@@ -132,6 +132,7 @@ void FogMaterial::_bind_methods() {
 
 
 void FogMaterial::cleanup_shader() {
 void FogMaterial::cleanup_shader() {
 	if (shader.is_valid()) {
 	if (shader.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(shader);
 		RS::get_singleton()->free(shader);
 	}
 	}
 }
 }

+ 1 - 0
scene/resources/immediate_mesh.cpp

@@ -410,5 +410,6 @@ ImmediateMesh::ImmediateMesh() {
 	mesh = RS::get_singleton()->mesh_create();
 	mesh = RS::get_singleton()->mesh_create();
 }
 }
 ImmediateMesh::~ImmediateMesh() {
 ImmediateMesh::~ImmediateMesh() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(mesh);
 	RS::get_singleton()->free(mesh);
 }
 }

+ 2 - 0
scene/resources/material.cpp

@@ -141,6 +141,7 @@ Material::Material() {
 }
 }
 
 
 Material::~Material() {
 Material::~Material() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(material);
 	RenderingServer::get_singleton()->free(material);
 }
 }
 
 
@@ -3005,6 +3006,7 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) :
 }
 }
 
 
 BaseMaterial3D::~BaseMaterial3D() {
 BaseMaterial3D::~BaseMaterial3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	MutexLock lock(material_mutex);
 	MutexLock lock(material_mutex);
 
 
 	if (shader_map.has(current_key)) {
 	if (shader_map.has(current_key)) {

+ 2 - 0
scene/resources/mesh.cpp

@@ -2117,6 +2117,7 @@ ArrayMesh::ArrayMesh() {
 
 
 ArrayMesh::~ArrayMesh() {
 ArrayMesh::~ArrayMesh() {
 	if (mesh.is_valid()) {
 	if (mesh.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RenderingServer::get_singleton()->free(mesh);
 		RenderingServer::get_singleton()->free(mesh);
 	}
 	}
 }
 }
@@ -2132,5 +2133,6 @@ PlaceholderMesh::PlaceholderMesh() {
 }
 }
 
 
 PlaceholderMesh::~PlaceholderMesh() {
 PlaceholderMesh::~PlaceholderMesh() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(rid);
 	RS::get_singleton()->free(rid);
 }
 }

+ 1 - 0
scene/resources/multimesh.cpp

@@ -365,5 +365,6 @@ MultiMesh::MultiMesh() {
 }
 }
 
 
 MultiMesh::~MultiMesh() {
 MultiMesh::~MultiMesh() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(multimesh);
 	RenderingServer::get_singleton()->free(multimesh);
 }
 }

+ 1 - 0
scene/resources/particle_process_material.cpp

@@ -1894,6 +1894,7 @@ ParticleProcessMaterial::ParticleProcessMaterial() :
 }
 }
 
 
 ParticleProcessMaterial::~ParticleProcessMaterial() {
 ParticleProcessMaterial::~ParticleProcessMaterial() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	MutexLock lock(material_mutex);
 	MutexLock lock(material_mutex);
 
 
 	if (shader_map.has(current_key)) {
 	if (shader_map.has(current_key)) {

+ 1 - 0
scene/resources/primitive_meshes.cpp

@@ -340,6 +340,7 @@ PrimitiveMesh::PrimitiveMesh() {
 }
 }
 
 
 PrimitiveMesh::~PrimitiveMesh() {
 PrimitiveMesh::~PrimitiveMesh() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(mesh);
 	RenderingServer::get_singleton()->free(mesh);
 }
 }
 
 

+ 1 - 0
scene/resources/shader.cpp

@@ -208,6 +208,7 @@ Shader::Shader() {
 }
 }
 
 
 Shader::~Shader() {
 Shader::~Shader() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(shader);
 	RenderingServer::get_singleton()->free(shader);
 }
 }
 
 

+ 1 - 0
scene/resources/sky.cpp

@@ -106,5 +106,6 @@ Sky::Sky() {
 }
 }
 
 
 Sky::~Sky() {
 Sky::~Sky() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(sky);
 	RS::get_singleton()->free(sky);
 }
 }

+ 18 - 0
scene/resources/texture.cpp

@@ -324,6 +324,7 @@ ImageTexture::ImageTexture() {}
 
 
 ImageTexture::~ImageTexture() {
 ImageTexture::~ImageTexture() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RenderingServer::get_singleton()->free(texture);
 		RenderingServer::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -630,6 +631,7 @@ PortableCompressedTexture2D::PortableCompressedTexture2D() {}
 
 
 PortableCompressedTexture2D::~PortableCompressedTexture2D() {
 PortableCompressedTexture2D::~PortableCompressedTexture2D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RenderingServer::get_singleton()->free(texture);
 		RenderingServer::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -1041,6 +1043,7 @@ CompressedTexture2D::CompressedTexture2D() {}
 
 
 CompressedTexture2D::~CompressedTexture2D() {
 CompressedTexture2D::~CompressedTexture2D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -1225,6 +1228,7 @@ ImageTexture3D::ImageTexture3D() {
 
 
 ImageTexture3D::~ImageTexture3D() {
 ImageTexture3D::~ImageTexture3D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -1386,6 +1390,7 @@ CompressedTexture3D::CompressedTexture3D() {}
 
 
 CompressedTexture3D::~CompressedTexture3D() {
 CompressedTexture3D::~CompressedTexture3D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -1911,6 +1916,7 @@ CurveTexture::CurveTexture() {}
 
 
 CurveTexture::~CurveTexture() {
 CurveTexture::~CurveTexture() {
 	if (_texture.is_valid()) {
 	if (_texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(_texture);
 		RS::get_singleton()->free(_texture);
 	}
 	}
 }
 }
@@ -2109,6 +2115,7 @@ CurveXYZTexture::CurveXYZTexture() {}
 
 
 CurveXYZTexture::~CurveXYZTexture() {
 CurveXYZTexture::~CurveXYZTexture() {
 	if (_texture.is_valid()) {
 	if (_texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(_texture);
 		RS::get_singleton()->free(_texture);
 	}
 	}
 }
 }
@@ -2121,6 +2128,7 @@ GradientTexture1D::GradientTexture1D() {
 
 
 GradientTexture1D::~GradientTexture1D() {
 GradientTexture1D::~GradientTexture1D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -2263,6 +2271,7 @@ GradientTexture2D::GradientTexture2D() {
 
 
 GradientTexture2D::~GradientTexture2D() {
 GradientTexture2D::~GradientTexture2D() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -2521,6 +2530,7 @@ void ProxyTexture::set_base(const Ref<Texture2D> &p_texture) {
 
 
 	base = p_texture;
 	base = p_texture;
 	if (base.is_valid()) {
 	if (base.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		if (proxy_ph.is_valid()) {
 		if (proxy_ph.is_valid()) {
 			RS::get_singleton()->texture_proxy_update(proxy, base->get_rid());
 			RS::get_singleton()->texture_proxy_update(proxy, base->get_rid());
 			RS::get_singleton()->free(proxy_ph);
 			RS::get_singleton()->free(proxy_ph);
@@ -2571,6 +2581,7 @@ ProxyTexture::ProxyTexture() {
 }
 }
 
 
 ProxyTexture::~ProxyTexture() {
 ProxyTexture::~ProxyTexture() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	if (proxy_ph.is_valid()) {
 	if (proxy_ph.is_valid()) {
 		RS::get_singleton()->free(proxy_ph);
 		RS::get_singleton()->free(proxy_ph);
 	}
 	}
@@ -2828,6 +2839,7 @@ AnimatedTexture::AnimatedTexture() {
 }
 }
 
 
 AnimatedTexture::~AnimatedTexture() {
 AnimatedTexture::~AnimatedTexture() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(proxy);
 	RS::get_singleton()->free(proxy);
 	RS::get_singleton()->free(proxy_ph);
 	RS::get_singleton()->free(proxy_ph);
 }
 }
@@ -3031,6 +3043,7 @@ ImageTextureLayered::ImageTextureLayered(LayeredType p_layered_type) {
 
 
 ImageTextureLayered::~ImageTextureLayered() {
 ImageTextureLayered::~ImageTextureLayered() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -3198,6 +3211,7 @@ CompressedTextureLayered::CompressedTextureLayered(LayeredType p_type) {
 
 
 CompressedTextureLayered::~CompressedTextureLayered() {
 CompressedTextureLayered::~CompressedTextureLayered() {
 	if (texture.is_valid()) {
 	if (texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(texture);
 		RS::get_singleton()->free(texture);
 	}
 	}
 }
 }
@@ -3353,6 +3367,7 @@ CameraTexture::CameraTexture() {}
 
 
 CameraTexture::~CameraTexture() {
 CameraTexture::~CameraTexture() {
 	if (_texture.is_valid()) {
 	if (_texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RenderingServer::get_singleton()->free(_texture);
 		RenderingServer::get_singleton()->free(_texture);
 	}
 	}
 }
 }
@@ -3394,6 +3409,7 @@ PlaceholderTexture2D::PlaceholderTexture2D() {
 }
 }
 
 
 PlaceholderTexture2D::~PlaceholderTexture2D() {
 PlaceholderTexture2D::~PlaceholderTexture2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(rid);
 	RS::get_singleton()->free(rid);
 }
 }
 
 
@@ -3441,6 +3457,7 @@ PlaceholderTexture3D::PlaceholderTexture3D() {
 	rid = RS::get_singleton()->texture_3d_placeholder_create();
 	rid = RS::get_singleton()->texture_3d_placeholder_create();
 }
 }
 PlaceholderTexture3D::~PlaceholderTexture3D() {
 PlaceholderTexture3D::~PlaceholderTexture3D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(rid);
 	RS::get_singleton()->free(rid);
 }
 }
 
 
@@ -3499,5 +3516,6 @@ PlaceholderTextureLayered::PlaceholderTextureLayered(LayeredType p_type) {
 	rid = RS::get_singleton()->texture_2d_layered_placeholder_create(RS::TextureLayeredType(layered_type));
 	rid = RS::get_singleton()->texture_2d_layered_placeholder_create(RS::TextureLayeredType(layered_type));
 }
 }
 PlaceholderTextureLayered::~PlaceholderTextureLayered() {
 PlaceholderTextureLayered::~PlaceholderTextureLayered() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(rid);
 	RS::get_singleton()->free(rid);
 }
 }

+ 3 - 0
scene/resources/world_2d.cpp

@@ -89,6 +89,9 @@ World2D::World2D() {
 }
 }
 
 
 World2D::~World2D() {
 World2D::~World2D() {
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
+	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	RenderingServer::get_singleton()->free(canvas);
 	RenderingServer::get_singleton()->free(canvas);
 	PhysicsServer2D::get_singleton()->free(space);
 	PhysicsServer2D::get_singleton()->free(space);
 	NavigationServer2D::get_singleton()->free(navigation_map);
 	NavigationServer2D::get_singleton()->free(navigation_map);

+ 3 - 0
scene/resources/world_3d.cpp

@@ -157,6 +157,9 @@ World3D::World3D() {
 }
 }
 
 
 World3D::~World3D() {
 World3D::~World3D() {
+	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
+	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	PhysicsServer3D::get_singleton()->free(space);
 	PhysicsServer3D::get_singleton()->free(space);
 	RenderingServer::get_singleton()->free(scenario);
 	RenderingServer::get_singleton()->free(scenario);
 	NavigationServer3D::get_singleton()->free(navigation_map);
 	NavigationServer3D::get_singleton()->free(navigation_map);

+ 1 - 0
servers/camera/camera_feed.cpp

@@ -165,6 +165,7 @@ CameraFeed::CameraFeed(String p_name, FeedPosition p_position) {
 
 
 CameraFeed::~CameraFeed() {
 CameraFeed::~CameraFeed() {
 	// Free our textures
 	// Free our textures
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RenderingServer::get_singleton()->free(texture[CameraServer::FEED_Y_IMAGE]);
 	RenderingServer::get_singleton()->free(texture[CameraServer::FEED_Y_IMAGE]);
 	RenderingServer::get_singleton()->free(texture[CameraServer::FEED_CBCR_IMAGE]);
 	RenderingServer::get_singleton()->free(texture[CameraServer::FEED_CBCR_IMAGE]);
 }
 }

+ 2 - 0
servers/rendering/renderer_scene_occlusion_cull.cpp

@@ -60,6 +60,8 @@ void RendererSceneOcclusionCull::HZBuffer::clear() {
 	if (debug_image.is_valid()) {
 	if (debug_image.is_valid()) {
 		debug_image.unref();
 		debug_image.unref();
 	}
 	}
+
+	ERR_FAIL_NULL(RenderingServer::get_singleton());
 	RS::get_singleton()->free(debug_texture);
 	RS::get_singleton()->free(debug_texture);
 }
 }
 
 

+ 1 - 0
servers/xr/xr_interface.cpp

@@ -123,6 +123,7 @@ XRInterface::XRInterface() {}
 
 
 XRInterface::~XRInterface() {
 XRInterface::~XRInterface() {
 	if (vrs.vrs_texture.is_valid()) {
 	if (vrs.vrs_texture.is_valid()) {
+		ERR_FAIL_NULL(RenderingServer::get_singleton());
 		RS::get_singleton()->free(vrs.vrs_texture);
 		RS::get_singleton()->free(vrs.vrs_texture);
 		vrs.vrs_texture = RID();
 		vrs.vrs_texture = RID();
 	}
 	}