Browse Source

Split dependency logic
Split FOG
Split visibility notifier
Final cleanup of storage classes

Bastiaan Olij 3 years ago
parent
commit
ecfcfd97fa
86 changed files with 2263 additions and 1944 deletions
  1. 66 0
      drivers/gles3/environment/fog.cpp
  2. 62 0
      drivers/gles3/environment/fog.h
  3. 2 3
      drivers/gles3/rasterizer_canvas_gles3.cpp
  4. 1 4
      drivers/gles3/rasterizer_canvas_gles3.h
  5. 10 6
      drivers/gles3/rasterizer_gles3.cpp
  6. 6 3
      drivers/gles3/rasterizer_gles3.h
  7. 26 25
      drivers/gles3/rasterizer_scene_gles3.cpp
  8. 6 7
      drivers/gles3/rasterizer_scene_gles3.h
  9. 0 569
      drivers/gles3/rasterizer_storage_gles3.cpp
  10. 0 266
      drivers/gles3/rasterizer_storage_gles3.h
  11. 110 10
      drivers/gles3/storage/light_storage.cpp
  12. 21 4
      drivers/gles3/storage/light_storage.h
  13. 5 5
      drivers/gles3/storage/material_storage.cpp
  14. 45 3
      drivers/gles3/storage/material_storage.h
  15. 26 21
      drivers/gles3/storage/mesh_storage.cpp
  16. 9 4
      drivers/gles3/storage/mesh_storage.h
  17. 55 0
      drivers/gles3/storage/texture_storage.cpp
  18. 19 0
      drivers/gles3/storage/texture_storage.h
  19. 353 0
      drivers/gles3/storage/utilities.cpp
  20. 159 0
      drivers/gles3/storage/utilities.h
  21. 0 2
      modules/openxr/extensions/openxr_vulkan_extension.cpp
  22. 1 0
      servers/rendering/SCsub
  23. 7 0
      servers/rendering/dummy/SCsub
  24. 55 0
      servers/rendering/dummy/environment/fog.h
  25. 6 3
      servers/rendering/dummy/rasterizer_dummy.h
  26. 5 0
      servers/rendering/dummy/storage/SCsub
  27. 2 1
      servers/rendering/dummy/storage/material_storage.h
  28. 6 1
      servers/rendering/dummy/storage/mesh_storage.h
  29. 43 0
      servers/rendering/dummy/storage/texture_storage.cpp
  30. 6 3
      servers/rendering/dummy/storage/texture_storage.h
  31. 44 52
      servers/rendering/dummy/storage/utilities.h
  32. 53 0
      servers/rendering/environment/renderer_fog.h
  33. 0 1
      servers/rendering/environment/renderer_gi.h
  34. 6 0
      servers/rendering/renderer_canvas_render.cpp
  35. 2 6
      servers/rendering/renderer_canvas_render.h
  36. 4 2
      servers/rendering/renderer_compositor.h
  37. 1 1
      servers/rendering/renderer_rd/cluster_builder_rd.cpp
  38. 4 4
      servers/rendering/renderer_rd/cluster_builder_rd.h
  39. 128 0
      servers/rendering/renderer_rd/environment/fog.cpp
  40. 83 0
      servers/rendering/renderer_rd/environment/fog.h
  41. 6 11
      servers/rendering/renderer_rd/environment/gi.cpp
  42. 3 7
      servers/rendering/renderer_rd/environment/gi.h
  43. 37 37
      servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp
  44. 5 5
      servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h
  45. 1 2
      servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp
  46. 1 4
      servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h
  47. 26 27
      servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp
  48. 5 5
      servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h
  49. 1 2
      servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp
  50. 1 3
      servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h
  51. 1 2
      servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp
  52. 2 4
      servers/rendering/renderer_rd/renderer_canvas_render_rd.h
  53. 9 6
      servers/rendering/renderer_rd/renderer_compositor_rd.cpp
  54. 9 3
      servers/rendering/renderer_rd/renderer_compositor_rd.h
  55. 36 36
      servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
  56. 1 3
      servers/rendering/renderer_rd/renderer_scene_render_rd.h
  57. 29 29
      servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp
  58. 10 9
      servers/rendering/renderer_rd/renderer_scene_sky_rd.h
  59. 0 222
      servers/rendering/renderer_rd/renderer_storage_rd.h
  60. 19 19
      servers/rendering/renderer_rd/storage_rd/light_storage.cpp
  61. 4 3
      servers/rendering/renderer_rd/storage_rd/light_storage.h
  62. 7 7
      servers/rendering/renderer_rd/storage_rd/material_storage.cpp
  63. 84 2
      servers/rendering/renderer_rd/storage_rd/material_storage.h
  64. 15 15
      servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp
  65. 5 5
      servers/rendering/renderer_rd/storage_rd/mesh_storage.h
  66. 21 22
      servers/rendering/renderer_rd/storage_rd/particles_storage.cpp
  67. 3 3
      servers/rendering/renderer_rd/storage_rd/particles_storage.h
  68. 3 3
      servers/rendering/renderer_rd/storage_rd/texture_storage.cpp
  69. 2 2
      servers/rendering/renderer_rd/storage_rd/texture_storage.h
  70. 174 256
      servers/rendering/renderer_rd/storage_rd/utilities.cpp
  71. 122 0
      servers/rendering/renderer_rd/storage_rd/utilities.h
  72. 12 12
      servers/rendering/renderer_scene_cull.cpp
  73. 16 16
      servers/rendering/renderer_scene_cull.h
  74. 4 4
      servers/rendering/renderer_viewport.cpp
  75. 26 25
      servers/rendering/rendering_server_default.cpp
  76. 8 2
      servers/rendering/rendering_server_default.h
  77. 2 1
      servers/rendering/rendering_server_globals.cpp
  78. 4 1
      servers/rendering/rendering_server_globals.h
  79. 0 1
      servers/rendering/storage/light_storage.h
  80. 2 2
      servers/rendering/storage/material_storage.h
  81. 2 2
      servers/rendering/storage/mesh_storage.h
  82. 0 1
      servers/rendering/storage/particles_storage.h
  83. 11 0
      servers/rendering/storage/texture_storage.h
  84. 5 11
      servers/rendering/storage/utilities.cpp
  85. 92 104
      servers/rendering/storage/utilities.h
  86. 0 2
      servers/xr/xr_interface_extension.cpp

+ 66 - 0
drivers/gles3/environment/fog.cpp

@@ -0,0 +1,66 @@
+/*************************************************************************/
+/*  fog.cpp                                                              */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifdef GLES3_ENABLED
+
+#include "fog.h"
+
+using namespace GLES3;
+
+/* FOG */
+
+RID Fog::fog_volume_allocate() {
+	return RID();
+}
+
+void Fog::fog_volume_initialize(RID p_rid) {
+}
+
+void Fog::fog_free(RID p_rid) {
+}
+
+void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
+}
+
+void Fog::fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) {
+}
+
+void Fog::fog_volume_set_material(RID p_fog_volume, RID p_material) {
+}
+
+AABB Fog::fog_volume_get_aabb(RID p_fog_volume) const {
+	return AABB();
+}
+
+RS::FogVolumeShape Fog::fog_volume_get_shape(RID p_fog_volume) const {
+	return RS::FOG_VOLUME_SHAPE_BOX;
+}
+
+#endif // GLES3_ENABLED

+ 62 - 0
drivers/gles3/environment/fog.h

@@ -0,0 +1,62 @@
+/*************************************************************************/
+/*  fog.h                                                                */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef FOG_GLES3_H
+#define FOG_GLES3_H
+
+#ifdef GLES3_ENABLED
+
+#include "core/templates/local_vector.h"
+#include "core/templates/rid_owner.h"
+#include "core/templates/self_list.h"
+#include "servers/rendering/environment/renderer_fog.h"
+
+namespace GLES3 {
+
+class Fog : public RendererFog {
+public:
+	/* FOG VOLUMES */
+
+	virtual RID fog_volume_allocate() override;
+	virtual void fog_volume_initialize(RID p_rid) override;
+	virtual void fog_free(RID p_rid) override;
+
+	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override;
+	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override;
+	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) override;
+	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const override;
+	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override;
+};
+
+} // namespace GLES3
+
+#endif // GLES3_ENABLED
+
+#endif // !FOG_GLES3_H

+ 2 - 3
drivers/gles3/rasterizer_canvas_gles3.cpp

@@ -34,12 +34,12 @@
 
 
 #include "core/os/os.h"
 #include "core/os/os.h"
 #include "rasterizer_scene_gles3.h"
 #include "rasterizer_scene_gles3.h"
-#include "rasterizer_storage_gles3.h"
 
 
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "storage/config.h"
 #include "storage/config.h"
 #include "storage/material_storage.h"
 #include "storage/material_storage.h"
+#include "storage/mesh_storage.h"
 #include "storage/texture_storage.h"
 #include "storage/texture_storage.h"
 
 
 #ifndef GLES_OVER_GL
 #ifndef GLES_OVER_GL
@@ -1416,9 +1416,8 @@ RasterizerCanvasGLES3 *RasterizerCanvasGLES3::get_singleton() {
 	return singleton;
 	return singleton;
 }
 }
 
 
-RasterizerCanvasGLES3::RasterizerCanvasGLES3(RasterizerStorageGLES3 *p_storage) {
+RasterizerCanvasGLES3::RasterizerCanvasGLES3() {
 	singleton = this;
 	singleton = this;
-	storage = p_storage;
 	GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
 	GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
 	GLES3::Config *config = GLES3::Config::get_singleton();
 	GLES3::Config *config = GLES3::Config::get_singleton();
 
 

+ 1 - 4
drivers/gles3/rasterizer_canvas_gles3.h

@@ -34,7 +34,6 @@
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 
 
 #include "rasterizer_scene_gles3.h"
 #include "rasterizer_scene_gles3.h"
-#include "rasterizer_storage_gles3.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "storage/material_storage.h"
 #include "storage/material_storage.h"
@@ -204,8 +203,6 @@ public:
 
 
 	typedef void Texture;
 	typedef void Texture;
 
 
-	RasterizerStorageGLES3 *storage = nullptr;
-
 	void canvas_begin(RID p_to_render_target, bool p_to_backbuffer);
 	void canvas_begin(RID p_to_render_target, bool p_to_backbuffer);
 
 
 	//virtual void draw_window_margins(int *black_margin, RID *black_image) override;
 	//virtual void draw_window_margins(int *black_margin, RID *black_image) override;
@@ -260,7 +257,7 @@ public:
 	void set_time(double p_time);
 	void set_time(double p_time);
 
 
 	static RasterizerCanvasGLES3 *get_singleton();
 	static RasterizerCanvasGLES3 *get_singleton();
-	RasterizerCanvasGLES3(RasterizerStorageGLES3 *p_storage);
+	RasterizerCanvasGLES3();
 	~RasterizerCanvasGLES3();
 	~RasterizerCanvasGLES3();
 };
 };
 
 

+ 10 - 6
drivers/gles3/rasterizer_gles3.cpp

@@ -29,6 +29,7 @@
 /*************************************************************************/
 /*************************************************************************/
 
 
 #include "rasterizer_gles3.h"
 #include "rasterizer_gles3.h"
+#include "storage/utilities.h"
 
 
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 
 
@@ -99,8 +100,9 @@ void RasterizerGLES3::begin_frame(double frame_step) {
 	canvas->set_time(time_total);
 	canvas->set_time(time_total);
 	scene->set_time(time_total, frame_step);
 	scene->set_time(time_total, frame_step);
 
 
-	storage->info.render_final = storage->info.render;
-	storage->info.render.reset();
+	GLES3::Utilities *utilities = GLES3::Utilities::get_singleton();
+	utilities->info.render_final = utilities->info.render;
+	utilities->info.render.reset();
 
 
 	//scene->iteration();
 	//scene->iteration();
 }
 }
@@ -197,14 +199,15 @@ void RasterizerGLES3::initialize() {
 void RasterizerGLES3::finalize() {
 void RasterizerGLES3::finalize() {
 	memdelete(scene);
 	memdelete(scene);
 	memdelete(canvas);
 	memdelete(canvas);
-	memdelete(storage);
 	memdelete(gi);
 	memdelete(gi);
+	memdelete(fog);
 	memdelete(copy_effects);
 	memdelete(copy_effects);
 	memdelete(light_storage);
 	memdelete(light_storage);
 	memdelete(particles_storage);
 	memdelete(particles_storage);
 	memdelete(mesh_storage);
 	memdelete(mesh_storage);
 	memdelete(material_storage);
 	memdelete(material_storage);
 	memdelete(texture_storage);
 	memdelete(texture_storage);
+	memdelete(utilities);
 	memdelete(config);
 	memdelete(config);
 }
 }
 
 
@@ -265,6 +268,7 @@ RasterizerGLES3::RasterizerGLES3() {
 
 
 	// OpenGL needs to be initialized before initializing the Rasterizers
 	// OpenGL needs to be initialized before initializing the Rasterizers
 	config = memnew(GLES3::Config);
 	config = memnew(GLES3::Config);
+	utilities = memnew(GLES3::Utilities);
 	texture_storage = memnew(GLES3::TextureStorage);
 	texture_storage = memnew(GLES3::TextureStorage);
 	material_storage = memnew(GLES3::MaterialStorage);
 	material_storage = memnew(GLES3::MaterialStorage);
 	mesh_storage = memnew(GLES3::MeshStorage);
 	mesh_storage = memnew(GLES3::MeshStorage);
@@ -272,9 +276,9 @@ RasterizerGLES3::RasterizerGLES3() {
 	light_storage = memnew(GLES3::LightStorage);
 	light_storage = memnew(GLES3::LightStorage);
 	copy_effects = memnew(GLES3::CopyEffects);
 	copy_effects = memnew(GLES3::CopyEffects);
 	gi = memnew(GLES3::GI);
 	gi = memnew(GLES3::GI);
-	storage = memnew(RasterizerStorageGLES3);
-	canvas = memnew(RasterizerCanvasGLES3(storage));
-	scene = memnew(RasterizerSceneGLES3(storage));
+	fog = memnew(GLES3::Fog);
+	canvas = memnew(RasterizerCanvasGLES3());
+	scene = memnew(RasterizerSceneGLES3());
 }
 }
 
 
 RasterizerGLES3::~RasterizerGLES3() {
 RasterizerGLES3::~RasterizerGLES3() {

+ 6 - 3
drivers/gles3/rasterizer_gles3.h

@@ -34,10 +34,10 @@
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 
 
 #include "effects/copy_effects.h"
 #include "effects/copy_effects.h"
+#include "environment/fog.h"
 #include "environment/gi.h"
 #include "environment/gi.h"
 #include "rasterizer_canvas_gles3.h"
 #include "rasterizer_canvas_gles3.h"
 #include "rasterizer_scene_gles3.h"
 #include "rasterizer_scene_gles3.h"
-#include "rasterizer_storage_gles3.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "storage/config.h"
 #include "storage/config.h"
 #include "storage/light_storage.h"
 #include "storage/light_storage.h"
@@ -45,6 +45,7 @@
 #include "storage/mesh_storage.h"
 #include "storage/mesh_storage.h"
 #include "storage/particles_storage.h"
 #include "storage/particles_storage.h"
 #include "storage/texture_storage.h"
 #include "storage/texture_storage.h"
+#include "storage/utilities.h"
 
 
 class RasterizerGLES3 : public RendererCompositor {
 class RasterizerGLES3 : public RendererCompositor {
 private:
 private:
@@ -55,27 +56,29 @@ private:
 
 
 protected:
 protected:
 	GLES3::Config *config = nullptr;
 	GLES3::Config *config = nullptr;
+	GLES3::Utilities *utilities = nullptr;
 	GLES3::TextureStorage *texture_storage = nullptr;
 	GLES3::TextureStorage *texture_storage = nullptr;
 	GLES3::MaterialStorage *material_storage = nullptr;
 	GLES3::MaterialStorage *material_storage = nullptr;
 	GLES3::MeshStorage *mesh_storage = nullptr;
 	GLES3::MeshStorage *mesh_storage = nullptr;
 	GLES3::ParticlesStorage *particles_storage = nullptr;
 	GLES3::ParticlesStorage *particles_storage = nullptr;
 	GLES3::LightStorage *light_storage = nullptr;
 	GLES3::LightStorage *light_storage = nullptr;
 	GLES3::GI *gi = nullptr;
 	GLES3::GI *gi = nullptr;
+	GLES3::Fog *fog = nullptr;
 	GLES3::CopyEffects *copy_effects = nullptr;
 	GLES3::CopyEffects *copy_effects = nullptr;
-	RasterizerStorageGLES3 *storage = nullptr;
 	RasterizerCanvasGLES3 *canvas = nullptr;
 	RasterizerCanvasGLES3 *canvas = nullptr;
 	RasterizerSceneGLES3 *scene = nullptr;
 	RasterizerSceneGLES3 *scene = nullptr;
 
 
 	void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect);
 	void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect);
 
 
 public:
 public:
+	RendererUtilities *get_utilities() { return utilities; }
 	RendererLightStorage *get_light_storage() { return light_storage; }
 	RendererLightStorage *get_light_storage() { return light_storage; }
 	RendererMaterialStorage *get_material_storage() { return material_storage; }
 	RendererMaterialStorage *get_material_storage() { return material_storage; }
 	RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
 	RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
 	RendererParticlesStorage *get_particles_storage() { return particles_storage; }
 	RendererParticlesStorage *get_particles_storage() { return particles_storage; }
 	RendererTextureStorage *get_texture_storage() { return texture_storage; }
 	RendererTextureStorage *get_texture_storage() { return texture_storage; }
 	RendererGI *get_gi() { return gi; }
 	RendererGI *get_gi() { return gi; }
-	RendererStorage *get_storage() { return storage; }
+	RendererFog *get_fog() { return fog; }
 	RendererCanvasRender *get_canvas() { return canvas; }
 	RendererCanvasRender *get_canvas() { return canvas; }
 	RendererSceneRender *get_scene() { return scene; }
 	RendererSceneRender *get_scene() { return scene; }
 
 

+ 26 - 25
drivers/gles3/rasterizer_scene_gles3.cpp

@@ -33,6 +33,9 @@
 #include "core/templates/sort_array.h"
 #include "core/templates/sort_array.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "storage/config.h"
 #include "storage/config.h"
+#include "storage/light_storage.h"
+#include "storage/mesh_storage.h"
+#include "storage/texture_storage.h"
 
 
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 
 
@@ -45,7 +48,7 @@ RasterizerSceneGLES3 *RasterizerSceneGLES3::get_singleton() {
 }
 }
 
 
 RendererSceneRender::GeometryInstance *RasterizerSceneGLES3::geometry_instance_create(RID p_base) {
 RendererSceneRender::GeometryInstance *RasterizerSceneGLES3::geometry_instance_create(RID p_base) {
-	RS::InstanceType type = storage->get_base_type(p_base);
+	RS::InstanceType type = RSG::utilities->get_base_type(p_base);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 
 
 	GeometryInstanceGLES3 *ginstance = geometry_instance_alloc.alloc();
 	GeometryInstanceGLES3 *ginstance = geometry_instance_alloc.alloc();
@@ -285,16 +288,16 @@ void RasterizerSceneGLES3::_update_dirty_geometry_instances() {
 	}
 	}
 }
 }
 
 
-void RasterizerSceneGLES3::_geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker) {
+void RasterizerSceneGLES3::_geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker) {
 	switch (p_notification) {
 	switch (p_notification) {
-		case RendererStorage::DEPENDENCY_CHANGED_MATERIAL:
-		case RendererStorage::DEPENDENCY_CHANGED_MESH:
-		case RendererStorage::DEPENDENCY_CHANGED_PARTICLES:
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH:
-		case RendererStorage::DEPENDENCY_CHANGED_SKELETON_DATA: {
+		case Dependency::DEPENDENCY_CHANGED_MATERIAL:
+		case Dependency::DEPENDENCY_CHANGED_MESH:
+		case Dependency::DEPENDENCY_CHANGED_PARTICLES:
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH:
+		case Dependency::DEPENDENCY_CHANGED_SKELETON_DATA: {
 			static_cast<RasterizerSceneGLES3 *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 			static_cast<RasterizerSceneGLES3 *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 		} break;
 		} break;
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
 			GeometryInstanceGLES3 *ginstance = static_cast<GeometryInstanceGLES3 *>(p_tracker->userdata);
 			GeometryInstanceGLES3 *ginstance = static_cast<GeometryInstanceGLES3 *>(p_tracker->userdata);
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 				ginstance->instance_count = GLES3::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
 				ginstance->instance_count = GLES3::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
@@ -306,7 +309,7 @@ void RasterizerSceneGLES3::_geometry_instance_dependency_changed(RendererStorage
 	}
 	}
 }
 }
 
 
-void RasterizerSceneGLES3::_geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker) {
+void RasterizerSceneGLES3::_geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker) {
 	static_cast<RasterizerSceneGLES3 *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 	static_cast<RasterizerSceneGLES3 *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 }
 }
 
 
@@ -376,7 +379,7 @@ void RasterizerSceneGLES3::_geometry_instance_add_surface_with_material(Geometry
 	sdcache->surface_index = p_surface;
 	sdcache->surface_index = p_surface;
 
 
 	if (ginstance->data->dirty_dependencies) {
 	if (ginstance->data->dirty_dependencies) {
-		storage->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
+		RSG::utilities->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
 	}
 	}
 
 
 	//shadow
 	//shadow
@@ -1609,10 +1612,10 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da
 	correction.set_depth_correction(p_flip_y);
 	correction.set_depth_correction(p_flip_y);
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 	//store camera into ubo
 	//store camera into ubo
-	RasterizerStorageGLES3::store_camera(projection, scene_state.ubo.projection_matrix);
-	RasterizerStorageGLES3::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
-	RasterizerStorageGLES3::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
-	RasterizerStorageGLES3::store_transform(p_render_data->inv_cam_transform, scene_state.ubo.view_matrix);
+	GLES3::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix);
+	GLES3::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
+	GLES3::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
+	GLES3::MaterialStorage::store_transform(p_render_data->inv_cam_transform, scene_state.ubo.view_matrix);
 
 
 	scene_state.ubo.directional_light_count = p_render_data->directional_light_count;
 	scene_state.ubo.directional_light_count = p_render_data->directional_light_count;
 
 
@@ -1659,7 +1662,7 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da
 
 
 			Basis sky_transform = env->sky_orientation;
 			Basis sky_transform = env->sky_orientation;
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
-			RasterizerStorageGLES3::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
+			GLES3::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
 		}
 		}
@@ -1974,7 +1977,7 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
 	if (p_render_buffers.is_valid()) {
 	if (p_render_buffers.is_valid()) {
 		clear_color = texture_storage->render_target_get_clear_request_color(rb->render_target);
 		clear_color = texture_storage->render_target_get_clear_request_color(rb->render_target);
 	} else {
 	} else {
-		clear_color = storage->get_default_clear_color();
+		clear_color = texture_storage->get_default_clear_color();
 	}
 	}
 
 
 	Environment *env = environment_owner.get_or_null(p_environment);
 	Environment *env = environment_owner.get_or_null(p_environment);
@@ -2657,12 +2660,10 @@ void RasterizerSceneGLES3::decals_set_filter(RS::DecalFilter p_filter) {
 void RasterizerSceneGLES3::light_projectors_set_filter(RS::LightProjectorFilter p_filter) {
 void RasterizerSceneGLES3::light_projectors_set_filter(RS::LightProjectorFilter p_filter) {
 }
 }
 
 
-RasterizerSceneGLES3::RasterizerSceneGLES3(RasterizerStorageGLES3 *p_storage) {
+RasterizerSceneGLES3::RasterizerSceneGLES3() {
 	GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
 	GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
 	GLES3::Config *config = GLES3::Config::get_singleton();
 	GLES3::Config *config = GLES3::Config::get_singleton();
 
 
-	storage = p_storage;
-
 	{
 	{
 		// Setup Lights
 		// Setup Lights
 
 
@@ -2870,15 +2871,15 @@ RasterizerSceneGLES3::~RasterizerSceneGLES3() {
 	// Scene Shader
 	// Scene Shader
 	GLES3::MaterialStorage::get_singleton()->shaders.scene_shader.version_free(scene_globals.shader_default_version);
 	GLES3::MaterialStorage::get_singleton()->shaders.scene_shader.version_free(scene_globals.shader_default_version);
 	GLES3::MaterialStorage::get_singleton()->shaders.cubemap_filter_shader.version_free(scene_globals.cubemap_filter_shader_version);
 	GLES3::MaterialStorage::get_singleton()->shaders.cubemap_filter_shader.version_free(scene_globals.cubemap_filter_shader_version);
-	storage->free(scene_globals.default_material);
-	storage->free(scene_globals.default_shader);
+	RSG::material_storage->material_free(scene_globals.default_material);
+	RSG::material_storage->shader_free(scene_globals.default_shader);
 
 
 	// Sky Shader
 	// Sky Shader
 	GLES3::MaterialStorage::get_singleton()->shaders.sky_shader.version_free(sky_globals.shader_default_version);
 	GLES3::MaterialStorage::get_singleton()->shaders.sky_shader.version_free(sky_globals.shader_default_version);
-	storage->free(sky_globals.default_material);
-	storage->free(sky_globals.default_shader);
-	storage->free(sky_globals.fog_material);
-	storage->free(sky_globals.fog_shader);
+	RSG::material_storage->material_free(sky_globals.default_material);
+	RSG::material_storage->shader_free(sky_globals.default_shader);
+	RSG::material_storage->material_free(sky_globals.fog_material);
+	RSG::material_storage->shader_free(sky_globals.fog_shader);
 	glDeleteBuffers(1, &sky_globals.screen_triangle);
 	glDeleteBuffers(1, &sky_globals.screen_triangle);
 	glDeleteVertexArrays(1, &sky_globals.screen_triangle_array);
 	glDeleteVertexArrays(1, &sky_globals.screen_triangle_array);
 	glDeleteTextures(1, &sky_globals.radical_inverse_vdc_cache_tex);
 	glDeleteTextures(1, &sky_globals.radical_inverse_vdc_cache_tex);

+ 6 - 7
drivers/gles3/rasterizer_scene_gles3.h

@@ -37,7 +37,6 @@
 #include "core/templates/paged_allocator.h"
 #include "core/templates/paged_allocator.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
-#include "rasterizer_storage_gles3.h"
 #include "scene/resources/mesh.h"
 #include "scene/resources/mesh.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_scene_render.h"
 #include "servers/rendering/renderer_scene_render.h"
@@ -45,6 +44,8 @@
 #include "shader_gles3.h"
 #include "shader_gles3.h"
 #include "shaders/cubemap_filter.glsl.gen.h"
 #include "shaders/cubemap_filter.glsl.gen.h"
 #include "shaders/sky.glsl.gen.h"
 #include "shaders/sky.glsl.gen.h"
+#include "storage/material_storage.h"
+#include "storage/utilities.h"
 
 
 enum RenderListType {
 enum RenderListType {
 	RENDER_LIST_OPAQUE, //used for opaque objects
 	RENDER_LIST_OPAQUE, //used for opaque objects
@@ -125,7 +126,6 @@ struct RenderDataGLES3 {
 	RendererScene::RenderInfo *render_info = nullptr;
 	RendererScene::RenderInfo *render_info = nullptr;
 };
 };
 
 
-class RasterizerStorageGLES3;
 class RasterizerCanvasGLES3;
 class RasterizerCanvasGLES3;
 
 
 class RasterizerSceneGLES3 : public RendererSceneRender {
 class RasterizerSceneGLES3 : public RendererSceneRender {
@@ -323,7 +323,7 @@ private:
 			bool mirror = false;
 			bool mirror = false;
 			bool dirty_dependencies = false;
 			bool dirty_dependencies = false;
 
 
-			RendererStorage::DependencyTracker dependency_tracker;
+			DependencyTracker dependency_tracker;
 		};
 		};
 
 
 		Data *data = nullptr;
 		Data *data = nullptr;
@@ -345,8 +345,8 @@ private:
 		INSTANCE_DATA_FLAG_MULTIMESH_HAS_CUSTOM_DATA = 1 << 15,
 		INSTANCE_DATA_FLAG_MULTIMESH_HAS_CUSTOM_DATA = 1 << 15,
 	};
 	};
 
 
-	static void _geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker);
-	static void _geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker);
 
 
 	SelfList<GeometryInstanceGLES3>::List geometry_instance_dirty_list;
 	SelfList<GeometryInstanceGLES3>::List geometry_instance_dirty_list;
 
 
@@ -739,7 +739,6 @@ protected:
 	void _free_sky_data(Sky *p_sky);
 	void _free_sky_data(Sky *p_sky);
 
 
 public:
 public:
-	RasterizerStorageGLES3 *storage;
 	RasterizerCanvasGLES3 *canvas;
 	RasterizerCanvasGLES3 *canvas;
 
 
 	GeometryInstance *geometry_instance_create(RID p_base) override;
 	GeometryInstance *geometry_instance_create(RID p_base) override;
@@ -943,7 +942,7 @@ public:
 	void light_projectors_set_filter(RS::LightProjectorFilter p_filter) override;
 	void light_projectors_set_filter(RS::LightProjectorFilter p_filter) override;
 
 
 	static RasterizerSceneGLES3 *get_singleton();
 	static RasterizerSceneGLES3 *get_singleton();
-	RasterizerSceneGLES3(RasterizerStorageGLES3 *p_storage);
+	RasterizerSceneGLES3();
 	~RasterizerSceneGLES3();
 	~RasterizerSceneGLES3();
 };
 };
 
 

+ 0 - 569
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -1,569 +0,0 @@
-/*************************************************************************/
-/*  rasterizer_storage_gles3.cpp                                         */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#include "rasterizer_storage_gles3.h"
-
-#ifdef GLES3_ENABLED
-
-#include "core/config/project_settings.h"
-#include "core/math/transform_3d.h"
-// #include "rasterizer_canvas_gles3.h"
-#include "rasterizer_scene_gles3.h"
-#include "servers/rendering/shader_language.h"
-
-/* MISC */
-
-void RasterizerStorageGLES3::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
-	if (GLES3::MeshStorage::get_singleton()->owns_mesh(p_base)) {
-		GLES3::Mesh *mesh = GLES3::MeshStorage::get_singleton()->get_mesh(p_base);
-		p_instance->update_dependency(&mesh->dependency);
-	} else if (GLES3::MeshStorage::get_singleton()->owns_multimesh(p_base)) {
-		GLES3::MultiMesh *multimesh = GLES3::MeshStorage::get_singleton()->get_multimesh(p_base);
-		p_instance->update_dependency(&multimesh->dependency);
-		if (multimesh->mesh.is_valid()) {
-			base_update_dependency(multimesh->mesh, p_instance);
-		}
-	} else if (GLES3::LightStorage::get_singleton()->owns_light(p_base)) {
-		GLES3::Light *l = GLES3::LightStorage::get_singleton()->get_light(p_base);
-		p_instance->update_dependency(&l->dependency);
-	}
-}
-
-Vector<uint8_t> RasterizerStorageGLES3::buffer_get_data(GLenum p_target, GLuint p_buffer, uint32_t p_buffer_size) {
-	Vector<uint8_t> ret;
-	ret.resize(p_buffer_size);
-	glBindBuffer(p_target, p_buffer);
-
-#if defined(__EMSCRIPTEN__)
-	{
-		uint8_t *w = ret.ptrw();
-		glGetBufferSubData(p_target, 0, p_buffer_size, w);
-	}
-#else
-	void *data = glMapBufferRange(p_target, 0, p_buffer_size, GL_MAP_READ_BIT);
-	ERR_FAIL_NULL_V(data, Vector<uint8_t>());
-	{
-		uint8_t *w = ret.ptrw();
-		memcpy(w, data, p_buffer_size);
-	}
-	glUnmapBuffer(p_target);
-#endif
-	glBindBuffer(p_target, 0);
-	return ret;
-}
-
-/* OCCLUDER */
-
-void RasterizerStorageGLES3::occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices) {
-}
-
-/* FOG */
-
-RID RasterizerStorageGLES3::fog_volume_allocate() {
-	return RID();
-}
-
-void RasterizerStorageGLES3::fog_volume_initialize(RID p_rid) {
-}
-
-void RasterizerStorageGLES3::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
-}
-
-void RasterizerStorageGLES3::fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) {
-}
-
-void RasterizerStorageGLES3::fog_volume_set_material(RID p_fog_volume, RID p_material) {
-}
-
-AABB RasterizerStorageGLES3::fog_volume_get_aabb(RID p_fog_volume) const {
-	return AABB();
-}
-
-RS::FogVolumeShape RasterizerStorageGLES3::fog_volume_get_shape(RID p_fog_volume) const {
-	return RS::FOG_VOLUME_SHAPE_BOX;
-}
-
-/* VISIBILITY NOTIFIER */
-RID RasterizerStorageGLES3::visibility_notifier_allocate() {
-	return RID();
-}
-
-void RasterizerStorageGLES3::visibility_notifier_initialize(RID p_notifier) {
-}
-
-void RasterizerStorageGLES3::visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) {
-}
-
-void RasterizerStorageGLES3::visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) {
-}
-
-AABB RasterizerStorageGLES3::visibility_notifier_get_aabb(RID p_notifier) const {
-	return AABB();
-}
-
-void RasterizerStorageGLES3::visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) {
-}
-
-/* CANVAS SHADOW */
-
-RID RasterizerStorageGLES3::canvas_light_shadow_buffer_create(int p_width) {
-	CanvasLightShadow *cls = memnew(CanvasLightShadow);
-
-	if (p_width > config->max_texture_size) {
-		p_width = config->max_texture_size;
-	}
-
-	cls->size = p_width;
-	cls->height = 16;
-
-	glActiveTexture(GL_TEXTURE0);
-
-	glGenFramebuffers(1, &cls->fbo);
-	glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
-
-	glGenRenderbuffers(1, &cls->depth);
-	glBindRenderbuffer(GL_RENDERBUFFER, cls->depth);
-	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, cls->size, cls->height);
-	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, cls->depth);
-
-	glGenTextures(1, &cls->distance);
-	glBindTexture(GL_TEXTURE_2D, cls->distance);
-	if (config->use_rgba_2d_shadows) {
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, cls->size, cls->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-	} else {
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, cls->size, cls->height, 0, GL_RED, GL_FLOAT, nullptr);
-	}
-
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cls->distance, 0);
-
-	GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
-	//printf("errnum: %x\n",status);
-	glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo);
-
-	if (status != GL_FRAMEBUFFER_COMPLETE) {
-		memdelete(cls);
-		ERR_FAIL_COND_V(status != GL_FRAMEBUFFER_COMPLETE, RID());
-	}
-
-	return canvas_light_shadow_owner.make_rid(cls);
-}
-
-/* LIGHT SHADOW MAPPING */
-/*
-
-RID RasterizerStorageGLES3::canvas_light_occluder_create() {
-	CanvasOccluder *co = memnew(CanvasOccluder);
-	co->index_id = 0;
-	co->vertex_id = 0;
-	co->len = 0;
-
-	return canvas_occluder_owner.make_rid(co);
-}
-
-void RasterizerStorageGLES3::canvas_light_occluder_set_polylines(RID p_occluder, const PoolVector<Vector2> &p_lines) {
-	CanvasOccluder *co = canvas_occluder_owner.get(p_occluder);
-	ERR_FAIL_COND(!co);
-
-	co->lines = p_lines;
-
-	if (p_lines.size() != co->len) {
-		if (co->index_id) {
-			glDeleteBuffers(1, &co->index_id);
-		} if (co->vertex_id) {
-			glDeleteBuffers(1, &co->vertex_id);
-		}
-
-		co->index_id = 0;
-		co->vertex_id = 0;
-		co->len = 0;
-	}
-
-	if (p_lines.size()) {
-		PoolVector<float> geometry;
-		PoolVector<uint16_t> indices;
-		int lc = p_lines.size();
-
-		geometry.resize(lc * 6);
-		indices.resize(lc * 3);
-
-		PoolVector<float>::Write vw = geometry.write();
-		PoolVector<uint16_t>::Write iw = indices.write();
-
-		PoolVector<Vector2>::Read lr = p_lines.read();
-
-		const int POLY_HEIGHT = 16384;
-
-		for (int i = 0; i < lc / 2; i++) {
-			vw[i * 12 + 0] = lr[i * 2 + 0].x;
-			vw[i * 12 + 1] = lr[i * 2 + 0].y;
-			vw[i * 12 + 2] = POLY_HEIGHT;
-
-			vw[i * 12 + 3] = lr[i * 2 + 1].x;
-			vw[i * 12 + 4] = lr[i * 2 + 1].y;
-			vw[i * 12 + 5] = POLY_HEIGHT;
-
-			vw[i * 12 + 6] = lr[i * 2 + 1].x;
-			vw[i * 12 + 7] = lr[i * 2 + 1].y;
-			vw[i * 12 + 8] = -POLY_HEIGHT;
-
-			vw[i * 12 + 9] = lr[i * 2 + 0].x;
-			vw[i * 12 + 10] = lr[i * 2 + 0].y;
-			vw[i * 12 + 11] = -POLY_HEIGHT;
-
-			iw[i * 6 + 0] = i * 4 + 0;
-			iw[i * 6 + 1] = i * 4 + 1;
-			iw[i * 6 + 2] = i * 4 + 2;
-
-			iw[i * 6 + 3] = i * 4 + 2;
-			iw[i * 6 + 4] = i * 4 + 3;
-			iw[i * 6 + 5] = i * 4 + 0;
-		}
-
-		//if same buffer len is being set, just use BufferSubData to avoid a pipeline flush
-
-		if (!co->vertex_id) {
-			glGenBuffers(1, &co->vertex_id);
-			glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
-			glBufferData(GL_ARRAY_BUFFER, lc * 6 * sizeof(real_t), vw.ptr(), GL_STATIC_DRAW);
-		} else {
-			glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
-			glBufferSubData(GL_ARRAY_BUFFER, 0, lc * 6 * sizeof(real_t), vw.ptr());
-		}
-
-		glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
-
-		if (!co->index_id) {
-			glGenBuffers(1, &co->index_id);
-			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
-			glBufferData(GL_ELEMENT_ARRAY_BUFFER, lc * 3 * sizeof(uint16_t), iw.ptr(), GL_DYNAMIC_DRAW);
-		} else {
-			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
-			glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, lc * 3 * sizeof(uint16_t), iw.ptr());
-		}
-
-		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //unbind
-
-		co->len = lc;
-	}
-}
-*/
-
-RS::InstanceType RasterizerStorageGLES3::get_base_type(RID p_rid) const {
-	if (GLES3::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
-		return RS::INSTANCE_MESH;
-	} else if (GLES3::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
-		return RS::INSTANCE_MULTIMESH;
-	} else if (GLES3::LightStorage::get_singleton()->owns_light(p_rid)) {
-		return RS::INSTANCE_LIGHT;
-	}
-	return RS::INSTANCE_NONE;
-}
-
-bool RasterizerStorageGLES3::free(RID p_rid) {
-	if (GLES3::TextureStorage::get_singleton()->owns_render_target(p_rid)) {
-		GLES3::TextureStorage::get_singleton()->render_target_free(p_rid);
-		return true;
-	} else if (GLES3::TextureStorage::get_singleton()->owns_texture(p_rid)) {
-		GLES3::TextureStorage::get_singleton()->texture_free(p_rid);
-		return true;
-	} else if (GLES3::TextureStorage::get_singleton()->owns_canvas_texture(p_rid)) {
-		GLES3::TextureStorage::get_singleton()->canvas_texture_free(p_rid);
-		return true;
-	} else if (GLES3::MaterialStorage::get_singleton()->owns_shader(p_rid)) {
-		GLES3::MaterialStorage::get_singleton()->shader_free(p_rid);
-		return true;
-	} else if (GLES3::MaterialStorage::get_singleton()->owns_material(p_rid)) {
-		GLES3::MaterialStorage::get_singleton()->material_free(p_rid);
-		return true;
-	} else if (GLES3::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
-		GLES3::MeshStorage::get_singleton()->mesh_free(p_rid);
-		return true;
-	} else if (GLES3::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
-		GLES3::MeshStorage::get_singleton()->multimesh_free(p_rid);
-		return true;
-	} else if (GLES3::MeshStorage::get_singleton()->owns_mesh_instance(p_rid)) {
-		GLES3::MeshStorage::get_singleton()->mesh_instance_free(p_rid);
-		return true;
-	} else if (GLES3::LightStorage::get_singleton()->owns_light(p_rid)) {
-		GLES3::LightStorage::get_singleton()->light_free(p_rid);
-		return true;
-	} else {
-		return false;
-	}
-	/*
-	  else if (reflection_probe_owner.owns(p_rid)) {
-		// delete the texture
-		ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_rid);
-		reflection_probe->instance_remove_deps();
-
-		reflection_probe_owner.free(p_rid);
-		memdelete(reflection_probe);
-
-		return true;
-	} else if (lightmap_capture_data_owner.owns(p_rid)) {
-		// delete the texture
-		LightmapCapture *lightmap_capture = lightmap_capture_data_owner.get_or_null(p_rid);
-		lightmap_capture->instance_remove_deps();
-
-		lightmap_capture_data_owner.free(p_rid);
-		memdelete(lightmap_capture);
-		return true;
-
-	} else if (canvas_occluder_owner.owns(p_rid)) {
-		CanvasOccluder *co = canvas_occluder_owner.get_or_null(p_rid);
-		if (co->index_id) {
-			glDeleteBuffers(1, &co->index_id);
-		}
-		if (co->vertex_id) {
-			glDeleteBuffers(1, &co->vertex_id);
-		}
-
-		canvas_occluder_owner.free(p_rid);
-		memdelete(co);
-
-		return true;
-
-	} else if (canvas_light_shadow_owner.owns(p_rid)) {
-		CanvasLightShadow *cls = canvas_light_shadow_owner.get_or_null(p_rid);
-		glDeleteFramebuffers(1, &cls->fbo);
-		glDeleteRenderbuffers(1, &cls->depth);
-		glDeleteTextures(1, &cls->distance);
-		canvas_light_shadow_owner.free(p_rid);
-		memdelete(cls);
-
-		return true;
-		*/
-}
-
-bool RasterizerStorageGLES3::has_os_feature(const String &p_feature) const {
-	if (!config) {
-		return false;
-	}
-
-	if (p_feature == "rgtc") {
-		return config->rgtc_supported;
-	}
-
-	if (p_feature == "s3tc") {
-		return config->s3tc_supported;
-	}
-
-	if (p_feature == "bptc") {
-		return config->bptc_supported;
-	}
-
-	if (p_feature == "etc" || p_feature == "etc2") {
-		return config->etc2_supported;
-	}
-
-	return false;
-}
-
-////////////////////////////////////////////
-
-void RasterizerStorageGLES3::set_debug_generate_wireframes(bool p_generate) {
-}
-
-//void RasterizerStorageGLES3::render_info_begin_capture() {
-//	info.snap = info.render;
-//}
-
-//void RasterizerStorageGLES3::render_info_end_capture() {
-//	info.snap.object_count = info.render.object_count - info.snap.object_count;
-//	info.snap.draw_call_count = info.render.draw_call_count - info.snap.draw_call_count;
-//	info.snap.material_switch_count = info.render.material_switch_count - info.snap.material_switch_count;
-//	info.snap.surface_switch_count = info.render.surface_switch_count - info.snap.surface_switch_count;
-//	info.snap.shader_rebind_count = info.render.shader_rebind_count - info.snap.shader_rebind_count;
-//	info.snap.vertices_count = info.render.vertices_count - info.snap.vertices_count;
-//	info.snap._2d_item_count = info.render._2d_item_count - info.snap._2d_item_count;
-//	info.snap._2d_draw_call_count = info.render._2d_draw_call_count - info.snap._2d_draw_call_count;
-//}
-
-//int RasterizerStorageGLES3::get_captured_render_info(RS::RenderInfo p_info) {
-//	switch (p_info) {
-//		case RS::INFO_OBJECTS_IN_FRAME: {
-//			return info.snap.object_count;
-//		} break;
-//		case RS::INFO_VERTICES_IN_FRAME: {
-//			return info.snap.vertices_count;
-//		} break;
-//		case RS::INFO_MATERIAL_CHANGES_IN_FRAME: {
-//			return info.snap.material_switch_count;
-//		} break;
-//		case RS::INFO_SHADER_CHANGES_IN_FRAME: {
-//			return info.snap.shader_rebind_count;
-//		} break;
-//		case RS::INFO_SURFACE_CHANGES_IN_FRAME: {
-//			return info.snap.surface_switch_count;
-//		} break;
-//		case RS::INFO_DRAW_CALLS_IN_FRAME: {
-//			return info.snap.draw_call_count;
-//		} break;
-//			/*
-//		case RS::INFO_2D_ITEMS_IN_FRAME: {
-//			return info.snap._2d_item_count;
-//		} break;
-//		case RS::INFO_2D_DRAW_CALLS_IN_FRAME: {
-//			return info.snap._2d_draw_call_count;
-//		} break;
-//			*/
-//		default: {
-//			return get_render_info(p_info);
-//		}
-//	}
-//}
-
-//int RasterizerStorageGLES3::get_render_info(RS::RenderInfo p_info) {
-//	switch (p_info) {
-//		case RS::INFO_OBJECTS_IN_FRAME:
-//			return info.render_final.object_count;
-//		case RS::INFO_VERTICES_IN_FRAME:
-//			return info.render_final.vertices_count;
-//		case RS::INFO_MATERIAL_CHANGES_IN_FRAME:
-//			return info.render_final.material_switch_count;
-//		case RS::INFO_SHADER_CHANGES_IN_FRAME:
-//			return info.render_final.shader_rebind_count;
-//		case RS::INFO_SURFACE_CHANGES_IN_FRAME:
-//			return info.render_final.surface_switch_count;
-//		case RS::INFO_DRAW_CALLS_IN_FRAME:
-//			return info.render_final.draw_call_count;
-//			/*
-//		case RS::INFO_2D_ITEMS_IN_FRAME:
-//			return info.render_final._2d_item_count;
-//		case RS::INFO_2D_DRAW_CALLS_IN_FRAME:
-//			return info.render_final._2d_draw_call_count;
-//*/
-//		case RS::INFO_USAGE_VIDEO_MEM_TOTAL:
-//			return 0; //no idea
-//		case RS::INFO_VIDEO_MEM_USED:
-//			return info.vertex_mem + info.texture_mem;
-//		case RS::INFO_TEXTURE_MEM_USED:
-//			return info.texture_mem;
-//		case RS::INFO_VERTEX_MEM_USED:
-//			return info.vertex_mem;
-//		default:
-//			return 0; //no idea either
-//	}
-//}
-
-String RasterizerStorageGLES3::get_video_adapter_name() const {
-	return (const char *)glGetString(GL_RENDERER);
-}
-
-String RasterizerStorageGLES3::get_video_adapter_vendor() const {
-	return (const char *)glGetString(GL_VENDOR);
-}
-
-RenderingDevice::DeviceType RasterizerStorageGLES3::get_video_adapter_type() const {
-	return RenderingDevice::DeviceType::DEVICE_TYPE_OTHER;
-}
-
-String RasterizerStorageGLES3::get_video_adapter_api_version() const {
-	return (const char *)glGetString(GL_VERSION);
-}
-
-void RasterizerStorageGLES3::initialize() {
-	config = GLES3::Config::get_singleton();
-
-	// skeleton buffer
-	{
-		resources.skeleton_transform_buffer_size = 0;
-		glGenBuffers(1, &resources.skeleton_transform_buffer);
-	}
-
-	// radical inverse vdc cache texture
-	// used for cubemap filtering
-	glGenTextures(1, &resources.radical_inverse_vdc_cache_tex);
-
-	glActiveTexture(GL_TEXTURE0);
-	glBindTexture(GL_TEXTURE_2D, resources.radical_inverse_vdc_cache_tex);
-	/*
-	uint8_t radical_inverse[512];
-
-	for (uint32_t i = 0; i < 512; i++) {
-		uint32_t bits = i;
-
-		bits = (bits << 16) | (bits >> 16);
-		bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1);
-		bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2);
-		bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4);
-		bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8);
-
-		float value = float(bits) * 2.3283064365386963e-10;
-		radical_inverse[i] = uint8_t(CLAMP(value * 255.0, 0, 255));
-	}
-
-	//glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, radical_inverse);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //need this for proper sampling
-	*/
-	glBindTexture(GL_TEXTURE_2D, 0);
-
-	{
-		glGenFramebuffers(1, &resources.mipmap_blur_fbo);
-		glGenTextures(1, &resources.mipmap_blur_color);
-	}
-
-#ifdef GLES_OVER_GL
-	glEnable(GL_PROGRAM_POINT_SIZE);
-#endif
-}
-
-void RasterizerStorageGLES3::finalize() {
-}
-
-void RasterizerStorageGLES3::update_memory_info() {
-}
-
-uint64_t RasterizerStorageGLES3::get_rendering_info(RS::RenderingInfo p_info) {
-	return 0;
-}
-
-void RasterizerStorageGLES3::update_dirty_resources() {
-	GLES3::MaterialStorage::get_singleton()->_update_global_variables();
-	GLES3::MaterialStorage::get_singleton()->_update_queued_materials();
-	//GLES3::MeshStorage::get_singleton()->_update_dirty_skeletons();
-	GLES3::MeshStorage::get_singleton()->_update_dirty_multimeshes();
-}
-
-RasterizerStorageGLES3::RasterizerStorageGLES3() {
-	initialize();
-}
-
-RasterizerStorageGLES3::~RasterizerStorageGLES3() {
-}
-
-#endif // GLES3_ENABLED

+ 0 - 266
drivers/gles3/rasterizer_storage_gles3.h

@@ -1,266 +0,0 @@
-/*************************************************************************/
-/*  rasterizer_storage_gles3.h                                           */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef RASTERIZER_STORAGE_OPENGL_H
-#define RASTERIZER_STORAGE_OPENGL_H
-
-#ifdef GLES3_ENABLED
-
-#include "core/templates/local_vector.h"
-#include "core/templates/rid_owner.h"
-#include "core/templates/self_list.h"
-#include "servers/rendering/renderer_compositor.h"
-#include "servers/rendering/renderer_storage.h"
-#include "servers/rendering/shader_compiler.h"
-#include "servers/rendering/shader_language.h"
-#include "storage/config.h"
-#include "storage/light_storage.h"
-#include "storage/material_storage.h"
-#include "storage/mesh_storage.h"
-#include "storage/texture_storage.h"
-
-// class RasterizerCanvasGLES3;
-// class RasterizerSceneGLES3;
-
-class RasterizerStorageGLES3 : public RendererStorage {
-public:
-	// RasterizerCanvasGLES3 *canvas;
-	// RasterizerSceneGLES3 *scene;
-
-	GLES3::Config *config = nullptr;
-
-	static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.basis.rows[0][0];
-		p_array[1] = p_mtx.basis.rows[1][0];
-		p_array[2] = p_mtx.basis.rows[2][0];
-		p_array[3] = 0;
-		p_array[4] = p_mtx.basis.rows[0][1];
-		p_array[5] = p_mtx.basis.rows[1][1];
-		p_array[6] = p_mtx.basis.rows[2][1];
-		p_array[7] = 0;
-		p_array[8] = p_mtx.basis.rows[0][2];
-		p_array[9] = p_mtx.basis.rows[1][2];
-		p_array[10] = p_mtx.basis.rows[2][2];
-		p_array[11] = 0;
-		p_array[12] = p_mtx.origin.x;
-		p_array[13] = p_mtx.origin.y;
-		p_array[14] = p_mtx.origin.z;
-		p_array[15] = 1;
-	}
-
-	static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.rows[0][0];
-		p_array[1] = p_mtx.rows[1][0];
-		p_array[2] = p_mtx.rows[2][0];
-		p_array[3] = 0;
-		p_array[4] = p_mtx.rows[0][1];
-		p_array[5] = p_mtx.rows[1][1];
-		p_array[6] = p_mtx.rows[2][1];
-		p_array[7] = 0;
-		p_array[8] = p_mtx.rows[0][2];
-		p_array[9] = p_mtx.rows[1][2];
-		p_array[10] = p_mtx.rows[2][2];
-		p_array[11] = 0;
-	}
-
-	static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
-		for (int i = 0; i < 4; i++) {
-			for (int j = 0; j < 4; j++) {
-				p_array[i * 4 + j] = p_mtx.matrix[i][j];
-			}
-		}
-	}
-
-	// Buffer size is specified in bytes
-	static Vector<uint8_t> buffer_get_data(GLenum p_target, GLuint p_buffer, uint32_t p_buffer_size);
-
-	struct Resources {
-		GLuint mipmap_blur_fbo;
-		GLuint mipmap_blur_color;
-
-		GLuint radical_inverse_vdc_cache_tex;
-		bool use_rgba_2d_shadows;
-
-		size_t skeleton_transform_buffer_size;
-		GLuint skeleton_transform_buffer;
-		LocalVector<float> skeleton_transform_cpu_buffer;
-
-	} resources;
-
-	struct Info {
-		uint64_t texture_mem = 0;
-		uint64_t vertex_mem = 0;
-
-		struct Render {
-			uint32_t object_count;
-			uint32_t draw_call_count;
-			uint32_t material_switch_count;
-			uint32_t surface_switch_count;
-			uint32_t shader_rebind_count;
-			uint32_t vertices_count;
-			uint32_t _2d_item_count;
-			uint32_t _2d_draw_call_count;
-
-			void reset() {
-				object_count = 0;
-				draw_call_count = 0;
-				material_switch_count = 0;
-				surface_switch_count = 0;
-				shader_rebind_count = 0;
-				vertices_count = 0;
-				_2d_item_count = 0;
-				_2d_draw_call_count = 0;
-			}
-		} render, render_final, snap;
-
-		Info() {
-			render.reset();
-			render_final.reset();
-		}
-
-	} info;
-
-	/////////////////////////////////////////////////////////////////////////////////////////
-	//////////////////////////////////API////////////////////////////////////////////////////
-	/////////////////////////////////////////////////////////////////////////////////////////
-
-public:
-	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override;
-
-	/* OCCLUDER */
-
-	void occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices);
-
-	/* FOG VOLUMES */
-
-	RID fog_volume_allocate() override;
-	void fog_volume_initialize(RID p_rid) override;
-
-	void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override;
-	void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override;
-	void fog_volume_set_material(RID p_fog_volume, RID p_material) override;
-	AABB fog_volume_get_aabb(RID p_fog_volume) const override;
-	RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override;
-
-	/* VISIBILITY NOTIFIER */
-	RID visibility_notifier_allocate() override;
-	void visibility_notifier_initialize(RID p_notifier) override;
-	void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) override;
-	void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) override;
-
-	AABB visibility_notifier_get_aabb(RID p_notifier) const override;
-	void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) override;
-
-	// access from canvas
-	//	GLES3::RenderTarget * render_target_get(RID p_render_target);
-
-	/* CANVAS SHADOW */
-
-	struct CanvasLightShadow {
-		RID self;
-		int size;
-		int height;
-		GLuint fbo;
-		GLuint depth;
-		GLuint distance; //for older devices
-	};
-
-	RID_PtrOwner<CanvasLightShadow> canvas_light_shadow_owner;
-
-	RID canvas_light_shadow_buffer_create(int p_width);
-
-	/* LIGHT SHADOW MAPPING */
-	/*
-	struct CanvasOccluder {
-		RID self;
-
-		GLuint vertex_id; // 0 means, unconfigured
-		GLuint index_id; // 0 means, unconfigured
-		LocalVector<Vector2> lines;
-		int len;
-	};
-
-	RID_Owner<CanvasOccluder> canvas_occluder_owner;
-
-	RID canvas_light_occluder_create();
-	void canvas_light_occluder_set_polylines(RID p_occluder, const LocalVector<Vector2> &p_lines);
-*/
-
-	RS::InstanceType get_base_type(RID p_rid) const override;
-
-	bool free(RID p_rid) override;
-
-	void initialize();
-	void finalize();
-
-	void update_memory_info() override;
-	uint64_t get_rendering_info(RS::RenderingInfo p_info) override;
-
-	bool has_os_feature(const String &p_feature) const override;
-
-	void update_dirty_resources() override;
-
-	void set_debug_generate_wireframes(bool p_generate) override;
-
-	//	void render_info_begin_capture() override;
-	//	void render_info_end_capture() override;
-	//	int get_captured_render_info(RS::RenderInfo p_info) override;
-
-	//	int get_render_info(RS::RenderInfo p_info) override;
-	String get_video_adapter_name() const override;
-	String get_video_adapter_vendor() const override;
-	RenderingDevice::DeviceType get_video_adapter_type() const override;
-	String get_video_adapter_api_version() const override;
-
-	void capture_timestamps_begin() override {}
-	void capture_timestamp(const String &p_name) override {}
-	uint32_t get_captured_timestamps_count() const override {
-		return 0;
-	}
-	uint64_t get_captured_timestamps_frame() const override {
-		return 0;
-	}
-	uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const override {
-		return 0;
-	}
-	uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const override {
-		return 0;
-	}
-	String get_captured_timestamp_name(uint32_t p_index) const override {
-		return String();
-	}
-
-	RasterizerStorageGLES3();
-	~RasterizerStorageGLES3();
-};
-
-#endif // GLES3_ENABLED
-
-#endif // RASTERIZER_STORAGE_OPENGL_H

+ 110 - 10
drivers/gles3/storage/light_storage.cpp

@@ -139,12 +139,12 @@ void LightStorage::light_set_param(RID p_light, RS::LightParam p_param, float p_
 		case RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE:
 		case RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE:
 		case RS::LIGHT_PARAM_SHADOW_BIAS: {
 		case RS::LIGHT_PARAM_SHADOW_BIAS: {
 			light->version++;
 			light->version++;
-			light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+			light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 		} break;
 		} break;
 		case RS::LIGHT_PARAM_SIZE: {
 		case RS::LIGHT_PARAM_SIZE: {
 			if ((light->param[p_param] > CMP_EPSILON) != (p_value > CMP_EPSILON)) {
 			if ((light->param[p_param] > CMP_EPSILON) != (p_value > CMP_EPSILON)) {
 				//changing from no size to size and the opposite
 				//changing from no size to size and the opposite
-				light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
+				light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
 			}
 			}
 		} break;
 		} break;
 		default: {
 		default: {
@@ -160,7 +160,7 @@ void LightStorage::light_set_shadow(RID p_light, bool p_enabled) {
 	light->shadow = p_enabled;
 	light->shadow = p_enabled;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_projector(RID p_light, RID p_texture) {
 void LightStorage::light_set_projector(RID p_light, RID p_texture) {
@@ -182,7 +182,7 @@ void LightStorage::light_set_projector(RID p_light, RID p_texture) {
 		if (light->projector.is_valid()) {
 		if (light->projector.is_valid()) {
 			texture_storage->texture_add_to_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI);
 			texture_storage->texture_add_to_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI);
 		}
 		}
-		light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
+		light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
 	}
 	}
 }
 }
 
 
@@ -200,7 +200,7 @@ void LightStorage::light_set_cull_mask(RID p_light, uint32_t p_mask) {
 	light->cull_mask = p_mask;
 	light->cull_mask = p_mask;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) {
 void LightStorage::light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) {
@@ -220,7 +220,7 @@ void LightStorage::light_set_reverse_cull_face_mode(RID p_light, bool p_enabled)
 	light->reverse_cull = p_enabled;
 	light->reverse_cull = p_enabled;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) {
 void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) {
@@ -230,7 +230,7 @@ void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mod
 	light->bake_mode = p_bake_mode;
 	light->bake_mode = p_bake_mode;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMode p_mode) {
 void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMode p_mode) {
@@ -240,7 +240,7 @@ void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMo
 	light->omni_shadow_mode = p_mode;
 	light->omni_shadow_mode = p_mode;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 RS::LightOmniShadowMode LightStorage::light_omni_get_shadow_mode(RID p_light) {
 RS::LightOmniShadowMode LightStorage::light_omni_get_shadow_mode(RID p_light) {
@@ -256,7 +256,7 @@ void LightStorage::light_directional_set_shadow_mode(RID p_light, RS::LightDirec
 
 
 	light->directional_shadow_mode = p_mode;
 	light->directional_shadow_mode = p_mode;
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable) {
 void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable) {
@@ -265,7 +265,7 @@ void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable
 
 
 	light->directional_blend_splits = p_enable;
 	light->directional_blend_splits = p_enable;
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 bool LightStorage::light_directional_get_blend_splits(RID p_light) const {
 bool LightStorage::light_directional_get_blend_splits(RID p_light) const {
@@ -476,4 +476,104 @@ float LightStorage::lightmap_get_probe_capture_update_speed() const {
 	return 0;
 	return 0;
 }
 }
 
 
+/* LIGHT SHADOW MAPPING */
+/*
+
+RID LightStorage::canvas_light_occluder_create() {
+	CanvasOccluder *co = memnew(CanvasOccluder);
+	co->index_id = 0;
+	co->vertex_id = 0;
+	co->len = 0;
+
+	return canvas_occluder_owner.make_rid(co);
+}
+
+void LightStorage::canvas_light_occluder_set_polylines(RID p_occluder, const PoolVector<Vector2> &p_lines) {
+	CanvasOccluder *co = canvas_occluder_owner.get(p_occluder);
+	ERR_FAIL_COND(!co);
+
+	co->lines = p_lines;
+
+	if (p_lines.size() != co->len) {
+		if (co->index_id) {
+			glDeleteBuffers(1, &co->index_id);
+		} if (co->vertex_id) {
+			glDeleteBuffers(1, &co->vertex_id);
+		}
+
+		co->index_id = 0;
+		co->vertex_id = 0;
+		co->len = 0;
+	}
+
+	if (p_lines.size()) {
+		PoolVector<float> geometry;
+		PoolVector<uint16_t> indices;
+		int lc = p_lines.size();
+
+		geometry.resize(lc * 6);
+		indices.resize(lc * 3);
+
+		PoolVector<float>::Write vw = geometry.write();
+		PoolVector<uint16_t>::Write iw = indices.write();
+
+		PoolVector<Vector2>::Read lr = p_lines.read();
+
+		const int POLY_HEIGHT = 16384;
+
+		for (int i = 0; i < lc / 2; i++) {
+			vw[i * 12 + 0] = lr[i * 2 + 0].x;
+			vw[i * 12 + 1] = lr[i * 2 + 0].y;
+			vw[i * 12 + 2] = POLY_HEIGHT;
+
+			vw[i * 12 + 3] = lr[i * 2 + 1].x;
+			vw[i * 12 + 4] = lr[i * 2 + 1].y;
+			vw[i * 12 + 5] = POLY_HEIGHT;
+
+			vw[i * 12 + 6] = lr[i * 2 + 1].x;
+			vw[i * 12 + 7] = lr[i * 2 + 1].y;
+			vw[i * 12 + 8] = -POLY_HEIGHT;
+
+			vw[i * 12 + 9] = lr[i * 2 + 0].x;
+			vw[i * 12 + 10] = lr[i * 2 + 0].y;
+			vw[i * 12 + 11] = -POLY_HEIGHT;
+
+			iw[i * 6 + 0] = i * 4 + 0;
+			iw[i * 6 + 1] = i * 4 + 1;
+			iw[i * 6 + 2] = i * 4 + 2;
+
+			iw[i * 6 + 3] = i * 4 + 2;
+			iw[i * 6 + 4] = i * 4 + 3;
+			iw[i * 6 + 5] = i * 4 + 0;
+		}
+
+		//if same buffer len is being set, just use BufferSubData to avoid a pipeline flush
+
+		if (!co->vertex_id) {
+			glGenBuffers(1, &co->vertex_id);
+			glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
+			glBufferData(GL_ARRAY_BUFFER, lc * 6 * sizeof(real_t), vw.ptr(), GL_STATIC_DRAW);
+		} else {
+			glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
+			glBufferSubData(GL_ARRAY_BUFFER, 0, lc * 6 * sizeof(real_t), vw.ptr());
+		}
+
+		glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
+
+		if (!co->index_id) {
+			glGenBuffers(1, &co->index_id);
+			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
+			glBufferData(GL_ELEMENT_ARRAY_BUFFER, lc * 3 * sizeof(uint16_t), iw.ptr(), GL_DYNAMIC_DRAW);
+		} else {
+			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
+			glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, lc * 3 * sizeof(uint16_t), iw.ptr());
+		}
+
+		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //unbind
+
+		co->len = lc;
+	}
+}
+*/
+
 #endif // !GLES3_ENABLED
 #endif // !GLES3_ENABLED

+ 21 - 4
drivers/gles3/storage/light_storage.h

@@ -37,8 +37,8 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/storage/light_storage.h"
 #include "servers/rendering/storage/light_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 #include "platform_config.h"
 #include "platform_config.h"
 #ifndef OPENGL_INCLUDE_H
 #ifndef OPENGL_INCLUDE_H
@@ -72,7 +72,7 @@ struct Light {
 	RS::LightDirectionalSkyMode directional_sky_mode = RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_AND_SKY;
 	RS::LightDirectionalSkyMode directional_sky_mode = RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_AND_SKY;
 	uint64_t version = 0;
 	uint64_t version = 0;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* REFLECTION PROBE */
 /* REFLECTION PROBE */
@@ -93,7 +93,7 @@ struct ReflectionProbe {
 	uint32_t cull_mask = (1 << 20) - 1;
 	uint32_t cull_mask = (1 << 20) - 1;
 	float mesh_lod_threshold = 0.01;
 	float mesh_lod_threshold = 0.01;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* LIGHTMAP */
 /* LIGHTMAP */
@@ -115,7 +115,7 @@ struct Lightmap {
 		int32_t over = EMPTY_LEAF, under = EMPTY_LEAF;
 		int32_t over = EMPTY_LEAF, under = EMPTY_LEAF;
 	};
 	};
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 class LightStorage : public RendererLightStorage {
 class LightStorage : public RendererLightStorage {
@@ -321,6 +321,23 @@ public:
 	virtual bool lightmap_is_interior(RID p_lightmap) const override;
 	virtual bool lightmap_is_interior(RID p_lightmap) const override;
 	virtual void lightmap_set_probe_capture_update_speed(float p_speed) override;
 	virtual void lightmap_set_probe_capture_update_speed(float p_speed) override;
 	virtual float lightmap_get_probe_capture_update_speed() const override;
 	virtual float lightmap_get_probe_capture_update_speed() const override;
+
+	/* LIGHT SHADOW MAPPING */
+	/*
+	struct CanvasOccluder {
+		RID self;
+
+		GLuint vertex_id; // 0 means, unconfigured
+		GLuint index_id; // 0 means, unconfigured
+		LocalVector<Vector2> lines;
+		int len;
+	};
+
+	RID_Owner<CanvasOccluder> canvas_occluder_owner;
+
+	RID canvas_light_occluder_create();
+	void canvas_light_occluder_set_polylines(RID p_occluder, const LocalVector<Vector2> &p_lines);
+	*/
 };
 };
 
 
 } // namespace GLES3
 } // namespace GLES3

+ 5 - 5
drivers/gles3/storage/material_storage.cpp

@@ -2456,7 +2456,7 @@ void MaterialStorage::shader_set_code(RID p_shader, const String &p_code) {
 
 
 	for (Material *E : shader->owners) {
 	for (Material *E : shader->owners) {
 		Material *material = E;
 		Material *material = E;
-		material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+		material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 		_material_queue_update(material, true, true);
 		_material_queue_update(material, true, true);
 	}
 	}
 }
 }
@@ -2593,7 +2593,7 @@ void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
 	}
 	}
 
 
 	if (p_shader.is_null()) {
 	if (p_shader.is_null()) {
-		material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+		material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 		material->shader_id = 0;
 		material->shader_id = 0;
 		return;
 		return;
 	}
 	}
@@ -2616,7 +2616,7 @@ void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
 	material->data->set_next_pass(material->next_pass);
 	material->data->set_next_pass(material->next_pass);
 	material->data->set_render_priority(material->priority);
 	material->data->set_render_priority(material->priority);
 	//updating happens later
 	//updating happens later
-	material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 	_material_queue_update(material, true, true);
 	_material_queue_update(material, true, true);
 }
 }
 
 
@@ -2662,7 +2662,7 @@ void MaterialStorage::material_set_next_pass(RID p_material, RID p_next_material
 		material->data->set_next_pass(p_next_material);
 		material->data->set_next_pass(p_next_material);
 	}
 	}
 
 
-	material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 }
 }
 
 
 void MaterialStorage::material_set_render_priority(RID p_material, int priority) {
 void MaterialStorage::material_set_render_priority(RID p_material, int priority) {
@@ -2715,7 +2715,7 @@ void MaterialStorage::material_get_instance_shader_parameters(RID p_material, Li
 	}
 	}
 }
 }
 
 
-void MaterialStorage::material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) {
+void MaterialStorage::material_update_dependency(RID p_material, DependencyTracker *p_instance) {
 	Material *material = material_owner.get_or_null(p_material);
 	Material *material = material_owner.get_or_null(p_material);
 	ERR_FAIL_COND(!material);
 	ERR_FAIL_COND(!material);
 	p_instance->update_dependency(&material->dependency);
 	p_instance->update_dependency(&material->dependency);

+ 45 - 3
drivers/gles3/storage/material_storage.h

@@ -37,10 +37,10 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_language.h"
 #include "servers/rendering/shader_language.h"
 #include "servers/rendering/storage/material_storage.h"
 #include "servers/rendering/storage/material_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 #include "../shaders/canvas.glsl.gen.h"
 #include "../shaders/canvas.glsl.gen.h"
 #include "../shaders/cubemap_filter.glsl.gen.h"
 #include "../shaders/cubemap_filter.glsl.gen.h"
@@ -125,7 +125,7 @@ struct Material {
 	RID next_pass;
 	RID next_pass;
 	SelfList<Material> update_element;
 	SelfList<Material> update_element;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 
 
 	Material() :
 	Material() :
 			update_element(this) {}
 			update_element(this) {}
@@ -453,6 +453,48 @@ public:
 	MaterialStorage();
 	MaterialStorage();
 	virtual ~MaterialStorage();
 	virtual ~MaterialStorage();
 
 
+	static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.basis.rows[0][0];
+		p_array[1] = p_mtx.basis.rows[1][0];
+		p_array[2] = p_mtx.basis.rows[2][0];
+		p_array[3] = 0;
+		p_array[4] = p_mtx.basis.rows[0][1];
+		p_array[5] = p_mtx.basis.rows[1][1];
+		p_array[6] = p_mtx.basis.rows[2][1];
+		p_array[7] = 0;
+		p_array[8] = p_mtx.basis.rows[0][2];
+		p_array[9] = p_mtx.basis.rows[1][2];
+		p_array[10] = p_mtx.basis.rows[2][2];
+		p_array[11] = 0;
+		p_array[12] = p_mtx.origin.x;
+		p_array[13] = p_mtx.origin.y;
+		p_array[14] = p_mtx.origin.z;
+		p_array[15] = 1;
+	}
+
+	static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.rows[0][0];
+		p_array[1] = p_mtx.rows[1][0];
+		p_array[2] = p_mtx.rows[2][0];
+		p_array[3] = 0;
+		p_array[4] = p_mtx.rows[0][1];
+		p_array[5] = p_mtx.rows[1][1];
+		p_array[6] = p_mtx.rows[2][1];
+		p_array[7] = 0;
+		p_array[8] = p_mtx.rows[0][2];
+		p_array[9] = p_mtx.rows[1][2];
+		p_array[10] = p_mtx.rows[2][2];
+		p_array[11] = 0;
+	}
+
+	static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
+		for (int i = 0; i < 4; i++) {
+			for (int j = 0; j < 4; j++) {
+				p_array[i * 4 + j] = p_mtx.matrix[i][j];
+			}
+		}
+	}
+
 	struct Shaders {
 	struct Shaders {
 		CanvasShaderGLES3 canvas_shader;
 		CanvasShaderGLES3 canvas_shader;
 		SkyShaderGLES3 sky_shader;
 		SkyShaderGLES3 sky_shader;
@@ -534,7 +576,7 @@ public:
 
 
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
 
 
-	virtual void material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) override;
+	virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override;
 
 
 	_FORCE_INLINE_ uint32_t material_get_shader_id(RID p_material) {
 	_FORCE_INLINE_ uint32_t material_get_shader_id(RID p_material) {
 		Material *material = material_owner.get_or_null(p_material);
 		Material *material = material_owner.get_or_null(p_material);

+ 26 - 21
drivers/gles3/storage/mesh_storage.cpp

@@ -31,8 +31,8 @@
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 
 
 #include "mesh_storage.h"
 #include "mesh_storage.h"
-#include "../rasterizer_storage_gles3.h"
 #include "material_storage.h"
 #include "material_storage.h"
+#include "utilities.h"
 
 
 using namespace GLES3;
 using namespace GLES3;
 
 
@@ -72,7 +72,7 @@ void MeshStorage::mesh_free(RID p_rid) {
 		for (Mesh *E : mesh->shadow_owners) {
 		for (Mesh *E : mesh->shadow_owners) {
 			Mesh *shadow_owner = E;
 			Mesh *shadow_owner = E;
 			shadow_owner->shadow_mesh = RID();
 			shadow_owner->shadow_mesh = RID();
-			shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+			shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 		}
 		}
 	}
 	}
 	mesh_owner.free(p_rid);
 	mesh_owner.free(p_rid);
@@ -268,12 +268,12 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
 		_mesh_instance_add_surface(mi, mesh, mesh->surface_count - 1);
 		_mesh_instance_add_surface(mi, mesh, mesh->surface_count - 1);
 	}
 	}
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 
 
 	for (Mesh *E : mesh->shadow_owners) {
 	for (Mesh *E : mesh->shadow_owners) {
 		Mesh *shadow_owner = E;
 		Mesh *shadow_owner = E;
 		shadow_owner->shadow_mesh = RID();
 		shadow_owner->shadow_mesh = RID();
-		shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+		shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 	}
 	}
 
 
 	mesh->material_cache.clear();
 	mesh->material_cache.clear();
@@ -314,7 +314,7 @@ void MeshStorage::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_mat
 	ERR_FAIL_UNSIGNED_INDEX((uint32_t)p_surface, mesh->surface_count);
 	ERR_FAIL_UNSIGNED_INDEX((uint32_t)p_surface, mesh->surface_count);
 	mesh->surfaces[p_surface]->material = p_material;
 	mesh->surfaces[p_surface]->material = p_material;
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 	mesh->material_cache.clear();
 	mesh->material_cache.clear();
 }
 }
 
 
@@ -335,10 +335,10 @@ RS::SurfaceData MeshStorage::mesh_get_surface(RID p_mesh, int p_surface) const {
 
 
 	RS::SurfaceData sd;
 	RS::SurfaceData sd;
 	sd.format = s.format;
 	sd.format = s.format;
-	sd.vertex_data = RasterizerStorageGLES3::buffer_get_data(GL_ARRAY_BUFFER, s.vertex_buffer, s.vertex_buffer_size);
+	sd.vertex_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.vertex_buffer, s.vertex_buffer_size);
 
 
 	if (s.attribute_buffer != 0) {
 	if (s.attribute_buffer != 0) {
-		sd.attribute_data = RasterizerStorageGLES3::buffer_get_data(GL_ARRAY_BUFFER, s.attribute_buffer, s.attribute_buffer_size);
+		sd.attribute_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.attribute_buffer, s.attribute_buffer_size);
 	}
 	}
 
 
 	sd.vertex_count = s.vertex_count;
 	sd.vertex_count = s.vertex_count;
@@ -346,14 +346,14 @@ RS::SurfaceData MeshStorage::mesh_get_surface(RID p_mesh, int p_surface) const {
 	sd.primitive = s.primitive;
 	sd.primitive = s.primitive;
 
 
 	if (sd.index_count) {
 	if (sd.index_count) {
-		sd.index_data = RasterizerStorageGLES3::buffer_get_data(GL_ELEMENT_ARRAY_BUFFER, s.index_buffer, s.index_buffer_size);
+		sd.index_data = Utilities::buffer_get_data(GL_ELEMENT_ARRAY_BUFFER, s.index_buffer, s.index_buffer_size);
 	}
 	}
 
 
 	sd.aabb = s.aabb;
 	sd.aabb = s.aabb;
 	for (uint32_t i = 0; i < s.lod_count; i++) {
 	for (uint32_t i = 0; i < s.lod_count; i++) {
 		RS::SurfaceData::LOD lod;
 		RS::SurfaceData::LOD lod;
 		lod.edge_length = s.lods[i].edge_length;
 		lod.edge_length = s.lods[i].edge_length;
-		lod.index_data = RasterizerStorageGLES3::buffer_get_data(GL_ELEMENT_ARRAY_BUFFER, s.lods[i].index_buffer, s.lods[i].index_buffer_size);
+		lod.index_data = Utilities::buffer_get_data(GL_ELEMENT_ARRAY_BUFFER, s.lods[i].index_buffer, s.lods[i].index_buffer_size);
 		sd.lods.push_back(lod);
 		sd.lods.push_back(lod);
 	}
 	}
 
 
@@ -504,7 +504,7 @@ void MeshStorage::mesh_set_shadow_mesh(RID p_mesh, RID p_shadow_mesh) {
 		shadow_mesh->shadow_owners.insert(mesh);
 		shadow_mesh->shadow_owners.insert(mesh);
 	}
 	}
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 }
 }
 
 
 void MeshStorage::mesh_clear(RID p_mesh) {
 void MeshStorage::mesh_clear(RID p_mesh) {
@@ -553,12 +553,12 @@ void MeshStorage::mesh_clear(RID p_mesh) {
 		_mesh_instance_clear(mi);
 		_mesh_instance_clear(mi);
 	}
 	}
 	mesh->has_bone_weights = false;
 	mesh->has_bone_weights = false;
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 
 
 	for (Mesh *E : mesh->shadow_owners) {
 	for (Mesh *E : mesh->shadow_owners) {
 		Mesh *shadow_owner = E;
 		Mesh *shadow_owner = E;
 		shadow_owner->shadow_mesh = RID();
 		shadow_owner->shadow_mesh = RID();
-		shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+		shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 	}
 	}
 }
 }
 
 
@@ -899,7 +899,7 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS::
 		glBindBuffer(GL_ARRAY_BUFFER, 0);
 		glBindBuffer(GL_ARRAY_BUFFER, 0);
 	}
 	}
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MULTIMESH);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH);
 }
 }
 
 
 int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const {
 int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const {
@@ -926,14 +926,14 @@ void MeshStorage::multimesh_set_mesh(RID p_multimesh, RID p_mesh) {
 	} else if (multimesh->instances) {
 	} else if (multimesh->instances) {
 		// Need to re-create AABB. Unfortunately, calling this has a penalty.
 		// Need to re-create AABB. Unfortunately, calling this has a penalty.
 		if (multimesh->buffer_set) {
 		if (multimesh->buffer_set) {
-			Vector<uint8_t> buffer = RasterizerStorageGLES3::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
+			Vector<uint8_t> buffer = Utilities::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
 			const uint8_t *r = buffer.ptr();
 			const uint8_t *r = buffer.ptr();
 			const float *data = (const float *)r;
 			const float *data = (const float *)r;
 			_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
 			_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
 		}
 		}
 	}
 	}
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 }
 }
 
 
 #define MULTIMESH_DIRTY_REGION_SIZE 512
 #define MULTIMESH_DIRTY_REGION_SIZE 512
@@ -950,7 +950,7 @@ void MeshStorage::_multimesh_make_local(MultiMesh *multimesh) const {
 		float *w = multimesh->data_cache.ptrw();
 		float *w = multimesh->data_cache.ptrw();
 
 
 		if (multimesh->buffer_set) {
 		if (multimesh->buffer_set) {
-			Vector<uint8_t> buffer = RasterizerStorageGLES3::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
+			Vector<uint8_t> buffer = Utilities::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
 
 
 			{
 			{
 				const uint8_t *r = buffer.ptr();
 				const uint8_t *r = buffer.ptr();
@@ -1348,7 +1348,7 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b
 		const float *data = multimesh->data_cache.ptr();
 		const float *data = multimesh->data_cache.ptr();
 
 
 		_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
 		_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
-		multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+		multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 	}
 	}
 }
 }
 
 
@@ -1363,7 +1363,7 @@ Vector<float> MeshStorage::multimesh_get_buffer(RID p_multimesh) const {
 	} else {
 	} else {
 		// Buffer not cached, so fetch from GPU memory. This can be a stalling operation, avoid whenever possible.
 		// Buffer not cached, so fetch from GPU memory. This can be a stalling operation, avoid whenever possible.
 
 
-		Vector<uint8_t> buffer = RasterizerStorageGLES3::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
+		Vector<uint8_t> buffer = Utilities::buffer_get_data(GL_ARRAY_BUFFER, multimesh->buffer, multimesh->instances * multimesh->stride_cache * sizeof(float));
 		ret.resize(multimesh->instances * multimesh->stride_cache);
 		ret.resize(multimesh->instances * multimesh->stride_cache);
 		{
 		{
 			float *w = ret.ptrw();
 			float *w = ret.ptrw();
@@ -1439,7 +1439,7 @@ void MeshStorage::multimesh_set_visible_instances(RID p_multimesh, int p_visible
 
 
 	multimesh->visible_instances = p_visible;
 	multimesh->visible_instances = p_visible;
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES);
 }
 }
 
 
 int MeshStorage::multimesh_get_visible_instances(RID p_multimesh) const {
 int MeshStorage::multimesh_get_visible_instances(RID p_multimesh) const {
@@ -1493,7 +1493,7 @@ void MeshStorage::_update_dirty_multimeshes() {
 			if (multimesh->aabb_dirty && multimesh->mesh.is_valid()) {
 			if (multimesh->aabb_dirty && multimesh->mesh.is_valid()) {
 				_multimesh_re_create_aabb(multimesh, data, visible_instances);
 				_multimesh_re_create_aabb(multimesh, data, visible_instances);
 				multimesh->aabb_dirty = false;
 				multimesh->aabb_dirty = false;
-				multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+				multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 			}
 			}
 		}
 		}
 
 
@@ -1542,7 +1542,12 @@ Transform2D MeshStorage::skeleton_bone_get_transform_2d(RID p_skeleton, int p_bo
 	return Transform2D();
 	return Transform2D();
 }
 }
 
 
-void MeshStorage::skeleton_update_dependency(RID p_base, RendererStorage::DependencyTracker *p_instance) {
+void MeshStorage::skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) {
+}
+
+/* OCCLUDER */
+
+void MeshStorage::occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices) {
 }
 }
 
 
 #endif // GLES3_ENABLED
 #endif // GLES3_ENABLED

+ 9 - 4
drivers/gles3/storage/mesh_storage.h

@@ -37,6 +37,7 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 #include "platform_config.h"
 #include "platform_config.h"
 #ifndef OPENGL_INCLUDE_H
 #ifndef OPENGL_INCLUDE_H
@@ -126,7 +127,7 @@ struct Mesh {
 	RID shadow_mesh;
 	RID shadow_mesh;
 	HashSet<Mesh *> shadow_owners;
 	HashSet<Mesh *> shadow_owners;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* Mesh Instance */
 /* Mesh Instance */
@@ -179,7 +180,7 @@ struct MultiMesh {
 	bool dirty = false;
 	bool dirty = false;
 	MultiMesh *dirty_list = nullptr;
 	MultiMesh *dirty_list = nullptr;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 struct Skeleton {
 struct Skeleton {
@@ -194,7 +195,7 @@ struct Skeleton {
 
 
 	uint64_t version = 1;
 	uint64_t version = 1;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 class MeshStorage : public RendererMeshStorage {
 class MeshStorage : public RendererMeshStorage {
@@ -531,7 +532,11 @@ public:
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override;
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override;
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override;
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override;
 
 
-	virtual void skeleton_update_dependency(RID p_base, RendererStorage::DependencyTracker *p_instance) override;
+	virtual void skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) override;
+
+	/* OCCLUDER */
+
+	void occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices);
 };
 };
 
 
 } // namespace GLES3
 } // namespace GLES3

+ 55 - 0
drivers/gles3/storage/texture_storage.cpp

@@ -183,6 +183,12 @@ TextureStorage::TextureStorage() {
 			texture.gl_set_filter(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST);
 			texture.gl_set_filter(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST);
 		}
 		}
 	}
 	}
+
+	glBindTexture(GL_TEXTURE_2D, 0);
+
+#ifdef GLES_OVER_GL
+	glEnable(GL_PROGRAM_POINT_SIZE);
+#endif
 }
 }
 
 
 TextureStorage::~TextureStorage() {
 TextureStorage::~TextureStorage() {
@@ -244,6 +250,55 @@ void TextureStorage::canvas_texture_set_texture_repeat(RID p_canvas_texture, RS:
 	ct->texture_repeat = p_repeat;
 	ct->texture_repeat = p_repeat;
 }
 }
 
 
+/* CANVAS SHADOW */
+
+RID TextureStorage::canvas_light_shadow_buffer_create(int p_width) {
+	Config *config = Config::get_singleton();
+	CanvasLightShadow *cls = memnew(CanvasLightShadow);
+
+	if (p_width > config->max_texture_size) {
+		p_width = config->max_texture_size;
+	}
+
+	cls->size = p_width;
+	cls->height = 16;
+
+	glActiveTexture(GL_TEXTURE0);
+
+	glGenFramebuffers(1, &cls->fbo);
+	glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
+
+	glGenRenderbuffers(1, &cls->depth);
+	glBindRenderbuffer(GL_RENDERBUFFER, cls->depth);
+	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, cls->size, cls->height);
+	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, cls->depth);
+
+	glGenTextures(1, &cls->distance);
+	glBindTexture(GL_TEXTURE_2D, cls->distance);
+	if (config->use_rgba_2d_shadows) {
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, cls->size, cls->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+	} else {
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, cls->size, cls->height, 0, GL_RED, GL_FLOAT, nullptr);
+	}
+
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cls->distance, 0);
+
+	GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+	//printf("errnum: %x\n",status);
+	glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo);
+
+	if (status != GL_FRAMEBUFFER_COMPLETE) {
+		memdelete(cls);
+		ERR_FAIL_COND_V(status != GL_FRAMEBUFFER_COMPLETE, RID());
+	}
+
+	return canvas_light_shadow_owner.make_rid(cls);
+}
+
 /* Texture API */
 /* Texture API */
 
 
 Ref<Image> TextureStorage::_get_gl_image_and_format(const Ref<Image> &p_image, Image::Format p_format, Image::Format &r_real_format, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool p_force_decompress) const {
 Ref<Image> TextureStorage::_get_gl_image_and_format(const Ref<Image> &p_image, Image::Format p_format, Image::Format &r_real_format, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool p_force_decompress) const {

+ 19 - 0
drivers/gles3/storage/texture_storage.h

@@ -132,6 +132,17 @@ struct CanvasTexture {
 	bool cleared_cache = true;
 	bool cleared_cache = true;
 };
 };
 
 
+/* CANVAS SHADOW */
+
+struct CanvasLightShadow {
+	RID self;
+	int size;
+	int height;
+	GLuint fbo;
+	GLuint depth;
+	GLuint distance; //for older devices
+};
+
 struct RenderTarget;
 struct RenderTarget;
 
 
 struct Texture {
 struct Texture {
@@ -364,6 +375,10 @@ private:
 
 
 	RID_Owner<CanvasTexture, true> canvas_texture_owner;
 	RID_Owner<CanvasTexture, true> canvas_texture_owner;
 
 
+	/* CANVAS SHADOW */
+
+	RID_PtrOwner<CanvasLightShadow> canvas_light_shadow_owner;
+
 	/* Texture API */
 	/* Texture API */
 
 
 	mutable RID_Owner<Texture> texture_owner;
 	mutable RID_Owner<Texture> texture_owner;
@@ -403,6 +418,10 @@ public:
 	virtual void canvas_texture_set_texture_filter(RID p_item, RS::CanvasItemTextureFilter p_filter) override;
 	virtual void canvas_texture_set_texture_filter(RID p_item, RS::CanvasItemTextureFilter p_filter) override;
 	virtual void canvas_texture_set_texture_repeat(RID p_item, RS::CanvasItemTextureRepeat p_repeat) override;
 	virtual void canvas_texture_set_texture_repeat(RID p_item, RS::CanvasItemTextureRepeat p_repeat) override;
 
 
+	/* CANVAS SHADOW */
+
+	RID canvas_light_shadow_buffer_create(int p_width);
+
 	/* Texture API */
 	/* Texture API */
 
 
 	Texture *get_texture(RID p_rid) {
 	Texture *get_texture(RID p_rid) {

+ 353 - 0
drivers/gles3/storage/utilities.cpp

@@ -0,0 +1,353 @@
+/*************************************************************************/
+/*  utilities.cpp                                                        */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifdef GLES3_ENABLED
+
+#include "utilities.h"
+#include "config.h"
+#include "light_storage.h"
+#include "material_storage.h"
+#include "mesh_storage.h"
+#include "particles_storage.h"
+#include "texture_storage.h"
+
+using namespace GLES3;
+
+Utilities *Utilities::singleton = nullptr;
+
+Utilities::Utilities() {
+	singleton = this;
+}
+
+Utilities::~Utilities() {
+	singleton = nullptr;
+}
+
+Vector<uint8_t> Utilities::buffer_get_data(GLenum p_target, GLuint p_buffer, uint32_t p_buffer_size) {
+	Vector<uint8_t> ret;
+	ret.resize(p_buffer_size);
+	glBindBuffer(p_target, p_buffer);
+
+#if defined(__EMSCRIPTEN__)
+	{
+		uint8_t *w = ret.ptrw();
+		glGetBufferSubData(p_target, 0, p_buffer_size, w);
+	}
+#else
+	void *data = glMapBufferRange(p_target, 0, p_buffer_size, GL_MAP_READ_BIT);
+	ERR_FAIL_NULL_V(data, Vector<uint8_t>());
+	{
+		uint8_t *w = ret.ptrw();
+		memcpy(w, data, p_buffer_size);
+	}
+	glUnmapBuffer(p_target);
+#endif
+	glBindBuffer(p_target, 0);
+	return ret;
+}
+
+/* INSTANCES */
+
+RS::InstanceType Utilities::get_base_type(RID p_rid) const {
+	if (GLES3::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
+		return RS::INSTANCE_MESH;
+	} else if (GLES3::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
+		return RS::INSTANCE_MULTIMESH;
+	} else if (GLES3::LightStorage::get_singleton()->owns_light(p_rid)) {
+		return RS::INSTANCE_LIGHT;
+	}
+	return RS::INSTANCE_NONE;
+}
+
+bool Utilities::free(RID p_rid) {
+	if (GLES3::TextureStorage::get_singleton()->owns_render_target(p_rid)) {
+		GLES3::TextureStorage::get_singleton()->render_target_free(p_rid);
+		return true;
+	} else if (GLES3::TextureStorage::get_singleton()->owns_texture(p_rid)) {
+		GLES3::TextureStorage::get_singleton()->texture_free(p_rid);
+		return true;
+	} else if (GLES3::TextureStorage::get_singleton()->owns_canvas_texture(p_rid)) {
+		GLES3::TextureStorage::get_singleton()->canvas_texture_free(p_rid);
+		return true;
+	} else if (GLES3::MaterialStorage::get_singleton()->owns_shader(p_rid)) {
+		GLES3::MaterialStorage::get_singleton()->shader_free(p_rid);
+		return true;
+	} else if (GLES3::MaterialStorage::get_singleton()->owns_material(p_rid)) {
+		GLES3::MaterialStorage::get_singleton()->material_free(p_rid);
+		return true;
+	} else if (GLES3::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
+		GLES3::MeshStorage::get_singleton()->mesh_free(p_rid);
+		return true;
+	} else if (GLES3::MeshStorage::get_singleton()->owns_multimesh(p_rid)) {
+		GLES3::MeshStorage::get_singleton()->multimesh_free(p_rid);
+		return true;
+	} else if (GLES3::MeshStorage::get_singleton()->owns_mesh_instance(p_rid)) {
+		GLES3::MeshStorage::get_singleton()->mesh_instance_free(p_rid);
+		return true;
+	} else if (GLES3::LightStorage::get_singleton()->owns_light(p_rid)) {
+		GLES3::LightStorage::get_singleton()->light_free(p_rid);
+		return true;
+	} else {
+		return false;
+	}
+	/*
+	else if (reflection_probe_owner.owns(p_rid)) {
+		// delete the texture
+		ReflectionProbe *reflection_probe = reflection_probe_owner.get_or_null(p_rid);
+		reflection_probe->instance_remove_deps();
+
+		reflection_probe_owner.free(p_rid);
+		memdelete(reflection_probe);
+
+		return true;
+	} else if (lightmap_capture_data_owner.owns(p_rid)) {
+		// delete the texture
+		LightmapCapture *lightmap_capture = lightmap_capture_data_owner.get_or_null(p_rid);
+		lightmap_capture->instance_remove_deps();
+
+		lightmap_capture_data_owner.free(p_rid);
+		memdelete(lightmap_capture);
+		return true;
+
+	} else if (canvas_occluder_owner.owns(p_rid)) {
+		CanvasOccluder *co = canvas_occluder_owner.get_or_null(p_rid);
+		if (co->index_id) {
+			glDeleteBuffers(1, &co->index_id);
+		}
+		if (co->vertex_id) {
+			glDeleteBuffers(1, &co->vertex_id);
+		}
+
+		canvas_occluder_owner.free(p_rid);
+		memdelete(co);
+
+		return true;
+
+	} else if (canvas_light_shadow_owner.owns(p_rid)) {
+		CanvasLightShadow *cls = canvas_light_shadow_owner.get_or_null(p_rid);
+		glDeleteFramebuffers(1, &cls->fbo);
+		glDeleteRenderbuffers(1, &cls->depth);
+		glDeleteTextures(1, &cls->distance);
+		canvas_light_shadow_owner.free(p_rid);
+		memdelete(cls);
+
+		return true;
+	}
+	*/
+}
+
+/* DEPENDENCIES */
+
+void Utilities::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
+	if (MeshStorage::get_singleton()->owns_mesh(p_base)) {
+		Mesh *mesh = MeshStorage::get_singleton()->get_mesh(p_base);
+		p_instance->update_dependency(&mesh->dependency);
+	} else if (MeshStorage::get_singleton()->owns_multimesh(p_base)) {
+		MultiMesh *multimesh = MeshStorage::get_singleton()->get_multimesh(p_base);
+		p_instance->update_dependency(&multimesh->dependency);
+		if (multimesh->mesh.is_valid()) {
+			base_update_dependency(multimesh->mesh, p_instance);
+		}
+	} else if (LightStorage::get_singleton()->owns_light(p_base)) {
+		Light *l = LightStorage::get_singleton()->get_light(p_base);
+		p_instance->update_dependency(&l->dependency);
+	}
+}
+
+/* VISIBILITY NOTIFIER */
+
+RID Utilities::visibility_notifier_allocate() {
+	return RID();
+}
+
+void Utilities::visibility_notifier_initialize(RID p_notifier) {
+}
+
+void Utilities::visibility_notifier_free(RID p_notifier) {
+}
+
+void Utilities::visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) {
+}
+
+void Utilities::visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) {
+}
+
+AABB Utilities::visibility_notifier_get_aabb(RID p_notifier) const {
+	return AABB();
+}
+
+void Utilities::visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) {
+}
+
+/* TIMING */
+
+//void Utilities::render_info_begin_capture() {
+//	info.snap = info.render;
+//}
+
+//void Utilities::render_info_end_capture() {
+//	info.snap.object_count = info.render.object_count - info.snap.object_count;
+//	info.snap.draw_call_count = info.render.draw_call_count - info.snap.draw_call_count;
+//	info.snap.material_switch_count = info.render.material_switch_count - info.snap.material_switch_count;
+//	info.snap.surface_switch_count = info.render.surface_switch_count - info.snap.surface_switch_count;
+//	info.snap.shader_rebind_count = info.render.shader_rebind_count - info.snap.shader_rebind_count;
+//	info.snap.vertices_count = info.render.vertices_count - info.snap.vertices_count;
+//	info.snap._2d_item_count = info.render._2d_item_count - info.snap._2d_item_count;
+//	info.snap._2d_draw_call_count = info.render._2d_draw_call_count - info.snap._2d_draw_call_count;
+//}
+
+//int Utilities::get_captured_render_info(RS::RenderInfo p_info) {
+//	switch (p_info) {
+//		case RS::INFO_OBJECTS_IN_FRAME: {
+//			return info.snap.object_count;
+//		} break;
+//		case RS::INFO_VERTICES_IN_FRAME: {
+//			return info.snap.vertices_count;
+//		} break;
+//		case RS::INFO_MATERIAL_CHANGES_IN_FRAME: {
+//			return info.snap.material_switch_count;
+//		} break;
+//		case RS::INFO_SHADER_CHANGES_IN_FRAME: {
+//			return info.snap.shader_rebind_count;
+//		} break;
+//		case RS::INFO_SURFACE_CHANGES_IN_FRAME: {
+//			return info.snap.surface_switch_count;
+//		} break;
+//		case RS::INFO_DRAW_CALLS_IN_FRAME: {
+//			return info.snap.draw_call_count;
+//		} break;
+//			/*
+//		case RS::INFO_2D_ITEMS_IN_FRAME: {
+//			return info.snap._2d_item_count;
+//		} break;
+//		case RS::INFO_2D_DRAW_CALLS_IN_FRAME: {
+//			return info.snap._2d_draw_call_count;
+//		} break;
+//			*/
+//		default: {
+//			return get_render_info(p_info);
+//		}
+//	}
+//}
+
+//int Utilities::get_render_info(RS::RenderInfo p_info) {
+//	switch (p_info) {
+//		case RS::INFO_OBJECTS_IN_FRAME:
+//			return info.render_final.object_count;
+//		case RS::INFO_VERTICES_IN_FRAME:
+//			return info.render_final.vertices_count;
+//		case RS::INFO_MATERIAL_CHANGES_IN_FRAME:
+//			return info.render_final.material_switch_count;
+//		case RS::INFO_SHADER_CHANGES_IN_FRAME:
+//			return info.render_final.shader_rebind_count;
+//		case RS::INFO_SURFACE_CHANGES_IN_FRAME:
+//			return info.render_final.surface_switch_count;
+//		case RS::INFO_DRAW_CALLS_IN_FRAME:
+//			return info.render_final.draw_call_count;
+//			/*
+//		case RS::INFO_2D_ITEMS_IN_FRAME:
+//			return info.render_final._2d_item_count;
+//		case RS::INFO_2D_DRAW_CALLS_IN_FRAME:
+//			return info.render_final._2d_draw_call_count;
+//*/
+//		case RS::INFO_USAGE_VIDEO_MEM_TOTAL:
+//			return 0; //no idea
+//		case RS::INFO_VIDEO_MEM_USED:
+//			return info.vertex_mem + info.texture_mem;
+//		case RS::INFO_TEXTURE_MEM_USED:
+//			return info.texture_mem;
+//		case RS::INFO_VERTEX_MEM_USED:
+//			return info.vertex_mem;
+//		default:
+//			return 0; //no idea either
+//	}
+//}
+
+/* MISC */
+
+void Utilities::update_dirty_resources() {
+	MaterialStorage::get_singleton()->_update_global_variables();
+	MaterialStorage::get_singleton()->_update_queued_materials();
+	//MeshStorage::get_singleton()->_update_dirty_skeletons();
+	MeshStorage::get_singleton()->_update_dirty_multimeshes();
+}
+
+void Utilities::set_debug_generate_wireframes(bool p_generate) {
+}
+
+bool Utilities::has_os_feature(const String &p_feature) const {
+	Config *config = Config::get_singleton();
+	if (!config) {
+		return false;
+	}
+
+	if (p_feature == "rgtc") {
+		return config->rgtc_supported;
+	}
+
+	if (p_feature == "s3tc") {
+		return config->s3tc_supported;
+	}
+
+	if (p_feature == "bptc") {
+		return config->bptc_supported;
+	}
+
+	if (p_feature == "etc" || p_feature == "etc2") {
+		return config->etc2_supported;
+	}
+
+	return false;
+}
+
+void Utilities::update_memory_info() {
+}
+
+uint64_t Utilities::get_rendering_info(RS::RenderingInfo p_info) {
+	return 0;
+}
+
+String Utilities::get_video_adapter_name() const {
+	return (const char *)glGetString(GL_RENDERER);
+}
+
+String Utilities::get_video_adapter_vendor() const {
+	return (const char *)glGetString(GL_VENDOR);
+}
+
+RenderingDevice::DeviceType Utilities::get_video_adapter_type() const {
+	return RenderingDevice::DeviceType::DEVICE_TYPE_OTHER;
+}
+
+String Utilities::get_video_adapter_api_version() const {
+	return (const char *)glGetString(GL_VERSION);
+}
+
+#endif // GLES3_ENABLED

+ 159 - 0
drivers/gles3/storage/utilities.h

@@ -0,0 +1,159 @@
+/*************************************************************************/
+/*  utilities.h                                                          */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef UTILITIES_GLES3_H
+#define UTILITIES_GLES3_H
+
+#ifdef GLES3_ENABLED
+
+#include "servers/rendering/storage/utilities.h"
+
+#include "platform_config.h"
+#ifndef OPENGL_INCLUDE_H
+#include <GLES3/gl3.h>
+#else
+#include OPENGL_INCLUDE_H
+#endif
+
+namespace GLES3 {
+
+class Utilities : public RendererUtilities {
+private:
+	static Utilities *singleton;
+
+public:
+	static Utilities *get_singleton() { return singleton; }
+
+	Utilities();
+	~Utilities();
+
+	// Buffer size is specified in bytes
+	static Vector<uint8_t> buffer_get_data(GLenum p_target, GLuint p_buffer, uint32_t p_buffer_size);
+
+	/* INSTANCES */
+
+	virtual RS::InstanceType get_base_type(RID p_rid) const override;
+	virtual bool free(RID p_rid) override;
+
+	/* DEPENDENCIES */
+
+	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override;
+
+	/* VISIBILITY NOTIFIER */
+	virtual RID visibility_notifier_allocate() override;
+	virtual void visibility_notifier_initialize(RID p_notifier) override;
+	virtual void visibility_notifier_free(RID p_notifier) override;
+
+	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) override;
+	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) override;
+
+	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const override;
+	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) override;
+
+	/* TIMING */
+
+	struct Info {
+		uint64_t texture_mem = 0;
+		uint64_t vertex_mem = 0;
+
+		struct Render {
+			uint32_t object_count;
+			uint32_t draw_call_count;
+			uint32_t material_switch_count;
+			uint32_t surface_switch_count;
+			uint32_t shader_rebind_count;
+			uint32_t vertices_count;
+			uint32_t _2d_item_count;
+			uint32_t _2d_draw_call_count;
+
+			void reset() {
+				object_count = 0;
+				draw_call_count = 0;
+				material_switch_count = 0;
+				surface_switch_count = 0;
+				shader_rebind_count = 0;
+				vertices_count = 0;
+				_2d_item_count = 0;
+				_2d_draw_call_count = 0;
+			}
+		} render, render_final, snap;
+
+		Info() {
+			render.reset();
+			render_final.reset();
+		}
+
+	} info;
+
+	virtual void capture_timestamps_begin() override {}
+	virtual void capture_timestamp(const String &p_name) override {}
+	virtual uint32_t get_captured_timestamps_count() const override {
+		return 0;
+	}
+	virtual uint64_t get_captured_timestamps_frame() const override {
+		return 0;
+	}
+	virtual uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const override {
+		return 0;
+	}
+	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const override {
+		return 0;
+	}
+	virtual String get_captured_timestamp_name(uint32_t p_index) const override {
+		return String();
+	}
+
+	//	void render_info_begin_capture() override;
+	//	void render_info_end_capture() override;
+	//	int get_captured_render_info(RS::RenderInfo p_info) override;
+
+	//	int get_render_info(RS::RenderInfo p_info) override;
+
+	/* MISC */
+
+	virtual void update_dirty_resources() override;
+	virtual void set_debug_generate_wireframes(bool p_generate) override;
+
+	virtual bool has_os_feature(const String &p_feature) const override;
+
+	virtual void update_memory_info() override;
+
+	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) override;
+	virtual String get_video_adapter_name() const override;
+	virtual String get_video_adapter_vendor() const override;
+	virtual RenderingDevice::DeviceType get_video_adapter_type() const override;
+	virtual String get_video_adapter_api_version() const override;
+};
+
+} // namespace GLES3
+
+#endif // GLES3_ENABLED
+
+#endif // !UTILITIES_GLES3_H

+ 0 - 2
modules/openxr/extensions/openxr_vulkan_extension.cpp

@@ -34,7 +34,6 @@
 #include "../openxr_api.h"
 #include "../openxr_api.h"
 #include "../openxr_util.h"
 #include "../openxr_util.h"
 #include "servers/rendering/renderer_rd/effects/copy_effects.h"
 #include "servers/rendering/renderer_rd/effects/copy_effects.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
@@ -439,7 +438,6 @@ bool OpenXRVulkanExtension::copy_render_target_to_image(RID p_from_render_target
 	SwapchainGraphicsData *data = (SwapchainGraphicsData *)p_swapchain_graphics_data;
 	SwapchainGraphicsData *data = (SwapchainGraphicsData *)p_swapchain_graphics_data;
 	ERR_FAIL_NULL_V(data, false);
 	ERR_FAIL_NULL_V(data, false);
 	ERR_FAIL_COND_V(p_from_render_target.is_null(), false);
 	ERR_FAIL_COND_V(p_from_render_target.is_null(), false);
-	ERR_FAIL_NULL_V(RendererStorageRD::base_singleton, false);
 
 
 	RID source_image = RendererRD::TextureStorage::get_singleton()->render_target_get_rd_texture(p_from_render_target);
 	RID source_image = RendererRD::TextureStorage::get_singleton()->render_target_get_rd_texture(p_from_render_target);
 	ERR_FAIL_COND_V(source_image.is_null(), false);
 	ERR_FAIL_COND_V(source_image.is_null(), false);

+ 1 - 0
servers/rendering/SCsub

@@ -4,5 +4,6 @@ Import("env")
 
 
 env.add_source_files(env.servers_sources, "*.cpp")
 env.add_source_files(env.servers_sources, "*.cpp")
 
 
+SConscript("dummy/SCsub")
 SConscript("renderer_rd/SCsub")
 SConscript("renderer_rd/SCsub")
 SConscript("storage/SCsub")
 SConscript("storage/SCsub")

+ 7 - 0
servers/rendering/dummy/SCsub

@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+
+Import("env")
+
+env.add_source_files(env.servers_sources, "*.cpp")
+
+SConscript("storage/SCsub")

+ 55 - 0
servers/rendering/dummy/environment/fog.h

@@ -0,0 +1,55 @@
+/*************************************************************************/
+/*  fog.h                                                                */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef FOG_DUMMY_H
+#define FOG_DUMMY_H
+
+#include "servers/rendering/environment/renderer_fog.h"
+
+namespace RendererDummy {
+
+class Fog : public RendererFog {
+public:
+	/* FOG VOLUMES */
+
+	virtual RID fog_volume_allocate() override { return RID(); }
+	virtual void fog_volume_initialize(RID p_rid) override {}
+	virtual void fog_free(RID p_rid) override {}
+
+	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override {}
+	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override {}
+	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) override {}
+	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const override { return AABB(); }
+	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override { return RS::FOG_VOLUME_SHAPE_BOX; }
+};
+
+} // namespace RendererDummy
+
+#endif // !FOG_DUMMY_H

+ 6 - 3
servers/rendering/dummy/rasterizer_dummy.h

@@ -34,15 +34,16 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "scene/resources/mesh.h"
 #include "scene/resources/mesh.h"
+#include "servers/rendering/dummy/environment/fog.h"
 #include "servers/rendering/dummy/environment/gi.h"
 #include "servers/rendering/dummy/environment/gi.h"
 #include "servers/rendering/dummy/rasterizer_canvas_dummy.h"
 #include "servers/rendering/dummy/rasterizer_canvas_dummy.h"
 #include "servers/rendering/dummy/rasterizer_scene_dummy.h"
 #include "servers/rendering/dummy/rasterizer_scene_dummy.h"
-#include "servers/rendering/dummy/rasterizer_storage_dummy.h"
 #include "servers/rendering/dummy/storage/light_storage.h"
 #include "servers/rendering/dummy/storage/light_storage.h"
 #include "servers/rendering/dummy/storage/material_storage.h"
 #include "servers/rendering/dummy/storage/material_storage.h"
 #include "servers/rendering/dummy/storage/mesh_storage.h"
 #include "servers/rendering/dummy/storage/mesh_storage.h"
 #include "servers/rendering/dummy/storage/particles_storage.h"
 #include "servers/rendering/dummy/storage/particles_storage.h"
 #include "servers/rendering/dummy/storage/texture_storage.h"
 #include "servers/rendering/dummy/storage/texture_storage.h"
+#include "servers/rendering/dummy/storage/utilities.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
@@ -53,23 +54,25 @@ private:
 
 
 protected:
 protected:
 	RasterizerCanvasDummy canvas;
 	RasterizerCanvasDummy canvas;
+	RendererDummy::Utilities utilities;
 	RendererDummy::LightStorage light_storage;
 	RendererDummy::LightStorage light_storage;
 	RendererDummy::MaterialStorage material_storage;
 	RendererDummy::MaterialStorage material_storage;
 	RendererDummy::MeshStorage mesh_storage;
 	RendererDummy::MeshStorage mesh_storage;
 	RendererDummy::ParticlesStorage particles_storage;
 	RendererDummy::ParticlesStorage particles_storage;
 	RendererDummy::TextureStorage texture_storage;
 	RendererDummy::TextureStorage texture_storage;
 	RendererDummy::GI gi;
 	RendererDummy::GI gi;
-	RasterizerStorageDummy storage;
+	RendererDummy::Fog fog;
 	RasterizerSceneDummy scene;
 	RasterizerSceneDummy scene;
 
 
 public:
 public:
+	RendererUtilities *get_utilities() override { return &utilities; };
 	RendererLightStorage *get_light_storage() override { return &light_storage; };
 	RendererLightStorage *get_light_storage() override { return &light_storage; };
 	RendererMaterialStorage *get_material_storage() override { return &material_storage; };
 	RendererMaterialStorage *get_material_storage() override { return &material_storage; };
 	RendererMeshStorage *get_mesh_storage() override { return &mesh_storage; };
 	RendererMeshStorage *get_mesh_storage() override { return &mesh_storage; };
 	RendererParticlesStorage *get_particles_storage() override { return &particles_storage; };
 	RendererParticlesStorage *get_particles_storage() override { return &particles_storage; };
 	RendererTextureStorage *get_texture_storage() override { return &texture_storage; };
 	RendererTextureStorage *get_texture_storage() override { return &texture_storage; };
 	RendererGI *get_gi() override { return &gi; };
 	RendererGI *get_gi() override { return &gi; };
-	RendererStorage *get_storage() override { return &storage; }
+	RendererFog *get_fog() override { return &fog; };
 	RendererCanvasRender *get_canvas() override { return &canvas; }
 	RendererCanvasRender *get_canvas() override { return &canvas; }
 	RendererSceneRender *get_scene() override { return &scene; }
 	RendererSceneRender *get_scene() override { return &scene; }
 
 

+ 5 - 0
servers/rendering/dummy/storage/SCsub

@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import("env")
+
+env.add_source_files(env.servers_sources, "*.cpp")

+ 2 - 1
servers/rendering/dummy/storage/material_storage.h

@@ -32,6 +32,7 @@
 #define MATERIAL_STORAGE_DUMMY_H
 #define MATERIAL_STORAGE_DUMMY_H
 
 
 #include "servers/rendering/storage/material_storage.h"
 #include "servers/rendering/storage/material_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererDummy {
 namespace RendererDummy {
 
 
@@ -87,7 +88,7 @@ public:
 	virtual bool material_is_animated(RID p_material) override { return false; }
 	virtual bool material_is_animated(RID p_material) override { return false; }
 	virtual bool material_casts_shadows(RID p_material) override { return false; }
 	virtual bool material_casts_shadows(RID p_material) override { return false; }
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override {}
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override {}
-	virtual void material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) override {}
+	virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override {}
 };
 };
 
 
 } // namespace RendererDummy
 } // namespace RendererDummy

+ 6 - 1
servers/rendering/dummy/storage/mesh_storage.h

@@ -32,6 +32,7 @@
 #define MESH_STORAGE_DUMMY_H
 #define MESH_STORAGE_DUMMY_H
 
 
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererDummy {
 namespace RendererDummy {
 
 
@@ -121,7 +122,11 @@ public:
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override {}
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override {}
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override { return Transform2D(); }
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override { return Transform2D(); }
 
 
-	virtual void skeleton_update_dependency(RID p_base, RendererStorage::DependencyTracker *p_instance) override {}
+	virtual void skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
+
+	/* OCCLUDER */
+
+	void occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices) {}
 };
 };
 
 
 } // namespace RendererDummy
 } // namespace RendererDummy

+ 43 - 0
servers/rendering/dummy/storage/texture_storage.cpp

@@ -0,0 +1,43 @@
+/*************************************************************************/
+/*  texture_storage.cpp                                                  */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#include "texture_storage.h"
+
+using namespace RendererDummy;
+
+TextureStorage *TextureStorage::singleton = nullptr;
+
+TextureStorage::TextureStorage() {
+	singleton = this;
+}
+
+TextureStorage::~TextureStorage() {
+	singleton = nullptr;
+}

+ 6 - 3
servers/rendering/dummy/storage/texture_storage.h

@@ -38,6 +38,8 @@ namespace RendererDummy {
 
 
 class TextureStorage : public RendererTextureStorage {
 class TextureStorage : public RendererTextureStorage {
 private:
 private:
+	static TextureStorage *singleton;
+
 	struct DummyTexture {
 	struct DummyTexture {
 		Ref<Image> image;
 		Ref<Image> image;
 	};
 	};
@@ -45,11 +47,12 @@ private:
 
 
 public:
 public:
 	static TextureStorage *get_singleton() {
 	static TextureStorage *get_singleton() {
-		// Here we cheat until we can retire RasterizerStorageDummy::free()
-
-		return (TextureStorage *)RSG::texture_storage;
+		return singleton;
 	};
 	};
 
 
+	TextureStorage();
+	~TextureStorage();
+
 	virtual bool can_create_resources_async() const override { return false; }
 	virtual bool can_create_resources_async() const override { return false; }
 
 
 	/* Canvas Texture API */
 	/* Canvas Texture API */

+ 44 - 52
servers/rendering/dummy/rasterizer_storage_dummy.h → servers/rendering/dummy/storage/utilities.h

@@ -1,5 +1,5 @@
 /*************************************************************************/
 /*************************************************************************/
-/*  rasterizer_storage_dummy.h                                           */
+/*  utilities.h                                                          */
 /*************************************************************************/
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
 /*                           GODOT ENGINE                                */
@@ -28,79 +28,71 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-#ifndef RASTERIZER_STORAGE_DUMMY_H
-#define RASTERIZER_STORAGE_DUMMY_H
+#ifndef UTILITIES_DUMMY_H
+#define UTILITIES_DUMMY_H
 
 
-#include "servers/rendering/renderer_storage.h"
-#include "storage/texture_storage.h"
+#include "servers/rendering/storage/utilities.h"
+#include "texture_storage.h"
 
 
-class RasterizerStorageDummy : public RendererStorage {
-public:
-	void base_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
-
-	/* OCCLUDER */
+namespace RendererDummy {
 
 
-	void occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices) {}
+class Utilities : public RendererUtilities {
+public:
+	/* INSTANCES */
 
 
-	/* FOG VOLUMES */
+	virtual RS::InstanceType get_base_type(RID p_rid) const override { return RS::INSTANCE_NONE; }
+	virtual bool free(RID p_rid) override {
+		if (RendererDummy::TextureStorage::get_singleton()->owns_texture(p_rid)) {
+			RendererDummy::TextureStorage::get_singleton()->texture_free(p_rid);
+			return true;
+		}
+		return false;
+	}
 
 
-	RID fog_volume_allocate() override { return RID(); }
-	void fog_volume_initialize(RID p_rid) override {}
+	/* DEPENDENCIES */
 
 
-	void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override {}
-	void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override {}
-	void fog_volume_set_material(RID p_fog_volume, RID p_material) override {}
-	AABB fog_volume_get_aabb(RID p_fog_volume) const override { return AABB(); }
-	RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override { return RS::FOG_VOLUME_SHAPE_BOX; }
+	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override {}
 
 
 	/* VISIBILITY NOTIFIER */
 	/* VISIBILITY NOTIFIER */
+
 	virtual RID visibility_notifier_allocate() override { return RID(); }
 	virtual RID visibility_notifier_allocate() override { return RID(); }
 	virtual void visibility_notifier_initialize(RID p_notifier) override {}
 	virtual void visibility_notifier_initialize(RID p_notifier) override {}
+	virtual void visibility_notifier_free(RID p_notifier) override {}
+
 	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) override {}
 	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) override {}
 	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) override {}
 	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) override {}
 
 
 	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const override { return AABB(); }
 	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const override { return AABB(); }
 	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) override {}
 	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) override {}
 
 
-	/* STORAGE */
+	/* TIMING */
 
 
-	RS::InstanceType get_base_type(RID p_rid) const override { return RS::INSTANCE_NONE; }
-	bool free(RID p_rid) override {
-		if (RendererDummy::TextureStorage::get_singleton()->owns_texture(p_rid)) {
-			RendererDummy::TextureStorage::get_singleton()->texture_free(p_rid);
-			return true;
-		}
-		return false;
-	}
+	virtual void capture_timestamps_begin() override {}
+	virtual void capture_timestamp(const String &p_name) override {}
+	virtual uint32_t get_captured_timestamps_count() const override { return 0; }
+	virtual uint64_t get_captured_timestamps_frame() const override { return 0; }
+	virtual uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const override { return 0; }
+	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const override { return 0; }
+	virtual String get_captured_timestamp_name(uint32_t p_index) const override { return String(); }
 
 
-	virtual void update_memory_info() override {}
-	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) override { return 0; }
+	/* MISC */
+
+	virtual void update_dirty_resources() override {}
+	virtual void set_debug_generate_wireframes(bool p_generate) override {}
 
 
-	bool has_os_feature(const String &p_feature) const override {
+	virtual bool has_os_feature(const String &p_feature) const override {
 		return p_feature == "rgtc" || p_feature == "bptc" || p_feature == "s3tc" || p_feature == "etc" || p_feature == "etc2";
 		return p_feature == "rgtc" || p_feature == "bptc" || p_feature == "s3tc" || p_feature == "etc" || p_feature == "etc2";
 	}
 	}
 
 
-	void update_dirty_resources() override {}
-
-	void set_debug_generate_wireframes(bool p_generate) override {}
-
-	String get_video_adapter_name() const override { return String(); }
-	String get_video_adapter_vendor() const override { return String(); }
-	RenderingDevice::DeviceType get_video_adapter_type() const override { return RenderingDevice::DeviceType::DEVICE_TYPE_OTHER; }
-	String get_video_adapter_api_version() const override { return String(); }
-
-	static RendererStorage *base_singleton;
-
-	void capture_timestamps_begin() override {}
-	void capture_timestamp(const String &p_name) override {}
-	uint32_t get_captured_timestamps_count() const override { return 0; }
-	uint64_t get_captured_timestamps_frame() const override { return 0; }
-	uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const override { return 0; }
-	uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const override { return 0; }
-	String get_captured_timestamp_name(uint32_t p_index) const override { return String(); }
+	virtual void update_memory_info() override {}
 
 
-	RasterizerStorageDummy() {}
-	~RasterizerStorageDummy() {}
+	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) override { return 0; }
+	virtual String get_video_adapter_name() const override { return String(); }
+	virtual String get_video_adapter_vendor() const override { return String(); }
+	virtual RenderingDevice::DeviceType get_video_adapter_type() const override { return RenderingDevice::DeviceType::DEVICE_TYPE_OTHER; }
+	virtual String get_video_adapter_api_version() const override { return String(); }
 };
 };
 
 
-#endif // !RASTERIZER_STORAGE_DUMMY_H
+} // namespace RendererDummy
+
+#endif // !UTILITIES_DUMMY_H

+ 53 - 0
servers/rendering/environment/renderer_fog.h

@@ -0,0 +1,53 @@
+/*************************************************************************/
+/*  renderer_fog.h                                                       */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef RENDERER_FOG_H
+#define RENDERER_FOG_H
+
+#include "servers/rendering_server.h"
+
+class RendererFog {
+public:
+	virtual ~RendererFog() {}
+
+	/* FOG VOLUMES */
+
+	virtual RID fog_volume_allocate() = 0;
+	virtual void fog_volume_initialize(RID p_rid) = 0;
+	virtual void fog_free(RID p_rid) = 0;
+
+	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) = 0;
+	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) = 0;
+	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) = 0;
+	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const = 0;
+	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const = 0;
+};
+
+#endif // !RENDERER_FOG_H

+ 0 - 1
servers/rendering/environment/renderer_gi.h

@@ -31,7 +31,6 @@
 #ifndef RENDERER_GI_H
 #ifndef RENDERER_GI_H
 #define RENDERER_GI_H
 #define RENDERER_GI_H
 
 
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 class RendererGI {
 class RendererGI {

+ 6 - 0
servers/rendering/renderer_canvas_render.cpp

@@ -128,3 +128,9 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const {
 	rect_dirty = false;
 	rect_dirty = false;
 	return rect;
 	return rect;
 }
 }
+
+RendererCanvasRender::Item::CommandMesh::~CommandMesh() {
+	if (mesh_instance.is_valid()) {
+		RSG::mesh_storage->mesh_free(mesh_instance);
+	}
+}

+ 2 - 6
servers/rendering/renderer_canvas_render.h

@@ -31,7 +31,7 @@
 #ifndef RENDERINGSERVERCANVASRENDER_H
 #ifndef RENDERINGSERVERCANVASRENDER_H
 #define RENDERINGSERVERCANVASRENDER_H
 #define RENDERINGSERVERCANVASRENDER_H
 
 
-#include "servers/rendering/renderer_storage.h"
+#include "servers/rendering_server.h"
 
 
 class RendererCanvasRender {
 class RendererCanvasRender {
 public:
 public:
@@ -257,11 +257,7 @@ public:
 			RID texture;
 			RID texture;
 
 
 			CommandMesh() { type = TYPE_MESH; }
 			CommandMesh() { type = TYPE_MESH; }
-			~CommandMesh() {
-				if (mesh_instance.is_valid()) {
-					RendererStorage::base_singleton->free(mesh_instance);
-				}
-			}
+			~CommandMesh();
 		};
 		};
 
 
 		struct CommandMultiMesh : public Command {
 		struct CommandMultiMesh : public Command {

+ 4 - 2
servers/rendering/renderer_compositor.h

@@ -31,15 +31,16 @@
 #ifndef RENDERING_SERVER_COMPOSITOR_H
 #ifndef RENDERING_SERVER_COMPOSITOR_H
 #define RENDERING_SERVER_COMPOSITOR_H
 #define RENDERING_SERVER_COMPOSITOR_H
 
 
+#include "servers/rendering/environment/renderer_fog.h"
 #include "servers/rendering/environment/renderer_gi.h"
 #include "servers/rendering/environment/renderer_gi.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_scene.h"
 #include "servers/rendering/renderer_scene.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/storage/light_storage.h"
 #include "servers/rendering/storage/light_storage.h"
 #include "servers/rendering/storage/material_storage.h"
 #include "servers/rendering/storage/material_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/particles_storage.h"
 #include "servers/rendering/storage/particles_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
+#include "servers/rendering/storage/utilities.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 class RendererSceneRender;
 class RendererSceneRender;
@@ -77,13 +78,14 @@ protected:
 public:
 public:
 	static RendererCompositor *create();
 	static RendererCompositor *create();
 
 
+	virtual RendererUtilities *get_utilities() = 0;
 	virtual RendererLightStorage *get_light_storage() = 0;
 	virtual RendererLightStorage *get_light_storage() = 0;
 	virtual RendererMaterialStorage *get_material_storage() = 0;
 	virtual RendererMaterialStorage *get_material_storage() = 0;
 	virtual RendererMeshStorage *get_mesh_storage() = 0;
 	virtual RendererMeshStorage *get_mesh_storage() = 0;
 	virtual RendererParticlesStorage *get_particles_storage() = 0;
 	virtual RendererParticlesStorage *get_particles_storage() = 0;
 	virtual RendererTextureStorage *get_texture_storage() = 0;
 	virtual RendererTextureStorage *get_texture_storage() = 0;
 	virtual RendererGI *get_gi() = 0;
 	virtual RendererGI *get_gi() = 0;
-	virtual RendererStorage *get_storage() = 0;
+	virtual RendererFog *get_fog() = 0;
 	virtual RendererCanvasRender *get_canvas() = 0;
 	virtual RendererCanvasRender *get_canvas() = 0;
 	virtual RendererSceneRender *get_scene() = 0;
 	virtual RendererSceneRender *get_scene() = 0;
 
 

+ 1 - 1
servers/rendering/renderer_rd/cluster_builder_rd.cpp

@@ -413,7 +413,7 @@ void ClusterBuilderRD::bake_cluster() {
 
 
 			StateUniform state;
 			StateUniform state;
 
 
-			RendererStorageRD::store_camera(adjusted_projection, state.projection);
+			RendererRD::MaterialStorage::store_camera(adjusted_projection, state.projection);
 			state.inv_z_far = 1.0 / z_far;
 			state.inv_z_far = 1.0 / z_far;
 			state.screen_to_clusters_shift = get_shift_from_power_of_2(cluster_size);
 			state.screen_to_clusters_shift = get_shift_from_power_of_2(cluster_size);
 			state.screen_to_clusters_shift -= divisor; //screen is smaller, shift one less
 			state.screen_to_clusters_shift -= divisor; //screen is smaller, shift one less

+ 4 - 4
servers/rendering/renderer_rd/cluster_builder_rd.h

@@ -31,10 +31,10 @@
 #ifndef CLUSTER_BUILDER_RD_H
 #ifndef CLUSTER_BUILDER_RD_H
 #define CLUSTER_BUILDER_RD_H
 #define CLUSTER_BUILDER_RD_H
 
 
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_debug.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_debug.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_render.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_render.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_store.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/cluster_store.glsl.gen.h"
+#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 
 
 class ClusterBuilderSharedDataRD {
 class ClusterBuilderSharedDataRD {
 	friend class ClusterBuilderRD;
 	friend class ClusterBuilderRD;
@@ -261,7 +261,7 @@ public:
 			e.type = ELEMENT_TYPE_OMNI_LIGHT;
 			e.type = ELEMENT_TYPE_OMNI_LIGHT;
 			e.original_index = cluster_count_by_type[ELEMENT_TYPE_OMNI_LIGHT];
 			e.original_index = cluster_count_by_type[ELEMENT_TYPE_OMNI_LIGHT];
 
 
-			RendererStorageRD::store_transform_transposed_3x4(xform, e.transform_inv);
+			RendererRD::MaterialStorage::store_transform_transposed_3x4(xform, e.transform_inv);
 
 
 			cluster_count_by_type[ELEMENT_TYPE_OMNI_LIGHT]++;
 			cluster_count_by_type[ELEMENT_TYPE_OMNI_LIGHT]++;
 
 
@@ -309,7 +309,7 @@ public:
 			e.type = ELEMENT_TYPE_SPOT_LIGHT;
 			e.type = ELEMENT_TYPE_SPOT_LIGHT;
 			e.original_index = cluster_count_by_type[ELEMENT_TYPE_SPOT_LIGHT]; //use omni since they share index
 			e.original_index = cluster_count_by_type[ELEMENT_TYPE_SPOT_LIGHT]; //use omni since they share index
 
 
-			RendererStorageRD::store_transform_transposed_3x4(xform, e.transform_inv);
+			RendererRD::MaterialStorage::store_transform_transposed_3x4(xform, e.transform_inv);
 
 
 			cluster_count_by_type[ELEMENT_TYPE_SPOT_LIGHT]++;
 			cluster_count_by_type[ELEMENT_TYPE_SPOT_LIGHT]++;
 		}
 		}
@@ -356,7 +356,7 @@ public:
 		e.type = (p_box_type == BOX_TYPE_DECAL) ? ELEMENT_TYPE_DECAL : ELEMENT_TYPE_REFLECTION_PROBE;
 		e.type = (p_box_type == BOX_TYPE_DECAL) ? ELEMENT_TYPE_DECAL : ELEMENT_TYPE_REFLECTION_PROBE;
 		e.original_index = cluster_count_by_type[e.type];
 		e.original_index = cluster_count_by_type[e.type];
 
 
-		RendererStorageRD::store_transform_transposed_3x4(xform, e.transform_inv);
+		RendererRD::MaterialStorage::store_transform_transposed_3x4(xform, e.transform_inv);
 
 
 		cluster_count_by_type[e.type]++;
 		cluster_count_by_type[e.type]++;
 		render_element_count++;
 		render_element_count++;

+ 128 - 0
servers/rendering/renderer_rd/environment/fog.cpp

@@ -0,0 +1,128 @@
+/*************************************************************************/
+/*  fog.cpp                                                              */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#include "fog.h"
+
+using namespace RendererRD;
+
+Fog *Fog::singleton = nullptr;
+
+Fog::Fog() {
+	singleton = this;
+}
+
+Fog::~Fog() {
+	singleton = nullptr;
+}
+
+/* FOG VOLUMES */
+
+RID Fog::fog_volume_allocate() {
+	return fog_volume_owner.allocate_rid();
+}
+
+void Fog::fog_volume_initialize(RID p_rid) {
+	fog_volume_owner.initialize_rid(p_rid, FogVolume());
+}
+
+void Fog::fog_free(RID p_rid) {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_rid);
+	fog_volume->dependency.deleted_notify(p_rid);
+	fog_volume_owner.free(p_rid);
+}
+
+void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND(!fog_volume);
+
+	if (p_shape == fog_volume->shape) {
+		return;
+	}
+
+	fog_volume->shape = p_shape;
+	fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
+}
+
+void Fog::fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND(!fog_volume);
+
+	fog_volume->extents = p_extents;
+	fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
+}
+
+void Fog::fog_volume_set_material(RID p_fog_volume, RID p_material) {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND(!fog_volume);
+	fog_volume->material = p_material;
+}
+
+RID Fog::fog_volume_get_material(RID p_fog_volume) const {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND_V(!fog_volume, RID());
+
+	return fog_volume->material;
+}
+
+RS::FogVolumeShape Fog::fog_volume_get_shape(RID p_fog_volume) const {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND_V(!fog_volume, RS::FOG_VOLUME_SHAPE_BOX);
+
+	return fog_volume->shape;
+}
+
+AABB Fog::fog_volume_get_aabb(RID p_fog_volume) const {
+	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND_V(!fog_volume, AABB());
+
+	switch (fog_volume->shape) {
+		case RS::FOG_VOLUME_SHAPE_ELLIPSOID:
+		case RS::FOG_VOLUME_SHAPE_CONE:
+		case RS::FOG_VOLUME_SHAPE_CYLINDER:
+		case RS::FOG_VOLUME_SHAPE_BOX: {
+			AABB aabb;
+			aabb.position = -fog_volume->extents;
+			aabb.size = fog_volume->extents * 2;
+			return aabb;
+		}
+		default: {
+			// Need some size otherwise will get culled
+			return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2));
+		}
+	}
+
+	return AABB();
+}
+
+Vector3 Fog::fog_volume_get_extents(RID p_fog_volume) const {
+	const FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
+	ERR_FAIL_COND_V(!fog_volume, Vector3());
+	return fog_volume->extents;
+}

+ 83 - 0
servers/rendering/renderer_rd/environment/fog.h

@@ -0,0 +1,83 @@
+/*************************************************************************/
+/*  fog.h                                                                */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef FOG_RD_H
+#define FOG_RD_H
+
+#include "core/templates/local_vector.h"
+#include "core/templates/rid_owner.h"
+#include "servers/rendering/environment/renderer_fog.h"
+#include "servers/rendering/storage/utilities.h"
+
+namespace RendererRD {
+
+class Fog : public RendererFog {
+public:
+	struct FogVolume {
+		RID material;
+		Vector3 extents = Vector3(1, 1, 1);
+
+		RS::FogVolumeShape shape = RS::FOG_VOLUME_SHAPE_BOX;
+
+		Dependency dependency;
+	};
+
+private:
+	static Fog *singleton;
+
+	mutable RID_Owner<FogVolume, true> fog_volume_owner;
+
+public:
+	static Fog *get_singleton() { return singleton; }
+
+	Fog();
+	~Fog();
+
+	/* FOG VOLUMES */
+
+	FogVolume *get_fog_volume(RID p_rid) { return fog_volume_owner.get_or_null(p_rid); };
+	bool owns_fog_volume(RID p_rid) { return fog_volume_owner.owns(p_rid); };
+
+	virtual RID fog_volume_allocate() override;
+	virtual void fog_volume_initialize(RID p_rid) override;
+	virtual void fog_free(RID p_rid) override;
+
+	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override;
+	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override;
+	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) override;
+	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override;
+	RID fog_volume_get_material(RID p_fog_volume) const;
+	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const override;
+	Vector3 fog_volume_get_extents(RID p_fog_volume) const;
+};
+
+} // namespace RendererRD
+
+#endif // !FOG_RD_H

+ 6 - 11
servers/rendering/renderer_rd/environment/gi.cpp

@@ -33,7 +33,6 @@
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
 #include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
 #include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
@@ -184,7 +183,7 @@ void GI::voxel_gi_allocate_data(RID p_voxel_gi, const Transform3D &p_to_cell_xfo
 	voxel_gi->version++;
 	voxel_gi->version++;
 	voxel_gi->data_version++;
 	voxel_gi->data_version++;
 
 
-	voxel_gi->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	voxel_gi->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 AABB GI::voxel_gi_get_bounds(RID p_voxel_gi) const {
 AABB GI::voxel_gi_get_bounds(RID p_voxel_gi) const {
@@ -390,7 +389,6 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 
 
-	storage = p_gi->storage;
 	gi = p_gi;
 	gi = p_gi;
 	num_cascades = p_env->sdfgi_cascades;
 	num_cascades = p_env->sdfgi_cascades;
 	min_cell_size = p_env->sdfgi_min_cell_size;
 	min_cell_size = p_env->sdfgi_min_cell_size;
@@ -1287,7 +1285,7 @@ void GI::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, RendererSceneSk
 
 
 		if (p_env->background == RS::ENV_BG_CLEAR_COLOR) {
 		if (p_env->background == RS::ENV_BG_CLEAR_COLOR) {
 			push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR;
 			push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR;
-			Color c = storage->get_default_clear_color().srgb_to_linear();
+			Color c = RSG::texture_storage->get_default_clear_color().srgb_to_linear();
 			push_constant.sky_color[0] = c.r;
 			push_constant.sky_color[0] = c.r;
 			push_constant.sky_color[1] = c.g;
 			push_constant.sky_color[1] = c.g;
 			push_constant.sky_color[2] = c.b;
 			push_constant.sky_color[2] = c.b;
@@ -1636,7 +1634,7 @@ void GI::SDFGI::debug_probes(RID p_framebuffer, const uint32_t p_view_count, con
 		}
 		}
 
 
 		for (uint32_t v = 0; v < p_view_count; v++) {
 		for (uint32_t v = 0; v < p_view_count; v++) {
-			RendererStorageRD::store_camera(p_camera_with_transforms[v], scene_data.projection[v]);
+			RendererRD::MaterialStorage::store_camera(p_camera_with_transforms[v], scene_data.projection[v]);
 		}
 		}
 
 
 		RD::get_singleton()->buffer_update(debug_probes_scene_data_ubo, 0, sizeof(SDFGIShader::DebugProbesSceneData), &scene_data, RD::BARRIER_MASK_RASTER);
 		RD::get_singleton()->buffer_update(debug_probes_scene_data_ubo, 0, sizeof(SDFGIShader::DebugProbesSceneData), &scene_data, RD::BARRIER_MASK_RASTER);
@@ -3218,12 +3216,10 @@ GI::~GI() {
 	singleton = nullptr;
 	singleton = nullptr;
 }
 }
 
 
-void GI::init(RendererStorageRD *p_storage, RendererSceneSkyRD *p_sky) {
+void GI::init(RendererSceneSkyRD *p_sky) {
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 
 
-	storage = p_storage;
-
 	/* GI */
 	/* GI */
 
 
 	{
 	{
@@ -3681,7 +3677,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
 		}
 		}
 
 
 		for (uint32_t v = 0; v < p_view_count; v++) {
 		for (uint32_t v = 0; v < p_view_count; v++) {
-			RendererStorageRD::store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]);
+			RendererRD::MaterialStorage::store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]);
 			scene_data.eye_offset[v][0] = p_eye_offsets[v].x;
 			scene_data.eye_offset[v][0] = p_eye_offsets[v].x;
 			scene_data.eye_offset[v][1] = p_eye_offsets[v].y;
 			scene_data.eye_offset[v][1] = p_eye_offsets[v].y;
 			scene_data.eye_offset[v][2] = p_eye_offsets[v].z;
 			scene_data.eye_offset[v][2] = p_eye_offsets[v].z;
@@ -3689,7 +3685,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
 		}
 		}
 
 
 		// Note that we will be ignoring the origin of this transform.
 		// Note that we will be ignoring the origin of this transform.
-		RendererStorageRD::store_transform(p_cam_transform, scene_data.cam_transform);
+		RendererRD::MaterialStorage::store_transform(p_cam_transform, scene_data.cam_transform);
 
 
 		scene_data.screen_size[0] = rb->internal_width;
 		scene_data.screen_size[0] = rb->internal_width;
 		scene_data.screen_size[1] = rb->internal_height;
 		scene_data.screen_size[1] = rb->internal_height;
@@ -3923,7 +3919,6 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
 RID GI::voxel_gi_instance_create(RID p_base) {
 RID GI::voxel_gi_instance_create(RID p_base) {
 	VoxelGIInstance voxel_gi;
 	VoxelGIInstance voxel_gi;
 	voxel_gi.gi = this;
 	voxel_gi.gi = this;
-	voxel_gi.storage = storage;
 	voxel_gi.probe = p_base;
 	voxel_gi.probe = p_base;
 	RID rid = voxel_gi_instance_owner.make_rid(voxel_gi);
 	RID rid = voxel_gi_instance_owner.make_rid(voxel_gi);
 	return rid;
 	return rid;

+ 3 - 7
servers/rendering/renderer_rd/environment/gi.h

@@ -37,7 +37,6 @@
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/environment/gi.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/gi.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug_probes.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug_probes.glsl.gen.h"
@@ -47,8 +46,8 @@
 #include "servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/voxel_gi_debug.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/environment/voxel_gi_debug.glsl.gen.h"
 #include "servers/rendering/renderer_scene_render.h"
 #include "servers/rendering/renderer_scene_render.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/rendering_device.h"
 #include "servers/rendering/rendering_device.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 // Forward declare RenderDataRD and RendererSceneRenderRD so we can pass it into some of our methods, these classes are pretty tightly bound
 // Forward declare RenderDataRD and RendererSceneRenderRD so we can pass it into some of our methods, these classes are pretty tightly bound
 struct RenderDataRD;
 struct RenderDataRD;
@@ -89,11 +88,10 @@ public:
 		uint32_t version = 1;
 		uint32_t version = 1;
 		uint32_t data_version = 1;
 		uint32_t data_version = 1;
 
 
-		RendererStorage::Dependency dependency;
+		Dependency dependency;
 	};
 	};
 
 
 private:
 private:
-	RendererStorageRD *storage = nullptr;
 	static GI *singleton;
 	static GI *singleton;
 
 
 	/* VOXEL GI STORAGE */
 	/* VOXEL GI STORAGE */
@@ -435,7 +433,6 @@ public:
 
 
 	struct VoxelGIInstance {
 	struct VoxelGIInstance {
 		// access to our containers
 		// access to our containers
-		RendererStorageRD *storage = nullptr;
 		GI *gi = nullptr;
 		GI *gi = nullptr;
 
 
 		RID probe;
 		RID probe;
@@ -559,7 +556,6 @@ public:
 		};
 		};
 
 
 		// access to our containers
 		// access to our containers
-		RendererStorageRD *storage = nullptr;
 		GI *gi = nullptr;
 		GI *gi = nullptr;
 
 
 		// used for rendering (voxelization)
 		// used for rendering (voxelization)
@@ -780,7 +776,7 @@ public:
 	GI();
 	GI();
 	~GI();
 	~GI();
 
 
-	void init(RendererStorageRD *p_storage, RendererSceneSkyRD *p_sky);
+	void init(RendererSceneSkyRD *p_sky);
 	void free();
 	void free();
 
 
 	SDFGI *create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size);
 	SDFGI *create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size);

+ 37 - 37
servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp

@@ -30,6 +30,7 @@
 
 
 #include "render_forward_clustered.h"
 #include "render_forward_clustered.h"
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
+#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
 #include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
@@ -812,15 +813,15 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 
 
 	//store camera into ubo
 	//store camera into ubo
-	RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix);
-	RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
-	RendererStorageRD::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
-	RendererStorageRD::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix);
+	RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix);
+	RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
+	RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
+	RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix);
 
 
 	for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 	for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 		projection = correction * p_render_data->view_projection[v];
 		projection = correction * p_render_data->view_projection[v];
-		RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
-		RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
+		RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
+		RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
 
 
 		scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
 		scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
 		scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
 		scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
@@ -836,10 +837,10 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
 
 
 	scene_state.ubo.pancake_shadows = p_pancake_shadows;
 	scene_state.ubo.pancake_shadows = p_pancake_shadows;
 
 
-	RendererStorageRD::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel);
 
 
 	Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size);
 	Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size);
 	scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x;
 	scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x;
@@ -934,7 +935,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
 
 
 			Basis sky_transform = environment_get_sky_orientation(p_render_data->environment);
 			Basis sky_transform = environment_get_sky_orientation(p_render_data->environment);
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
-			RendererStorageRD::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
+			RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
 
 
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
@@ -1005,15 +1006,15 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
 			CameraMatrix prev_projection = prev_correction * p_render_data->prev_cam_projection;
 			CameraMatrix prev_projection = prev_correction * p_render_data->prev_cam_projection;
 
 
 			//store camera into ubo
 			//store camera into ubo
-			RendererStorageRD::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix);
-			RendererStorageRD::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix);
-			RendererStorageRD::store_transform(p_render_data->prev_cam_transform, scene_state.prev_ubo.inv_view_matrix);
-			RendererStorageRD::store_transform(p_render_data->prev_cam_transform.affine_inverse(), scene_state.prev_ubo.view_matrix);
+			RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix);
+			RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix);
+			RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform, scene_state.prev_ubo.inv_view_matrix);
+			RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform.affine_inverse(), scene_state.prev_ubo.view_matrix);
 
 
 			for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 			for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 				prev_projection = prev_correction * p_render_data->view_projection[v];
 				prev_projection = prev_correction * p_render_data->view_projection[v];
-				RendererStorageRD::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix_view[v]);
-				RendererStorageRD::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix_view[v]);
+				RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix_view[v]);
+				RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix_view[v]);
 			}
 			}
 			scene_state.prev_ubo.taa_jitter[0] = p_render_data->prev_taa_jitter.x;
 			scene_state.prev_ubo.taa_jitter[0] = p_render_data->prev_taa_jitter.x;
 			scene_state.prev_ubo.taa_jitter[1] = p_render_data->prev_taa_jitter.y;
 			scene_state.prev_ubo.taa_jitter[1] = p_render_data->prev_taa_jitter.y;
@@ -1069,11 +1070,11 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
 		}
 		}
 
 
 		if (inst->store_transform_cache) {
 		if (inst->store_transform_cache) {
-			RendererStorageRD::store_transform(inst->transform, instance_data.transform);
-			RendererStorageRD::store_transform(inst->prev_transform, instance_data.prev_transform);
+			RendererRD::MaterialStorage::store_transform(inst->transform, instance_data.transform);
+			RendererRD::MaterialStorage::store_transform(inst->prev_transform, instance_data.prev_transform);
 		} else {
 		} else {
-			RendererStorageRD::store_transform(Transform3D(), instance_data.transform);
-			RendererStorageRD::store_transform(Transform3D(), instance_data.prev_transform);
+			RendererRD::MaterialStorage::store_transform(Transform3D(), instance_data.transform);
+			RendererRD::MaterialStorage::store_transform(Transform3D(), instance_data.prev_transform);
 		}
 		}
 
 
 		instance_data.flags = inst->flags_cache;
 		instance_data.flags = inst->flags_cache;
@@ -1397,7 +1398,7 @@ void RenderForwardClustered::_setup_lightmaps(const PagedArray<RID> &p_lightmaps
 
 
 		Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis;
 		Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis;
 		to_lm = to_lm.inverse().transposed(); //will transform normals
 		to_lm = to_lm.inverse().transposed(); //will transform normals
-		RendererStorageRD::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform);
+		RendererRD::MaterialStorage::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform);
 		scene_state.lightmap_ids[i] = p_lightmaps[i];
 		scene_state.lightmap_ids[i] = p_lightmaps[i];
 		scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap);
 		scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap);
 
 
@@ -1798,7 +1799,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
 		} else {
 		} else {
 			//just mix specular back
 			//just mix specular back
 			RENDER_TIMESTAMP("Merge Specular");
 			RENDER_TIMESTAMP("Merge Specular");
-			storage->get_effects()->merge_specular(color_only_framebuffer, render_buffer->specular, render_buffer->msaa == RS::VIEWPORT_MSAA_DISABLED ? RID() : render_buffer->color, RID());
+			RendererCompositorRD::singleton->get_effects()->merge_specular(color_only_framebuffer, render_buffer->specular, render_buffer->msaa == RS::VIEWPORT_MSAA_DISABLED ? RID() : render_buffer->color, RID());
 		}
 		}
 	}
 	}
 
 
@@ -2189,7 +2190,7 @@ void RenderForwardClustered::_render_sdfgi(RID p_render_buffers, const Vector3i
 		to_bounds.origin = p_bounds.position;
 		to_bounds.origin = p_bounds.position;
 		to_bounds.basis.scale(p_bounds.size);
 		to_bounds.basis.scale(p_bounds.size);
 
 
-		RendererStorageRD::store_transform(to_bounds.affine_inverse() * render_data.cam_transform, scene_state.ubo.sdf_to_bounds);
+		RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * render_data.cam_transform, scene_state.ubo.sdf_to_bounds);
 
 
 		_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
 		_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
 
 
@@ -2888,7 +2889,7 @@ void RenderForwardClustered::_geometry_instance_add_surface_with_material(Geomet
 	sdcache->surface_index = p_surface;
 	sdcache->surface_index = p_surface;
 
 
 	if (ginstance->data->dirty_dependencies) {
 	if (ginstance->data->dirty_dependencies) {
-		storage->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
+		RSG::utilities->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
 	}
 	}
 
 
 	//shadow
 	//shadow
@@ -3131,16 +3132,16 @@ void RenderForwardClustered::_update_dirty_geometry_instances() {
 	}
 	}
 }
 }
 
 
-void RenderForwardClustered::_geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker) {
+void RenderForwardClustered::_geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker) {
 	switch (p_notification) {
 	switch (p_notification) {
-		case RendererStorage::DEPENDENCY_CHANGED_MATERIAL:
-		case RendererStorage::DEPENDENCY_CHANGED_MESH:
-		case RendererStorage::DEPENDENCY_CHANGED_PARTICLES:
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH:
-		case RendererStorage::DEPENDENCY_CHANGED_SKELETON_DATA: {
+		case Dependency::DEPENDENCY_CHANGED_MATERIAL:
+		case Dependency::DEPENDENCY_CHANGED_MESH:
+		case Dependency::DEPENDENCY_CHANGED_PARTICLES:
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH:
+		case Dependency::DEPENDENCY_CHANGED_SKELETON_DATA: {
 			static_cast<RenderForwardClustered *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 			static_cast<RenderForwardClustered *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 		} break;
 		} break;
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
 			GeometryInstanceForwardClustered *ginstance = static_cast<GeometryInstanceForwardClustered *>(p_tracker->userdata);
 			GeometryInstanceForwardClustered *ginstance = static_cast<GeometryInstanceForwardClustered *>(p_tracker->userdata);
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 				ginstance->instance_count = RendererRD::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
 				ginstance->instance_count = RendererRD::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
@@ -3151,12 +3152,12 @@ void RenderForwardClustered::_geometry_instance_dependency_changed(RendererStora
 		} break;
 		} break;
 	}
 	}
 }
 }
-void RenderForwardClustered::_geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker) {
+void RenderForwardClustered::_geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker) {
 	static_cast<RenderForwardClustered *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 	static_cast<RenderForwardClustered *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 }
 }
 
 
 RendererSceneRender::GeometryInstance *RenderForwardClustered::geometry_instance_create(RID p_base) {
 RendererSceneRender::GeometryInstance *RenderForwardClustered::geometry_instance_create(RID p_base) {
-	RS::InstanceType type = storage->get_base_type(p_base);
+	RS::InstanceType type = RSG::utilities->get_base_type(p_base);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 
 
 	GeometryInstanceForwardClustered *ginstance = geometry_instance_alloc.alloc();
 	GeometryInstanceForwardClustered *ginstance = geometry_instance_alloc.alloc();
@@ -3420,8 +3421,7 @@ void RenderForwardClustered::_update_shader_quality_settings() {
 	_base_uniforms_changed(); //also need this
 	_base_uniforms_changed(); //also need this
 }
 }
 
 
-RenderForwardClustered::RenderForwardClustered(RendererStorageRD *p_storage) :
-		RendererSceneRenderRD(p_storage) {
+RenderForwardClustered::RenderForwardClustered() {
 	singleton = this;
 	singleton = this;
 
 
 	/* SCENE SHADER */
 	/* SCENE SHADER */
@@ -3453,7 +3453,7 @@ RenderForwardClustered::RenderForwardClustered(RendererStorageRD *p_storage) :
 			defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
 			defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
 		}
 		}
 
 
-		scene_shader.init(p_storage, defines);
+		scene_shader.init(defines);
 	}
 	}
 
 
 	render_list_thread_threshold = GLOBAL_GET("rendering/limits/forward_renderer/threaded_render_minimum_instances");
 	render_list_thread_threshold = GLOBAL_GET("rendering/limits/forward_renderer/threaded_render_minimum_instances");

+ 5 - 5
servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h

@@ -36,8 +36,8 @@
 #include "servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h"
 #include "servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h"
+#include "servers/rendering/renderer_rd/storage_rd/utilities.h"
 
 
 namespace RendererSceneRenderImplementation {
 namespace RendererSceneRenderImplementation {
 
 
@@ -541,7 +541,7 @@ class RenderForwardClustered : public RendererSceneRenderRD {
 			bool mirror = false;
 			bool mirror = false;
 			bool dirty_dependencies = false;
 			bool dirty_dependencies = false;
 
 
-			RendererStorage::DependencyTracker dependency_tracker;
+			DependencyTracker dependency_tracker;
 		};
 		};
 
 
 		Data *data = nullptr;
 		Data *data = nullptr;
@@ -550,8 +550,8 @@ class RenderForwardClustered : public RendererSceneRenderRD {
 				dirty_list_element(this) {}
 				dirty_list_element(this) {}
 	};
 	};
 
 
-	static void _geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker);
-	static void _geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker);
 
 
 	SelfList<GeometryInstanceForwardClustered>::List geometry_instance_dirty_list;
 	SelfList<GeometryInstanceForwardClustered>::List geometry_instance_dirty_list;
 
 
@@ -683,7 +683,7 @@ public:
 
 
 	virtual bool free(RID p_rid) override;
 	virtual bool free(RID p_rid) override;
 
 
-	RenderForwardClustered(RendererStorageRD *p_storage);
+	RenderForwardClustered();
 	~RenderForwardClustered();
 	~RenderForwardClustered();
 };
 };
 } // namespace RendererSceneRenderImplementation
 } // namespace RendererSceneRenderImplementation

+ 1 - 2
servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp

@@ -520,9 +520,8 @@ SceneShaderForwardClustered::~SceneShaderForwardClustered() {
 	material_storage->material_free(default_material);
 	material_storage->material_free(default_material);
 }
 }
 
 
-void SceneShaderForwardClustered::init(RendererStorageRD *p_storage, const String p_defines) {
+void SceneShaderForwardClustered::init(const String p_defines) {
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
-	storage = p_storage;
 
 
 	{
 	{
 		Vector<String> shader_versions;
 		Vector<String> shader_versions;

+ 1 - 4
servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h

@@ -32,7 +32,6 @@
 #define RSSR_SCENE_SHADER_FC_H
 #define RSSR_SCENE_SHADER_FC_H
 
 
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h"
 
 
 namespace RendererSceneRenderImplementation {
 namespace RendererSceneRenderImplementation {
@@ -42,8 +41,6 @@ private:
 	static SceneShaderForwardClustered *singleton;
 	static SceneShaderForwardClustered *singleton;
 
 
 public:
 public:
-	RendererStorageRD *storage = nullptr;
-
 	enum ShaderVersion {
 	enum ShaderVersion {
 		SHADER_VERSION_DEPTH_PASS,
 		SHADER_VERSION_DEPTH_PASS,
 		SHADER_VERSION_DEPTH_PASS_DP,
 		SHADER_VERSION_DEPTH_PASS_DP,
@@ -249,7 +246,7 @@ public:
 	SceneShaderForwardClustered();
 	SceneShaderForwardClustered();
 	~SceneShaderForwardClustered();
 	~SceneShaderForwardClustered();
 
 
-	void init(RendererStorageRD *p_storage, const String p_defines);
+	void init(const String p_defines);
 	void set_default_specialization_constants(const Vector<RD::PipelineSpecializationConstant> &p_constants);
 	void set_default_specialization_constants(const Vector<RD::PipelineSpecializationConstant> &p_constants);
 };
 };
 
 

+ 26 - 27
servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

@@ -465,7 +465,7 @@ void RenderForwardMobile::_setup_lightmaps(const PagedArray<RID> &p_lightmaps, c
 
 
 		Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis;
 		Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis;
 		to_lm = to_lm.inverse().transposed(); //will transform normals
 		to_lm = to_lm.inverse().transposed(); //will transform normals
-		RendererStorageRD::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform);
+		RendererRD::MaterialStorage::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform);
 		scene_state.lightmap_ids[i] = p_lightmaps[i];
 		scene_state.lightmap_ids[i] = p_lightmaps[i];
 		scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap);
 		scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap);
 
 
@@ -1534,15 +1534,15 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 	CameraMatrix projection = correction * p_render_data->cam_projection;
 
 
 	//store camera into ubo
 	//store camera into ubo
-	RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix);
-	RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
-	RendererStorageRD::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
-	RendererStorageRD::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix);
+	RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix);
+	RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
+	RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix);
+	RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix);
 
 
 	for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 	for (uint32_t v = 0; v < p_render_data->view_count; v++) {
 		projection = correction * p_render_data->view_projection[v];
 		projection = correction * p_render_data->view_projection[v];
-		RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
-		RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
+		RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
+		RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
 
 
 		scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
 		scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
 		scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
 		scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
@@ -1555,10 +1555,10 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
 
 
 	scene_state.ubo.pancake_shadows = p_pancake_shadows;
 	scene_state.ubo.pancake_shadows = p_pancake_shadows;
 
 
-	RendererStorageRD::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel);
-	RendererStorageRD::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel);
+	RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel);
 
 
 	Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size);
 	Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size);
 	scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x;
 	scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x;
@@ -1648,7 +1648,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
 
 
 			Basis sky_transform = environment_get_sky_orientation(p_render_data->environment);
 			Basis sky_transform = environment_get_sky_orientation(p_render_data->environment);
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
 			sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
-			RendererStorageRD::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
+			RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
 
 
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
 			scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR;
@@ -1866,9 +1866,9 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
 		GeometryInstanceForwardMobile::PushConstant push_constant;
 		GeometryInstanceForwardMobile::PushConstant push_constant;
 
 
 		if (inst->store_transform_cache) {
 		if (inst->store_transform_cache) {
-			RendererStorageRD::store_transform(inst->transform, push_constant.transform);
+			RendererRD::MaterialStorage::store_transform(inst->transform, push_constant.transform);
 		} else {
 		} else {
-			RendererStorageRD::store_transform(Transform3D(), push_constant.transform);
+			RendererRD::MaterialStorage::store_transform(Transform3D(), push_constant.transform);
 		}
 		}
 
 
 		push_constant.flags = inst->flags_cache;
 		push_constant.flags = inst->flags_cache;
@@ -2032,7 +2032,7 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
 /* Geometry instance */
 /* Geometry instance */
 
 
 RendererSceneRender::GeometryInstance *RenderForwardMobile::geometry_instance_create(RID p_base) {
 RendererSceneRender::GeometryInstance *RenderForwardMobile::geometry_instance_create(RID p_base) {
-	RS::InstanceType type = storage->get_base_type(p_base);
+	RS::InstanceType type = RSG::utilities->get_base_type(p_base);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 	ERR_FAIL_COND_V(!((1 << type) & RS::INSTANCE_GEOMETRY_MASK), nullptr);
 
 
 	GeometryInstanceForwardMobile *ginstance = geometry_instance_alloc.alloc();
 	GeometryInstanceForwardMobile *ginstance = geometry_instance_alloc.alloc();
@@ -2373,7 +2373,7 @@ void RenderForwardMobile::_geometry_instance_add_surface_with_material(GeometryI
 	sdcache->surface_index = p_surface;
 	sdcache->surface_index = p_surface;
 
 
 	if (ginstance->data->dirty_dependencies) {
 	if (ginstance->data->dirty_dependencies) {
-		storage->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
+		RSG::utilities->base_update_dependency(p_mesh, &ginstance->data->dependency_tracker);
 	}
 	}
 
 
 	//shadow
 	//shadow
@@ -2609,16 +2609,16 @@ void RenderForwardMobile::_update_dirty_geometry_instances() {
 	}
 	}
 }
 }
 
 
-void RenderForwardMobile::_geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker) {
+void RenderForwardMobile::_geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker) {
 	switch (p_notification) {
 	switch (p_notification) {
-		case RendererStorage::DEPENDENCY_CHANGED_MATERIAL:
-		case RendererStorage::DEPENDENCY_CHANGED_MESH:
-		case RendererStorage::DEPENDENCY_CHANGED_PARTICLES:
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH:
-		case RendererStorage::DEPENDENCY_CHANGED_SKELETON_DATA: {
+		case Dependency::DEPENDENCY_CHANGED_MATERIAL:
+		case Dependency::DEPENDENCY_CHANGED_MESH:
+		case Dependency::DEPENDENCY_CHANGED_PARTICLES:
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH:
+		case Dependency::DEPENDENCY_CHANGED_SKELETON_DATA: {
 			static_cast<RenderForwardMobile *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 			static_cast<RenderForwardMobile *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 		} break;
 		} break;
-		case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
+		case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: {
 			GeometryInstanceForwardMobile *ginstance = static_cast<GeometryInstanceForwardMobile *>(p_tracker->userdata);
 			GeometryInstanceForwardMobile *ginstance = static_cast<GeometryInstanceForwardMobile *>(p_tracker->userdata);
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 			if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
 				ginstance->instance_count = RendererRD::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
 				ginstance->instance_count = RendererRD::MeshStorage::get_singleton()->multimesh_get_instances_to_draw(ginstance->data->base);
@@ -2629,7 +2629,7 @@ void RenderForwardMobile::_geometry_instance_dependency_changed(RendererStorage:
 		} break;
 		} break;
 	}
 	}
 }
 }
-void RenderForwardMobile::_geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker) {
+void RenderForwardMobile::_geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker) {
 	static_cast<RenderForwardMobile *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 	static_cast<RenderForwardMobile *>(singleton)->_geometry_instance_mark_dirty(static_cast<GeometryInstance *>(p_tracker->userdata));
 }
 }
 
 
@@ -2695,8 +2695,7 @@ void RenderForwardMobile::_update_shader_quality_settings() {
 	_base_uniforms_changed(); //also need this
 	_base_uniforms_changed(); //also need this
 }
 }
 
 
-RenderForwardMobile::RenderForwardMobile(RendererStorageRD *p_storage) :
-		RendererSceneRenderRD(p_storage) {
+RenderForwardMobile::RenderForwardMobile() {
 	singleton = this;
 	singleton = this;
 
 
 	sky.set_texture_format(_render_buffers_get_color_format());
 	sky.set_texture_format(_render_buffers_get_color_format());
@@ -2728,7 +2727,7 @@ RenderForwardMobile::RenderForwardMobile(RendererStorageRD *p_storage) :
 		defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
 		defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
 	}
 	}
 
 
-	scene_shader.init(p_storage, defines);
+	scene_shader.init(defines);
 
 
 	// !BAS! maybe we need a mobile version of this setting?
 	// !BAS! maybe we need a mobile version of this setting?
 	render_list_thread_threshold = GLOBAL_GET("rendering/limits/forward_renderer/threaded_render_minimum_instances");
 	render_list_thread_threshold = GLOBAL_GET("rendering/limits/forward_renderer/threaded_render_minimum_instances");

+ 5 - 5
servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h

@@ -35,7 +35,7 @@
 #include "servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h"
 #include "servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
+#include "servers/rendering/renderer_rd/storage_rd/utilities.h"
 
 
 namespace RendererSceneRenderImplementation {
 namespace RendererSceneRenderImplementation {
 
 
@@ -597,7 +597,7 @@ protected:
 
 
 			bool dirty_dependencies = false;
 			bool dirty_dependencies = false;
 
 
-			RendererStorage::DependencyTracker dependency_tracker;
+			DependencyTracker dependency_tracker;
 		};
 		};
 
 
 		Data *data = nullptr;
 		Data *data = nullptr;
@@ -613,8 +613,8 @@ protected:
 public:
 public:
 	virtual RID reflection_probe_create_framebuffer(RID p_color, RID p_depth) override;
 	virtual RID reflection_probe_create_framebuffer(RID p_color, RID p_depth) override;
 
 
-	static void _geometry_instance_dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *p_tracker);
-	static void _geometry_instance_dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker);
+	static void _geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker);
 
 
 	SelfList<GeometryInstanceForwardMobile>::List geometry_instance_dirty_list;
 	SelfList<GeometryInstanceForwardMobile>::List geometry_instance_dirty_list;
 
 
@@ -668,7 +668,7 @@ public:
 	virtual bool is_volumetric_supported() const override;
 	virtual bool is_volumetric_supported() const override;
 	virtual uint32_t get_max_elements() const override;
 	virtual uint32_t get_max_elements() const override;
 
 
-	RenderForwardMobile(RendererStorageRD *p_storage);
+	RenderForwardMobile();
 	~RenderForwardMobile();
 	~RenderForwardMobile();
 };
 };
 } // namespace RendererSceneRenderImplementation
 } // namespace RendererSceneRenderImplementation

+ 1 - 2
servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp

@@ -466,8 +466,7 @@ SceneShaderForwardMobile::SceneShaderForwardMobile() {
 	singleton = this;
 	singleton = this;
 }
 }
 
 
-void SceneShaderForwardMobile::init(RendererStorageRD *p_storage, const String p_defines) {
-	storage = p_storage;
+void SceneShaderForwardMobile::init(const String p_defines) {
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 
 
 	/* SCENE SHADER */
 	/* SCENE SHADER */

+ 1 - 3
servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h

@@ -32,7 +32,6 @@
 #define RSSR_SCENE_SHADER_FM_H
 #define RSSR_SCENE_SHADER_FM_H
 
 
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl.gen.h"
 
 
 namespace RendererSceneRenderImplementation {
 namespace RendererSceneRenderImplementation {
@@ -40,7 +39,6 @@ namespace RendererSceneRenderImplementation {
 class SceneShaderForwardMobile {
 class SceneShaderForwardMobile {
 private:
 private:
 	static SceneShaderForwardMobile *singleton;
 	static SceneShaderForwardMobile *singleton;
-	RendererStorageRD *storage = nullptr;
 
 
 public:
 public:
 	enum ShaderVersion {
 	enum ShaderVersion {
@@ -207,7 +205,7 @@ public:
 
 
 	Vector<RD::PipelineSpecializationConstant> default_specialization_constants;
 	Vector<RD::PipelineSpecializationConstant> default_specialization_constants;
 
 
-	void init(RendererStorageRD *p_storage, const String p_defines);
+	void init(const String p_defines);
 	void set_default_specialization_constants(const Vector<RD::PipelineSpecializationConstant> &p_constants);
 	void set_default_specialization_constants(const Vector<RD::PipelineSpecializationConstant> &p_constants);
 };
 };
 
 

+ 1 - 2
servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp

@@ -2270,10 +2270,9 @@ void RendererCanvasRenderRD::set_time(double p_time) {
 void RendererCanvasRenderRD::update() {
 void RendererCanvasRenderRD::update() {
 }
 }
 
 
-RendererCanvasRenderRD::RendererCanvasRenderRD(RendererStorageRD *p_storage) {
+RendererCanvasRenderRD::RendererCanvasRenderRD() {
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
-	storage = p_storage;
 
 
 	{ //create default samplers
 	{ //create default samplers
 
 

+ 2 - 4
servers/rendering/renderer_rd/renderer_canvas_render_rd.h

@@ -34,15 +34,13 @@
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/canvas.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/canvas.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/canvas_occlusion.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/canvas_occlusion.glsl.gen.h"
+#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/rendering_device.h"
 #include "servers/rendering/rendering_device.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_compiler.h"
 
 
 class RendererCanvasRenderRD : public RendererCanvasRender {
 class RendererCanvasRenderRD : public RendererCanvasRender {
-	RendererStorageRD *storage = nullptr;
-
 	enum {
 	enum {
 		BASE_UNIFORM_SET = 0,
 		BASE_UNIFORM_SET = 0,
 		MATERIAL_UNIFORM_SET = 1,
 		MATERIAL_UNIFORM_SET = 1,
@@ -462,7 +460,7 @@ public:
 	void set_time(double p_time);
 	void set_time(double p_time);
 	void update();
 	void update();
 	bool free(RID p_rid);
 	bool free(RID p_rid);
-	RendererCanvasRenderRD(RendererStorageRD *p_storage);
+	RendererCanvasRenderRD();
 	~RendererCanvasRenderRD();
 	~RendererCanvasRenderRD();
 };
 };
 
 

+ 9 - 6
servers/rendering/renderer_rd/renderer_compositor_rd.cpp

@@ -154,12 +154,14 @@ uint64_t RendererCompositorRD::frame = 1;
 void RendererCompositorRD::finalize() {
 void RendererCompositorRD::finalize() {
 	memdelete(scene);
 	memdelete(scene);
 	memdelete(canvas);
 	memdelete(canvas);
-	memdelete(storage);
+	memdelete(effects);
+	memdelete(fog);
 	memdelete(particles_storage);
 	memdelete(particles_storage);
 	memdelete(light_storage);
 	memdelete(light_storage);
 	memdelete(mesh_storage);
 	memdelete(mesh_storage);
 	memdelete(material_storage);
 	memdelete(material_storage);
 	memdelete(texture_storage);
 	memdelete(texture_storage);
+	memdelete(utilities);
 
 
 	//only need to erase these, the rest are erased by cascade
 	//only need to erase these, the rest are erased by cascade
 	blit.shader.version_free(blit.shader_version);
 	blit.shader.version_free(blit.shader_version);
@@ -287,28 +289,29 @@ RendererCompositorRD::RendererCompositorRD() {
 
 
 	singleton = this;
 	singleton = this;
 
 
+	utilities = memnew(RendererRD::Utilities);
 	texture_storage = memnew(RendererRD::TextureStorage);
 	texture_storage = memnew(RendererRD::TextureStorage);
 	material_storage = memnew(RendererRD::MaterialStorage);
 	material_storage = memnew(RendererRD::MaterialStorage);
 	mesh_storage = memnew(RendererRD::MeshStorage);
 	mesh_storage = memnew(RendererRD::MeshStorage);
 	light_storage = memnew(RendererRD::LightStorage);
 	light_storage = memnew(RendererRD::LightStorage);
 	particles_storage = memnew(RendererRD::ParticlesStorage);
 	particles_storage = memnew(RendererRD::ParticlesStorage);
-	storage = memnew(RendererStorageRD);
-	canvas = memnew(RendererCanvasRenderRD(storage));
+	fog = memnew(RendererRD::Fog);
+	canvas = memnew(RendererCanvasRenderRD());
 
 
 	back_end = (bool)(int)GLOBAL_GET("rendering/vulkan/rendering/back_end");
 	back_end = (bool)(int)GLOBAL_GET("rendering/vulkan/rendering/back_end");
 	uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE);
 	uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE);
 
 
 	if (back_end || textures_per_stage < 48) {
 	if (back_end || textures_per_stage < 48) {
-		scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile(storage));
+		scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile());
 	} else { // back_end == false
 	} else { // back_end == false
 		// default to our high end renderer
 		// default to our high end renderer
-		scene = memnew(RendererSceneRenderImplementation::RenderForwardClustered(storage));
+		scene = memnew(RendererSceneRenderImplementation::RenderForwardClustered());
 	}
 	}
 
 
 	scene->init();
 	scene->init();
 
 
 	// now we're ready to create our effects,
 	// now we're ready to create our effects,
-	storage->init_effects(!scene->_render_buffers_can_be_storage());
+	effects = memnew(EffectsRD(!scene->_render_buffers_can_be_storage()));
 }
 }
 
 
 RendererCompositorRD::~RendererCompositorRD() {
 RendererCompositorRD::~RendererCompositorRD() {

+ 9 - 3
servers/rendering/renderer_rd/renderer_compositor_rd.h

@@ -34,28 +34,32 @@
 #include "core/os/os.h"
 #include "core/os/os.h"
 #include "core/templates/thread_work_pool.h"
 #include "core/templates/thread_work_pool.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
+#include "servers/rendering/renderer_rd/effects_rd.h"
+#include "servers/rendering/renderer_rd/environment/fog.h"
 #include "servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h"
 #include "servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h"
 #include "servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h"
 #include "servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h"
 #include "servers/rendering/renderer_rd/renderer_canvas_render_rd.h"
 #include "servers/rendering/renderer_rd/renderer_canvas_render_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/blit.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/blit.glsl.gen.h"
 #include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
+#include "servers/rendering/renderer_rd/storage_rd/utilities.h"
 #include "servers/rendering/renderer_rd/uniform_set_cache_rd.h"
 #include "servers/rendering/renderer_rd/uniform_set_cache_rd.h"
 
 
 class RendererCompositorRD : public RendererCompositor {
 class RendererCompositorRD : public RendererCompositor {
 protected:
 protected:
 	UniformSetCacheRD *uniform_set_cache = nullptr;
 	UniformSetCacheRD *uniform_set_cache = nullptr;
 	RendererCanvasRenderRD *canvas = nullptr;
 	RendererCanvasRenderRD *canvas = nullptr;
+	RendererRD::Utilities *utilities = nullptr;
 	RendererRD::LightStorage *light_storage = nullptr;
 	RendererRD::LightStorage *light_storage = nullptr;
 	RendererRD::MaterialStorage *material_storage = nullptr;
 	RendererRD::MaterialStorage *material_storage = nullptr;
 	RendererRD::MeshStorage *mesh_storage = nullptr;
 	RendererRD::MeshStorage *mesh_storage = nullptr;
 	RendererRD::ParticlesStorage *particles_storage = nullptr;
 	RendererRD::ParticlesStorage *particles_storage = nullptr;
 	RendererRD::TextureStorage *texture_storage = nullptr;
 	RendererRD::TextureStorage *texture_storage = nullptr;
-	RendererStorageRD *storage = nullptr;
+	RendererRD::Fog *fog = nullptr;
+	EffectsRD *effects = nullptr;
 	RendererSceneRenderRD *scene = nullptr;
 	RendererSceneRenderRD *scene = nullptr;
 
 
 	enum BlitMode {
 	enum BlitMode {
@@ -98,6 +102,7 @@ protected:
 	static uint64_t frame;
 	static uint64_t frame;
 
 
 public:
 public:
+	RendererUtilities *get_utilities() { return utilities; };
 	RendererLightStorage *get_light_storage() { return light_storage; }
 	RendererLightStorage *get_light_storage() { return light_storage; }
 	RendererMaterialStorage *get_material_storage() { return material_storage; }
 	RendererMaterialStorage *get_material_storage() { return material_storage; }
 	RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
 	RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
@@ -107,7 +112,8 @@ public:
 		ERR_FAIL_NULL_V(scene, nullptr);
 		ERR_FAIL_NULL_V(scene, nullptr);
 		return scene->get_gi();
 		return scene->get_gi();
 	}
 	}
-	RendererStorage *get_storage() { return storage; }
+	RendererFog *get_fog() { return fog; }
+	EffectsRD *get_effects() { return effects; }
 	RendererCanvasRender *get_canvas() { return canvas; }
 	RendererCanvasRender *get_canvas() { return canvas; }
 	RendererSceneRender *get_scene() { return scene; }
 	RendererSceneRender *get_scene() { return scene; }
 
 

+ 36 - 36
servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

@@ -33,6 +33,7 @@
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
 #include "core/os/os.h"
 #include "core/os/os.h"
 #include "renderer_compositor_rd.h"
 #include "renderer_compositor_rd.h"
+#include "servers/rendering/renderer_rd/environment/fog.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
@@ -534,7 +535,7 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba
 		return panorama;
 		return panorama;
 	} else {
 	} else {
 		const float bg_energy = env->bg_energy;
 		const float bg_energy = env->bg_energy;
-		Color panorama_color = ((environment_background == RS::ENV_BG_CLEAR_COLOR) ? storage->get_default_clear_color() : env->bg_color);
+		Color panorama_color = ((environment_background == RS::ENV_BG_CLEAR_COLOR) ? RSG::texture_storage->get_default_clear_color() : env->bg_color);
 		panorama_color = panorama_color.srgb_to_linear();
 		panorama_color = panorama_color.srgb_to_linear();
 		panorama_color.r *= bg_energy;
 		panorama_color.r *= bg_energy;
 		panorama_color.g *= bg_energy;
 		panorama_color.g *= bg_energy;
@@ -759,7 +760,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_begin_render(RID p_instanc
 		}
 		}
 		atlas->reflections.resize(atlas->count);
 		atlas->reflections.resize(atlas->count);
 		for (int i = 0; i < atlas->count; i++) {
 		for (int i = 0; i < atlas->count; i++) {
-			atlas->reflections.write[i].data.update_reflection_data(storage, atlas->size, mipmaps, false, atlas->reflection, i * 6, RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS, sky.roughness_layers, _render_buffers_get_color_format());
+			atlas->reflections.write[i].data.update_reflection_data(atlas->size, mipmaps, false, atlas->reflection, i * 6, RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS, sky.roughness_layers, _render_buffers_get_color_format());
 			for (int j = 0; j < 6; j++) {
 			for (int j = 0; j < 6; j++) {
 				atlas->reflections.write[i].fbs[j] = reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer);
 				atlas->reflections.write[i].fbs[j] = reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer);
 			}
 			}
@@ -829,7 +830,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_postprocess_step(RID p_ins
 
 
 	if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) {
 	if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) {
 		// Using real time reflections, all roughness is done in one step
 		// Using real time reflections, all roughness is done in one step
-		atlas->reflections.write[rpi->atlas_index].data.create_reflection_fast_filter(storage, false);
+		atlas->reflections.write[rpi->atlas_index].data.create_reflection_fast_filter(false);
 		rpi->rendering = false;
 		rpi->rendering = false;
 		rpi->processing_side = 0;
 		rpi->processing_side = 0;
 		rpi->processing_layer = 1;
 		rpi->processing_layer = 1;
@@ -837,7 +838,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_postprocess_step(RID p_ins
 	}
 	}
 
 
 	if (rpi->processing_layer > 1) {
 	if (rpi->processing_layer > 1) {
-		atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(storage, false, 10, rpi->processing_layer, sky.sky_ggx_samples_quality);
+		atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, 10, rpi->processing_layer, sky.sky_ggx_samples_quality);
 		rpi->processing_layer++;
 		rpi->processing_layer++;
 		if (rpi->processing_layer == atlas->reflections[rpi->atlas_index].data.layers[0].mipmaps.size()) {
 		if (rpi->processing_layer == atlas->reflections[rpi->atlas_index].data.layers[0].mipmaps.size()) {
 			rpi->rendering = false;
 			rpi->rendering = false;
@@ -848,7 +849,7 @@ bool RendererSceneRenderRD::reflection_probe_instance_postprocess_step(RID p_ins
 		return false;
 		return false;
 
 
 	} else {
 	} else {
-		atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(storage, false, rpi->processing_side, rpi->processing_layer, sky.sky_ggx_samples_quality);
+		atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, rpi->processing_side, rpi->processing_layer, sky.sky_ggx_samples_quality);
 	}
 	}
 
 
 	rpi->processing_side++;
 	rpi->processing_side++;
@@ -1968,7 +1969,7 @@ void RendererSceneRenderRD::_process_sss(RID p_render_buffers, const CameraMatri
 		_allocate_blur_textures(rb);
 		_allocate_blur_textures(rb);
 	}
 	}
 
 
-	storage->get_effects()->sub_surface_scattering(rb->internal_texture, rb->sss_texture, rb->depth_texture, p_camera, Size2i(rb->internal_width, rb->internal_height), sss_scale, sss_depth_scale, sss_quality);
+	RendererCompositorRD::singleton->get_effects()->sub_surface_scattering(rb->internal_texture, rb->sss_texture, rb->depth_texture, p_camera, Size2i(rb->internal_width, rb->internal_height), sss_scale, sss_depth_scale, sss_quality);
 }
 }
 
 
 void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_framebuffer, RID p_normal_buffer, RID p_specular_buffer, RID p_metallic, const Color &p_metallic_mask, RID p_environment, const CameraMatrix &p_projection, bool p_use_additive) {
 void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_framebuffer, RID p_normal_buffer, RID p_specular_buffer, RID p_metallic, const Color &p_metallic_mask, RID p_environment, const CameraMatrix &p_projection, bool p_use_additive) {
@@ -1979,7 +1980,7 @@ void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_frameb
 
 
 	if (!can_use_effects) {
 	if (!can_use_effects) {
 		//just copy
 		//just copy
-		storage->get_effects()->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : rb->internal_texture, RID());
+		RendererCompositorRD::singleton->get_effects()->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : rb->internal_texture, RID());
 		return;
 		return;
 	}
 	}
 
 
@@ -2019,8 +2020,8 @@ void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_frameb
 		_allocate_blur_textures(rb);
 		_allocate_blur_textures(rb);
 	}
 	}
 
 
-	storage->get_effects()->screen_space_reflection(rb->internal_texture, p_normal_buffer, ssr_roughness_quality, rb->ssr.blur_radius[0], rb->ssr.blur_radius[1], p_metallic, p_metallic_mask, rb->depth_texture, rb->ssr.depth_scaled, rb->ssr.normal_scaled, rb->blur[0].layers[0].mipmaps[1].texture, rb->blur[1].layers[0].mipmaps[0].texture, Size2i(rb->internal_width / 2, rb->internal_height / 2), env->ssr_max_steps, env->ssr_fade_in, env->ssr_fade_out, env->ssr_depth_tolerance, p_projection);
-	storage->get_effects()->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : rb->internal_texture, rb->blur[0].layers[0].mipmaps[1].texture);
+	RendererCompositorRD::singleton->get_effects()->screen_space_reflection(rb->internal_texture, p_normal_buffer, ssr_roughness_quality, rb->ssr.blur_radius[0], rb->ssr.blur_radius[1], p_metallic, p_metallic_mask, rb->depth_texture, rb->ssr.depth_scaled, rb->ssr.normal_scaled, rb->blur[0].layers[0].mipmaps[1].texture, rb->blur[1].layers[0].mipmaps[0].texture, Size2i(rb->internal_width / 2, rb->internal_height / 2), env->ssr_max_steps, env->ssr_fade_in, env->ssr_fade_out, env->ssr_depth_tolerance, p_projection);
+	RendererCompositorRD::singleton->get_effects()->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : rb->internal_texture, rb->blur[0].layers[0].mipmaps[1].texture);
 }
 }
 
 
 void RendererSceneRenderRD::_process_ssao(RID p_render_buffers, RID p_environment, RID p_normal_buffer, const CameraMatrix &p_projection) {
 void RendererSceneRenderRD::_process_ssao(RID p_render_buffers, RID p_environment, RID p_normal_buffer, const CameraMatrix &p_projection) {
@@ -2145,7 +2146,7 @@ void RendererSceneRenderRD::_process_ssao(RID p_render_buffers, RID p_environmen
 	settings.half_screen_size = Size2i(buffer_width, buffer_height);
 	settings.half_screen_size = Size2i(buffer_width, buffer_height);
 	settings.quarter_screen_size = Size2i(half_width, half_height);
 	settings.quarter_screen_size = Size2i(half_width, half_height);
 
 
-	storage->get_effects()->generate_ssao(p_normal_buffer, rb->ss_effects.ssao.depth_texture_view, rb->ss_effects.ssao.ao_deinterleaved, rb->ss_effects.ssao.ao_deinterleaved_slices, rb->ss_effects.ssao.ao_pong, rb->ss_effects.ssao.ao_pong_slices, rb->ss_effects.ssao.ao_final, rb->ss_effects.ssao.importance_map[0], rb->ss_effects.ssao.importance_map[1], p_projection, settings, uniform_sets_are_invalid, rb->ss_effects.ssao.gather_uniform_set, rb->ss_effects.ssao.importance_map_uniform_set);
+	RendererCompositorRD::singleton->get_effects()->generate_ssao(p_normal_buffer, rb->ss_effects.ssao.depth_texture_view, rb->ss_effects.ssao.ao_deinterleaved, rb->ss_effects.ssao.ao_deinterleaved_slices, rb->ss_effects.ssao.ao_pong, rb->ss_effects.ssao.ao_pong_slices, rb->ss_effects.ssao.ao_final, rb->ss_effects.ssao.importance_map[0], rb->ss_effects.ssao.importance_map[1], p_projection, settings, uniform_sets_are_invalid, rb->ss_effects.ssao.gather_uniform_set, rb->ss_effects.ssao.importance_map_uniform_set);
 }
 }
 
 
 void RendererSceneRenderRD::_process_ssil(RID p_render_buffers, RID p_environment, RID p_normal_buffer, const CameraMatrix &p_projection, const Transform3D &p_transform) {
 void RendererSceneRenderRD::_process_ssil(RID p_render_buffers, RID p_environment, RID p_normal_buffer, const CameraMatrix &p_projection, const Transform3D &p_transform) {
@@ -2306,7 +2307,7 @@ void RendererSceneRenderRD::_process_ssil(RID p_render_buffers, RID p_environmen
 	transform.set_origin(Vector3(0.0, 0.0, 0.0));
 	transform.set_origin(Vector3(0.0, 0.0, 0.0));
 	CameraMatrix last_frame_projection = rb->ss_effects.last_frame_projection * CameraMatrix(rb->ss_effects.last_frame_transform.affine_inverse()) * CameraMatrix(transform) * projection.inverse();
 	CameraMatrix last_frame_projection = rb->ss_effects.last_frame_projection * CameraMatrix(rb->ss_effects.last_frame_transform.affine_inverse()) * CameraMatrix(transform) * projection.inverse();
 
 
-	storage->get_effects()->screen_space_indirect_lighting(rb->ss_effects.last_frame, rb->ss_effects.ssil.ssil_final, p_normal_buffer, rb->ss_effects.ssil.depth_texture_view, rb->ss_effects.ssil.deinterleaved, rb->ss_effects.ssil.deinterleaved_slices, rb->ss_effects.ssil.pong, rb->ss_effects.ssil.pong_slices, rb->ss_effects.ssil.importance_map[0], rb->ss_effects.ssil.importance_map[1], rb->ss_effects.ssil.edges, rb->ss_effects.ssil.edges_slices, p_projection, last_frame_projection, settings, uniform_sets_are_invalid, rb->ss_effects.ssil.gather_uniform_set, rb->ss_effects.ssil.importance_map_uniform_set, rb->ss_effects.ssil.projection_uniform_set);
+	RendererCompositorRD::singleton->get_effects()->screen_space_indirect_lighting(rb->ss_effects.last_frame, rb->ss_effects.ssil.ssil_final, p_normal_buffer, rb->ss_effects.ssil.depth_texture_view, rb->ss_effects.ssil.deinterleaved, rb->ss_effects.ssil.deinterleaved_slices, rb->ss_effects.ssil.pong, rb->ss_effects.ssil.pong_slices, rb->ss_effects.ssil.importance_map[0], rb->ss_effects.ssil.importance_map[1], rb->ss_effects.ssil.edges, rb->ss_effects.ssil.edges_slices, p_projection, last_frame_projection, settings, uniform_sets_are_invalid, rb->ss_effects.ssil.gather_uniform_set, rb->ss_effects.ssil.importance_map_uniform_set, rb->ss_effects.ssil.projection_uniform_set);
 	rb->ss_effects.last_frame_projection = projection;
 	rb->ss_effects.last_frame_projection = projection;
 	rb->ss_effects.last_frame_transform = transform;
 	rb->ss_effects.last_frame_transform = transform;
 }
 }
@@ -2354,7 +2355,7 @@ void RendererSceneRenderRD::_process_taa(RID p_render_buffers, RID p_velocity_bu
 
 
 	RD::get_singleton()->draw_command_begin_label("TAA");
 	RD::get_singleton()->draw_command_begin_label("TAA");
 	if (!just_allocated) {
 	if (!just_allocated) {
-		storage->get_effects()->taa_resolve(rb->internal_texture, rb->taa.temp, rb->depth_texture, p_velocity_buffer, rb->taa.prev_velocity, rb->taa.history, Size2(rb->internal_width, rb->internal_height), p_z_near, p_z_far);
+		RendererCompositorRD::singleton->get_effects()->taa_resolve(rb->internal_texture, rb->taa.temp, rb->depth_texture, p_velocity_buffer, rb->taa.prev_velocity, rb->taa.history, Size2(rb->internal_width, rb->internal_height), p_z_near, p_z_far);
 		copy_effects->copy_to_rect(rb->taa.temp, rb->internal_texture, Rect2(0, 0, rb->internal_width, rb->internal_height));
 		copy_effects->copy_to_rect(rb->taa.temp, rb->internal_texture, Rect2(0, 0, rb->internal_width, rb->internal_height));
 	}
 	}
 
 
@@ -2492,9 +2493,9 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 
 
 		double step = env->auto_exp_speed * time_step;
 		double step = env->auto_exp_speed * time_step;
 		if (can_use_storage) {
 		if (can_use_storage) {
-			storage->get_effects()->luminance_reduction(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
+			RendererCompositorRD::singleton->get_effects()->luminance_reduction(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
 		} else {
 		} else {
-			storage->get_effects()->luminance_reduction_raster(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
+			RendererCompositorRD::singleton->get_effects()->luminance_reduction_raster(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
 		}
 		}
 		// Swap final reduce with prev luminance.
 		// Swap final reduce with prev luminance.
 		SWAP(rb->luminance.current, rb->luminance.reduce.write[rb->luminance.reduce.size() - 1]);
 		SWAP(rb->luminance.current, rb->luminance.reduce.write[rb->luminance.reduce.size() - 1]);
@@ -2639,7 +2640,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 	if (can_use_effects && can_use_storage && (rb->internal_width != rb->width || rb->internal_height != rb->height)) {
 	if (can_use_effects && can_use_storage && (rb->internal_width != rb->width || rb->internal_height != rb->height)) {
 		RD::get_singleton()->draw_command_begin_label("FSR 1.0 Upscale");
 		RD::get_singleton()->draw_command_begin_label("FSR 1.0 Upscale");
 
 
-		storage->get_effects()->fsr_upscale(rb->internal_texture, rb->upscale_texture, rb->texture, Size2i(rb->internal_width, rb->internal_height), Size2i(rb->width, rb->height), rb->fsr_sharpness);
+		RendererCompositorRD::singleton->get_effects()->fsr_upscale(rb->internal_texture, rb->upscale_texture, rb->texture, Size2i(rb->internal_width, rb->internal_height), Size2i(rb->width, rb->height), rb->fsr_sharpness);
 
 
 		RD::get_singleton()->draw_command_end_label();
 		RD::get_singleton()->draw_command_end_label();
 	}
 	}
@@ -3364,7 +3365,7 @@ void RendererSceneRenderRD::_setup_reflections(const PagedArray<RID> &p_reflecti
 
 
 		Transform3D transform = rpi->transform;
 		Transform3D transform = rpi->transform;
 		Transform3D proj = (p_camera_inverse_transform * transform).inverse();
 		Transform3D proj = (p_camera_inverse_transform * transform).inverse();
-		RendererStorageRD::store_transform(proj, reflection_ubo.local_matrix);
+		RendererRD::MaterialStorage::store_transform(proj, reflection_ubo.local_matrix);
 
 
 		if (current_cluster_builder != nullptr) {
 		if (current_cluster_builder != nullptr) {
 			current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_REFLECTION_PROBE, transform, extents);
 			current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_REFLECTION_PROBE, transform, extents);
@@ -3482,7 +3483,7 @@ void RendererSceneRenderRD::_setup_lights(const PagedArray<RID> &p_lights, const
 						light_data.shadow_transmittance_bias[j] = light_storage->light_get_transmittance_bias(base) * bias_scale;
 						light_data.shadow_transmittance_bias[j] = light_storage->light_get_transmittance_bias(base) * bias_scale;
 						light_data.shadow_z_range[j] = li->shadow_transform[j].farplane;
 						light_data.shadow_z_range[j] = li->shadow_transform[j].farplane;
 						light_data.shadow_range_begin[j] = li->shadow_transform[j].range_begin;
 						light_data.shadow_range_begin[j] = li->shadow_transform[j].range_begin;
-						RendererStorageRD::store_camera(shadow_mtx, light_data.shadow_matrices[j]);
+						RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrices[j]);
 
 
 						Vector2 uv_scale = li->shadow_transform[j].uv_scale;
 						Vector2 uv_scale = li->shadow_transform[j].uv_scale;
 						uv_scale *= atlas_rect.size; //adapt to atlas size
 						uv_scale *= atlas_rect.size; //adapt to atlas size
@@ -3727,7 +3728,7 @@ void RendererSceneRenderRD::_setup_lights(const PagedArray<RID> &p_lights, const
 			if (type == RS::LIGHT_OMNI) {
 			if (type == RS::LIGHT_OMNI) {
 				Transform3D proj = (inverse_transform * light_transform).inverse();
 				Transform3D proj = (inverse_transform * light_transform).inverse();
 
 
-				RendererStorageRD::store_transform(proj, light_data.shadow_matrix);
+				RendererRD::MaterialStorage::store_transform(proj, light_data.shadow_matrix);
 
 
 				if (size > 0.0 && light_data.soft_shadow_scale > 0.0) {
 				if (size > 0.0 && light_data.soft_shadow_scale > 0.0) {
 					// Only enable PCSS-like soft shadows if blurring is enabled.
 					// Only enable PCSS-like soft shadows if blurring is enabled.
@@ -3746,7 +3747,7 @@ void RendererSceneRenderRD::_setup_lights(const PagedArray<RID> &p_lights, const
 				bias.set_light_bias();
 				bias.set_light_bias();
 
 
 				CameraMatrix shadow_mtx = bias * li->shadow_transform[0].camera * modelview;
 				CameraMatrix shadow_mtx = bias * li->shadow_transform[0].camera * modelview;
-				RendererStorageRD::store_camera(shadow_mtx, light_data.shadow_matrix);
+				RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrix);
 
 
 				if (size > 0.0 && light_data.soft_shadow_scale > 0.0) {
 				if (size > 0.0 && light_data.soft_shadow_scale > 0.0) {
 					// Only enable PCSS-like soft shadows if blurring is enabled.
 					// Only enable PCSS-like soft shadows if blurring is enabled.
@@ -3865,7 +3866,7 @@ void RendererSceneRenderRD::_setup_decals(const PagedArray<RID> &p_decals, const
 		Transform3D scale_xform;
 		Transform3D scale_xform;
 		scale_xform.basis.scale(decal_extents);
 		scale_xform.basis.scale(decal_extents);
 		Transform3D to_decal_xform = (p_camera_inverse_xform * di->transform * scale_xform * uv_xform).affine_inverse();
 		Transform3D to_decal_xform = (p_camera_inverse_xform * di->transform * scale_xform * uv_xform).affine_inverse();
-		RendererStorageRD::store_transform(to_decal_xform, dd.xform);
+		RendererRD::MaterialStorage::store_transform(to_decal_xform, dd.xform);
 
 
 		Vector3 normal = xform.basis.get_column(Vector3::AXIS_Y).normalized();
 		Vector3 normal = xform.basis.get_column(Vector3::AXIS_Y).normalized();
 		normal = p_camera_inverse_xform.basis.xform(normal); //camera is normalized, so fine
 		normal = p_camera_inverse_xform.basis.xform(normal); //camera is normalized, so fine
@@ -3903,7 +3904,7 @@ void RendererSceneRenderRD::_setup_decals(const PagedArray<RID> &p_decals, const
 			dd.normal_rect[3] = rect.size.y;
 			dd.normal_rect[3] = rect.size.y;
 
 
 			Basis normal_xform = p_camera_inverse_xform.basis * xform.basis.orthonormalized();
 			Basis normal_xform = p_camera_inverse_xform.basis * xform.basis.orthonormalized();
-			RendererStorageRD::store_basis_3x4(normal_xform, dd.normal_xform);
+			RendererRD::MaterialStorage::store_basis_3x4(normal_xform, dd.normal_xform);
 		} else {
 		} else {
 			dd.normal_rect[0] = 0;
 			dd.normal_rect[0] = 0;
 			dd.normal_rect[1] = 0;
 			dd.normal_rect[1] = 0;
@@ -4323,8 +4324,8 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 		params.temporal_blend = env->volumetric_fog_temporal_reprojection_amount;
 		params.temporal_blend = env->volumetric_fog_temporal_reprojection_amount;
 
 
 		Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
 		Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
-		storage->store_transform(to_prev_cam_view, params.to_prev_view);
-		storage->store_transform(p_cam_transform, params.transform);
+		RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
+		RendererRD::MaterialStorage::store_transform(p_cam_transform, params.transform);
 
 
 		RD::get_singleton()->buffer_update(volumetric_fog.volume_ubo, 0, sizeof(VolumetricFogShader::VolumeUBO), &params, RD::BARRIER_MASK_COMPUTE);
 		RD::get_singleton()->buffer_update(volumetric_fog.volume_ubo, 0, sizeof(VolumetricFogShader::VolumeUBO), &params, RD::BARRIER_MASK_COMPUTE);
 
 
@@ -4386,7 +4387,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 			ERR_FAIL_COND(!fog_volume_instance);
 			ERR_FAIL_COND(!fog_volume_instance);
 			RID fog_volume = fog_volume_instance->volume;
 			RID fog_volume = fog_volume_instance->volume;
 
 
-			RID fog_material = storage->fog_volume_get_material(fog_volume);
+			RID fog_material = RendererRD::Fog::get_singleton()->fog_volume_get_material(fog_volume);
 
 
 			FogMaterialData *material = nullptr;
 			FogMaterialData *material = nullptr;
 
 
@@ -4415,8 +4416,8 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 			Vector3i kernel_size = Vector3i();
 			Vector3i kernel_size = Vector3i();
 
 
 			Vector3 position = fog_volume_instance->transform.get_origin();
 			Vector3 position = fog_volume_instance->transform.get_origin();
-			RS::FogVolumeShape volume_type = storage->fog_volume_get_shape(fog_volume);
-			Vector3 extents = storage->fog_volume_get_extents(fog_volume);
+			RS::FogVolumeShape volume_type = RendererRD::Fog::get_singleton()->fog_volume_get_shape(fog_volume);
+			Vector3 extents = RendererRD::Fog::get_singleton()->fog_volume_get_extents(fog_volume);
 
 
 			if (volume_type != RS::FOG_VOLUME_SHAPE_WORLD) {
 			if (volume_type != RS::FOG_VOLUME_SHAPE_WORLD) {
 				// Local fog volume.
 				// Local fog volume.
@@ -4459,8 +4460,8 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 			volumetric_fog.push_constant.corner[0] = min.x;
 			volumetric_fog.push_constant.corner[0] = min.x;
 			volumetric_fog.push_constant.corner[1] = min.y;
 			volumetric_fog.push_constant.corner[1] = min.y;
 			volumetric_fog.push_constant.corner[2] = min.z;
 			volumetric_fog.push_constant.corner[2] = min.z;
-			volumetric_fog.push_constant.shape = uint32_t(storage->fog_volume_get_shape(fog_volume));
-			storage->store_transform(fog_volume_instance->transform.affine_inverse(), volumetric_fog.push_constant.transform);
+			volumetric_fog.push_constant.shape = uint32_t(RendererRD::Fog::get_singleton()->fog_volume_get_shape(fog_volume));
+			RendererRD::MaterialStorage::store_transform(fog_volume_instance->transform.affine_inverse(), volumetric_fog.push_constant.transform);
 
 
 			RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, shader_data->pipeline);
 			RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, shader_data->pipeline);
 
 
@@ -4801,7 +4802,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 	params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
 	params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
 
 
 	Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
 	Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
-	storage->store_transform(to_prev_cam_view, params.to_prev_view);
+	RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
 
 
 	params.use_temporal_reprojection = env->volumetric_fog_temporal_reprojection;
 	params.use_temporal_reprojection = env->volumetric_fog_temporal_reprojection;
 	params.temporal_blend = env->volumetric_fog_temporal_reprojection_amount;
 	params.temporal_blend = env->volumetric_fog_temporal_reprojection_amount;
@@ -4822,7 +4823,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
 
 
 	Basis sky_transform = env->sky_orientation;
 	Basis sky_transform = env->sky_orientation;
 	sky_transform = sky_transform.inverse() * p_cam_transform.basis;
 	sky_transform = sky_transform.inverse() * p_cam_transform.basis;
-	RendererStorageRD::store_transform_3x3(sky_transform, params.radiance_inverse_xform);
+	RendererRD::MaterialStorage::store_transform_3x3(sky_transform, params.radiance_inverse_xform);
 
 
 	RD::get_singleton()->draw_command_begin_label("Render Volumetric Fog");
 	RD::get_singleton()->draw_command_begin_label("Render Volumetric Fog");
 
 
@@ -5033,7 +5034,7 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool
 				invalidate_uniform_set = true;
 				invalidate_uniform_set = true;
 			}
 			}
 
 
-			storage->get_effects()->downsample_depth(rb->depth_texture, rb->ss_effects.linear_depth_slices, ssao_quality, ssil_quality, invalidate_uniform_set, ssao_half_size, ssil_half_size, Size2i(rb->width, rb->height), p_render_data->cam_projection);
+			RendererCompositorRD::singleton->get_effects()->downsample_depth(rb->depth_texture, rb->ss_effects.linear_depth_slices, ssao_quality, ssil_quality, invalidate_uniform_set, ssao_half_size, ssil_half_size, Size2i(rb->width, rb->height), p_render_data->cam_projection);
 		}
 		}
 
 
 		if (p_use_ssao) {
 		if (p_use_ssao) {
@@ -5182,7 +5183,7 @@ void RendererSceneRenderRD::render_scene(RID p_render_buffers, const CameraData
 	if (p_render_buffers.is_valid()) {
 	if (p_render_buffers.is_valid()) {
 		clear_color = texture_storage->render_target_get_clear_request_color(rb->render_target);
 		clear_color = texture_storage->render_target_get_clear_request_color(rb->render_target);
 	} else {
 	} else {
-		clear_color = storage->get_default_clear_color();
+		clear_color = RSG::texture_storage->get_default_clear_color();
 	}
 	}
 
 
 	//assign render indices to voxel_gi_instances
 	//assign render indices to voxel_gi_instances
@@ -5747,8 +5748,7 @@ uint32_t RendererSceneRenderRD::get_max_elements() const {
 	return GLOBAL_GET("rendering/limits/cluster_builder/max_clustered_elements");
 	return GLOBAL_GET("rendering/limits/cluster_builder/max_clustered_elements");
 }
 }
 
 
-RendererSceneRenderRD::RendererSceneRenderRD(RendererStorageRD *p_storage) {
-	storage = p_storage;
+RendererSceneRenderRD::RendererSceneRenderRD() {
 	singleton = this;
 	singleton = this;
 }
 }
 
 
@@ -5762,12 +5762,12 @@ void RendererSceneRenderRD::init() {
 
 
 	/* SKY SHADER */
 	/* SKY SHADER */
 
 
-	sky.init(storage);
+	sky.init();
 
 
 	/* GI */
 	/* GI */
 
 
 	if (is_dynamic_gi_supported()) {
 	if (is_dynamic_gi_supported()) {
-		gi.init(storage, &sky);
+		gi.init(&sky);
 	}
 	}
 
 
 	{ //decals
 	{ //decals

+ 1 - 3
servers/rendering/renderer_rd/renderer_scene_render_rd.h

@@ -41,7 +41,6 @@
 #include "servers/rendering/renderer_rd/environment/gi.h"
 #include "servers/rendering/renderer_rd/environment/gi.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/volumetric_fog.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/volumetric_fog.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl.gen.h"
 #include "servers/rendering/renderer_scene.h"
 #include "servers/rendering/renderer_scene.h"
@@ -102,7 +101,6 @@ class RendererSceneRenderRD : public RendererSceneRender {
 	friend RendererRD::GI;
 	friend RendererRD::GI;
 
 
 protected:
 protected:
-	RendererStorageRD *storage = nullptr;
 	RendererRD::BokehDOF *bokeh_dof = nullptr;
 	RendererRD::BokehDOF *bokeh_dof = nullptr;
 	RendererRD::CopyEffects *copy_effects = nullptr;
 	RendererRD::CopyEffects *copy_effects = nullptr;
 	RendererRD::ToneMapper *tone_mapper = nullptr;
 	RendererRD::ToneMapper *tone_mapper = nullptr;
@@ -1511,7 +1509,7 @@ public:
 
 
 	void init();
 	void init();
 
 
-	RendererSceneRenderRD(RendererStorageRD *p_storage);
+	RendererSceneRenderRD();
 	~RendererSceneRenderRD();
 	~RendererSceneRenderRD();
 };
 };
 
 

+ 29 - 29
servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp

@@ -37,6 +37,7 @@
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
+#include "servers/rendering/rendering_server_globals.h"
 
 
 ////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////
 // SKY SHADER
 // SKY SHADER
@@ -329,13 +330,13 @@ void RendererSceneSkyRD::ReflectionData::clear_reflection_data() {
 	coefficient_buffer = RID();
 	coefficient_buffer = RID();
 }
 }
 
 
-void RendererSceneSkyRD::ReflectionData::update_reflection_data(RendererStorageRD *p_storage, int p_size, int p_mipmaps, bool p_use_array, RID p_base_cube, int p_base_layer, bool p_low_quality, int p_roughness_layers, RD::DataFormat p_texture_format) {
+void RendererSceneSkyRD::ReflectionData::update_reflection_data(int p_size, int p_mipmaps, bool p_use_array, RID p_base_cube, int p_base_layer, bool p_low_quality, int p_roughness_layers, RD::DataFormat p_texture_format) {
 	//recreate radiance and all data
 	//recreate radiance and all data
 
 
 	int mipmaps = p_mipmaps;
 	int mipmaps = p_mipmaps;
 	uint32_t w = p_size, h = p_size;
 	uint32_t w = p_size, h = p_size;
 
 
-	EffectsRD *effects = p_storage->get_effects();
+	EffectsRD *effects = RendererCompositorRD::singleton->get_effects();
 	ERR_FAIL_NULL_MSG(effects, "Effects haven't been initialised");
 	ERR_FAIL_NULL_MSG(effects, "Effects haven't been initialised");
 	bool prefer_raster_effects = effects->get_prefer_raster_effects();
 	bool prefer_raster_effects = effects->get_prefer_raster_effects();
 
 
@@ -437,7 +438,7 @@ void RendererSceneSkyRD::ReflectionData::update_reflection_data(RendererStorageR
 	}
 	}
 }
 }
 
 
-void RendererSceneSkyRD::ReflectionData::create_reflection_fast_filter(RendererStorageRD *p_storage, bool p_use_arrays) {
+void RendererSceneSkyRD::ReflectionData::create_reflection_fast_filter(bool p_use_arrays) {
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
@@ -495,7 +496,7 @@ void RendererSceneSkyRD::ReflectionData::create_reflection_fast_filter(RendererS
 	}
 	}
 }
 }
 
 
-void RendererSceneSkyRD::ReflectionData::create_reflection_importance_sample(RendererStorageRD *p_storage, bool p_use_arrays, int p_cube_side, int p_base_layer, uint32_t p_sky_ggx_samples_quality) {
+void RendererSceneSkyRD::ReflectionData::create_reflection_importance_sample(bool p_use_arrays, int p_cube_side, int p_base_layer, uint32_t p_sky_ggx_samples_quality) {
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
@@ -564,7 +565,7 @@ void RendererSceneSkyRD::ReflectionData::create_reflection_importance_sample(Ren
 	RD::get_singleton()->draw_command_end_label(); // Filter radiance
 	RD::get_singleton()->draw_command_end_label(); // Filter radiance
 }
 }
 
 
-void RendererSceneSkyRD::ReflectionData::update_reflection_mipmaps(RendererStorageRD *p_storage, int p_start, int p_end) {
+void RendererSceneSkyRD::ReflectionData::update_reflection_mipmaps(int p_start, int p_end) {
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton();
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	ERR_FAIL_NULL_MSG(copy_effects, "Effects haven't been initialised");
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
 	bool prefer_raster_effects = copy_effects->get_prefer_raster_effects();
@@ -591,7 +592,7 @@ void RendererSceneSkyRD::ReflectionData::update_reflection_mipmaps(RendererStora
 ////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////
 // RendererSceneSkyRD::Sky
 // RendererSceneSkyRD::Sky
 
 
-void RendererSceneSkyRD::Sky::free(RendererStorageRD *p_storage) {
+void RendererSceneSkyRD::Sky::free() {
 	if (radiance.is_valid()) {
 	if (radiance.is_valid()) {
 		RD::get_singleton()->free(radiance);
 		RD::get_singleton()->free(radiance);
 		radiance = RID();
 		radiance = RID();
@@ -614,12 +615,12 @@ void RendererSceneSkyRD::Sky::free(RendererStorageRD *p_storage) {
 	}
 	}
 
 
 	if (material.is_valid()) {
 	if (material.is_valid()) {
-		p_storage->free(material);
+		RSG::material_storage->material_free(material);
 		material = RID();
 		material = RID();
 	}
 	}
 }
 }
 
 
-RID RendererSceneSkyRD::Sky::get_textures(RendererStorageRD *p_storage, SkyTextureSetVersion p_version, RID p_default_shader_rd) {
+RID RendererSceneSkyRD::Sky::get_textures(SkyTextureSetVersion p_version, RID p_default_shader_rd) {
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 
 
 	if (texture_uniform_sets[p_version].is_valid() && RD::get_singleton()->uniform_set_is_valid(texture_uniform_sets[p_version])) {
 	if (texture_uniform_sets[p_version].is_valid() && RD::get_singleton()->uniform_set_is_valid(texture_uniform_sets[p_version])) {
@@ -795,10 +796,9 @@ RendererSceneSkyRD::RendererSceneSkyRD() {
 	sky_use_cubemap_array = GLOBAL_GET("rendering/reflections/sky_reflections/texture_array_reflections");
 	sky_use_cubemap_array = GLOBAL_GET("rendering/reflections/sky_reflections/texture_array_reflections");
 }
 }
 
 
-void RendererSceneSkyRD::init(RendererStorageRD *p_storage) {
+void RendererSceneSkyRD::init() {
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
 	RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
-	storage = p_storage;
 
 
 	{
 	{
 		// Start with the directional lights for the sky
 		// Start with the directional lights for the sky
@@ -1387,7 +1387,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
 
 
 			for (int i = 0; i < 6; i++) {
 			for (int i = 0; i < 6; i++) {
 				Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
 				Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
-				RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES, sky_shader.default_shader_rd);
+				RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES, sky_shader.default_shader_rd);
 
 
 				cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[2].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 				cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[2].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 				_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[2].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
 				_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[2].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
@@ -1406,7 +1406,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
 
 
 			for (int i = 0; i < 6; i++) {
 			for (int i = 0; i < 6; i++) {
 				Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
 				Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
-				RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_CUBEMAP_HALF_RES, sky_shader.default_shader_rd);
+				RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_CUBEMAP_HALF_RES, sky_shader.default_shader_rd);
 
 
 				cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[1].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 				cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[1].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 				_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[1].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
 				_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[1].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
@@ -1421,7 +1421,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
 		RD::get_singleton()->draw_command_begin_label("Render Sky Cubemap");
 		RD::get_singleton()->draw_command_begin_label("Render Sky Cubemap");
 		for (int i = 0; i < 6; i++) {
 		for (int i = 0; i < 6; i++) {
 			Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
 			Basis local_view = Basis::looking_at(view_normals[i], view_up[i]);
-			RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_CUBEMAP, sky_shader.default_shader_rd);
+			RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_CUBEMAP, sky_shader.default_shader_rd);
 
 
 			cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[0].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 			cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[0].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
 			_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[0].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
 			_render_sky(cubemap_draw_list, p_time, sky->reflection.layers[0].mipmaps[0].framebuffers[i], pipeline, material->uniform_set, texture_uniform_set, 1, &cm, local_view, multiplier, p_transform.origin, p_luminance_multiplier);
@@ -1430,22 +1430,22 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
 		RD::get_singleton()->draw_command_end_label();
 		RD::get_singleton()->draw_command_end_label();
 
 
 		if (sky_mode == RS::SKY_MODE_REALTIME) {
 		if (sky_mode == RS::SKY_MODE_REALTIME) {
-			sky->reflection.create_reflection_fast_filter(storage, sky_use_cubemap_array);
+			sky->reflection.create_reflection_fast_filter(sky_use_cubemap_array);
 			if (sky_use_cubemap_array) {
 			if (sky_use_cubemap_array) {
-				sky->reflection.update_reflection_mipmaps(storage, 0, sky->reflection.layers.size());
+				sky->reflection.update_reflection_mipmaps(0, sky->reflection.layers.size());
 			}
 			}
 		} else {
 		} else {
 			if (update_single_frame) {
 			if (update_single_frame) {
 				for (int i = 1; i < max_processing_layer; i++) {
 				for (int i = 1; i < max_processing_layer; i++) {
-					sky->reflection.create_reflection_importance_sample(storage, sky_use_cubemap_array, 10, i, sky_ggx_samples_quality);
+					sky->reflection.create_reflection_importance_sample(sky_use_cubemap_array, 10, i, sky_ggx_samples_quality);
 				}
 				}
 				if (sky_use_cubemap_array) {
 				if (sky_use_cubemap_array) {
-					sky->reflection.update_reflection_mipmaps(storage, 0, sky->reflection.layers.size());
+					sky->reflection.update_reflection_mipmaps(0, sky->reflection.layers.size());
 				}
 				}
 			} else {
 			} else {
 				if (sky_use_cubemap_array) {
 				if (sky_use_cubemap_array) {
 					// Multi-Frame so just update the first array level
 					// Multi-Frame so just update the first array level
-					sky->reflection.update_reflection_mipmaps(storage, 0, 1);
+					sky->reflection.update_reflection_mipmaps(0, 1);
 				}
 				}
 			}
 			}
 			sky->processing_layer = 1;
 			sky->processing_layer = 1;
@@ -1455,10 +1455,10 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
 
 
 	} else {
 	} else {
 		if (sky_mode == RS::SKY_MODE_INCREMENTAL && sky->processing_layer < max_processing_layer) {
 		if (sky_mode == RS::SKY_MODE_INCREMENTAL && sky->processing_layer < max_processing_layer) {
-			sky->reflection.create_reflection_importance_sample(storage, sky_use_cubemap_array, 10, sky->processing_layer, sky_ggx_samples_quality);
+			sky->reflection.create_reflection_importance_sample(sky_use_cubemap_array, 10, sky->processing_layer, sky_ggx_samples_quality);
 
 
 			if (sky_use_cubemap_array) {
 			if (sky_use_cubemap_array) {
-				sky->reflection.update_reflection_mipmaps(storage, sky->processing_layer, sky->processing_layer + 1);
+				sky->reflection.update_reflection_mipmaps(sky->processing_layer, sky->processing_layer + 1);
 			}
 			}
 
 
 			sky->processing_layer++;
 			sky->processing_layer++;
@@ -1536,7 +1536,7 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
 	if (shader_data->uses_quarter_res) {
 	if (shader_data->uses_quarter_res) {
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_QUARTER_RES_MULTIVIEW : SKY_VERSION_QUARTER_RES];
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_QUARTER_RES_MULTIVIEW : SKY_VERSION_QUARTER_RES];
 
 
-		RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_QUARTER_RES, sky_shader.default_shader_rd);
+		RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_QUARTER_RES, sky_shader.default_shader_rd);
 
 
 		Vector<Color> clear_colors;
 		Vector<Color> clear_colors;
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
@@ -1549,7 +1549,7 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
 	if (shader_data->uses_half_res) {
 	if (shader_data->uses_half_res) {
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_HALF_RES_MULTIVIEW : SKY_VERSION_HALF_RES];
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_HALF_RES_MULTIVIEW : SKY_VERSION_HALF_RES];
 
 
-		RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_HALF_RES, sky_shader.default_shader_rd);
+		RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_HALF_RES, sky_shader.default_shader_rd);
 
 
 		Vector<Color> clear_colors;
 		Vector<Color> clear_colors;
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
@@ -1563,7 +1563,7 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
 
 
 	RID texture_uniform_set;
 	RID texture_uniform_set;
 	if (sky) {
 	if (sky) {
-		texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_BACKGROUND, sky_shader.default_shader_rd);
+		texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_BACKGROUND, sky_shader.default_shader_rd);
 	} else {
 	} else {
 		texture_uniform_set = sky_scene_state.fog_only_texture_uniform_set;
 		texture_uniform_set = sky_scene_state.fog_only_texture_uniform_set;
 	}
 	}
@@ -1634,7 +1634,7 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
 	if (shader_data->uses_quarter_res) {
 	if (shader_data->uses_quarter_res) {
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_QUARTER_RES_MULTIVIEW : SKY_VERSION_QUARTER_RES];
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_QUARTER_RES_MULTIVIEW : SKY_VERSION_QUARTER_RES];
 
 
-		RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_QUARTER_RES, sky_shader.default_shader_rd);
+		RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_QUARTER_RES, sky_shader.default_shader_rd);
 
 
 		Vector<Color> clear_colors;
 		Vector<Color> clear_colors;
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
@@ -1647,7 +1647,7 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
 	if (shader_data->uses_half_res) {
 	if (shader_data->uses_half_res) {
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_HALF_RES_MULTIVIEW : SKY_VERSION_HALF_RES];
 		PipelineCacheRD *pipeline = &shader_data->pipelines[view_count > 1 ? SKY_VERSION_HALF_RES_MULTIVIEW : SKY_VERSION_HALF_RES];
 
 
-		RID texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_HALF_RES, sky_shader.default_shader_rd);
+		RID texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_HALF_RES, sky_shader.default_shader_rd);
 
 
 		Vector<Color> clear_colors;
 		Vector<Color> clear_colors;
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
 		clear_colors.push_back(Color(0.0, 0.0, 0.0));
@@ -1729,7 +1729,7 @@ void RendererSceneSkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironme
 
 
 	RID texture_uniform_set;
 	RID texture_uniform_set;
 	if (sky) {
 	if (sky) {
-		texture_uniform_set = sky->get_textures(storage, SKY_TEXTURE_SET_BACKGROUND, sky_shader.default_shader_rd);
+		texture_uniform_set = sky->get_textures(SKY_TEXTURE_SET_BACKGROUND, sky_shader.default_shader_rd);
 	} else {
 	} else {
 		texture_uniform_set = sky_scene_state.fog_only_texture_uniform_set;
 		texture_uniform_set = sky_scene_state.fog_only_texture_uniform_set;
 	}
 	}
@@ -1777,7 +1777,7 @@ void RendererSceneSkyRD::update_dirty_skys() {
 
 
 				sky->radiance = RD::get_singleton()->texture_create(tf, RD::TextureView());
 				sky->radiance = RD::get_singleton()->texture_create(tf, RD::TextureView());
 
 
-				sky->reflection.update_reflection_data(storage, sky->radiance_size, mipmaps, true, sky->radiance, 0, sky->mode == RS::SKY_MODE_REALTIME, roughness_layers, texture_format);
+				sky->reflection.update_reflection_data(sky->radiance_size, mipmaps, true, sky->radiance, 0, sky->mode == RS::SKY_MODE_REALTIME, roughness_layers, texture_format);
 
 
 			} else {
 			} else {
 				//regular cubemap, lower quality (aliasing, less memory)
 				//regular cubemap, lower quality (aliasing, less memory)
@@ -1792,7 +1792,7 @@ void RendererSceneSkyRD::update_dirty_skys() {
 
 
 				sky->radiance = RD::get_singleton()->texture_create(tf, RD::TextureView());
 				sky->radiance = RD::get_singleton()->texture_create(tf, RD::TextureView());
 
 
-				sky->reflection.update_reflection_data(storage, sky->radiance_size, MIN(mipmaps, layers), false, sky->radiance, 0, sky->mode == RS::SKY_MODE_REALTIME, roughness_layers, texture_format);
+				sky->reflection.update_reflection_data(sky->radiance_size, MIN(mipmaps, layers), false, sky->radiance, 0, sky->mode == RS::SKY_MODE_REALTIME, roughness_layers, texture_format);
 			}
 			}
 			texture_set_dirty = true;
 			texture_set_dirty = true;
 		}
 		}
@@ -1872,7 +1872,7 @@ void RendererSceneSkyRD::free_sky(RID p_sky) {
 	Sky *sky = get_sky(p_sky);
 	Sky *sky = get_sky(p_sky);
 	ERR_FAIL_COND(!sky);
 	ERR_FAIL_COND(!sky);
 
 
-	sky->free(storage);
+	sky->free();
 	sky_owner.free(p_sky);
 	sky_owner.free(p_sky);
 }
 }
 
 

+ 10 - 9
servers/rendering/renderer_rd/renderer_scene_sky_rd.h

@@ -33,11 +33,13 @@
 
 
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "servers/rendering/renderer_compositor.h"
 #include "servers/rendering/renderer_compositor.h"
+#include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
 #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/shaders/sky.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/sky.glsl.gen.h"
+#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_scene_render.h"
 #include "servers/rendering/renderer_scene_render.h"
 #include "servers/rendering/rendering_device.h"
 #include "servers/rendering/rendering_device.h"
+#include "servers/rendering/shader_compiler.h"
 
 
 // Forward declare RendererSceneRenderRD so we can pass it into some of our methods, these classes are pretty tightly bound
 // Forward declare RendererSceneRenderRD so we can pass it into some of our methods, these classes are pretty tightly bound
 class RendererSceneRenderRD;
 class RendererSceneRenderRD;
@@ -63,7 +65,6 @@ public:
 	};
 	};
 
 
 private:
 private:
-	RendererStorageRD *storage = nullptr;
 	RD::DataFormat texture_format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
 	RD::DataFormat texture_format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
 
 
 	RID index_buffer;
 	RID index_buffer;
@@ -211,10 +212,10 @@ public:
 		Vector<Layer> layers;
 		Vector<Layer> layers;
 
 
 		void clear_reflection_data();
 		void clear_reflection_data();
-		void update_reflection_data(RendererStorageRD *p_storage, int p_size, int p_mipmaps, bool p_use_array, RID p_base_cube, int p_base_layer, bool p_low_quality, int p_roughness_layers, RD::DataFormat p_texture_format);
-		void create_reflection_fast_filter(RendererStorageRD *p_storage, bool p_use_arrays);
-		void create_reflection_importance_sample(RendererStorageRD *p_storage, bool p_use_arrays, int p_cube_side, int p_base_layer, uint32_t p_sky_ggx_samples_quality);
-		void update_reflection_mipmaps(RendererStorageRD *p_storage, int p_start, int p_end);
+		void update_reflection_data(int p_size, int p_mipmaps, bool p_use_array, RID p_base_cube, int p_base_layer, bool p_low_quality, int p_roughness_layers, RD::DataFormat p_texture_format);
+		void create_reflection_fast_filter(bool p_use_arrays);
+		void create_reflection_importance_sample(bool p_use_arrays, int p_cube_side, int p_base_layer, uint32_t p_sky_ggx_samples_quality);
+		void update_reflection_mipmaps(int p_start, int p_end);
 	};
 	};
 
 
 	/* Sky shader */
 	/* Sky shader */
@@ -267,9 +268,9 @@ public:
 		Vector3 prev_position;
 		Vector3 prev_position;
 		float prev_time;
 		float prev_time;
 
 
-		void free(RendererStorageRD *p_storage);
+		void free();
 
 
-		RID get_textures(RendererStorageRD *p_storage, SkyTextureSetVersion p_version, RID p_default_shader_rd);
+		RID get_textures(SkyTextureSetVersion p_version, RID p_default_shader_rd);
 		bool set_radiance_size(int p_radiance_size);
 		bool set_radiance_size(int p_radiance_size);
 		bool set_mode(RS::SkyMode p_mode);
 		bool set_mode(RS::SkyMode p_mode);
 		bool set_material(RID p_material);
 		bool set_material(RID p_material);
@@ -289,7 +290,7 @@ public:
 	static RendererRD::MaterialData *_create_sky_material_funcs(RendererRD::ShaderData *p_shader);
 	static RendererRD::MaterialData *_create_sky_material_funcs(RendererRD::ShaderData *p_shader);
 
 
 	RendererSceneSkyRD();
 	RendererSceneSkyRD();
-	void init(RendererStorageRD *p_storage);
+	void init();
 	void set_texture_format(RD::DataFormat p_texture_format);
 	void set_texture_format(RD::DataFormat p_texture_format);
 	~RendererSceneSkyRD();
 	~RendererSceneSkyRD();
 
 

+ 0 - 222
servers/rendering/renderer_rd/renderer_storage_rd.h

@@ -1,222 +0,0 @@
-/*************************************************************************/
-/*  renderer_storage_rd.h                                                */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef RENDERING_SERVER_STORAGE_RD_H
-#define RENDERING_SERVER_STORAGE_RD_H
-
-#include "core/templates/list.h"
-#include "core/templates/local_vector.h"
-#include "core/templates/rid_owner.h"
-#include "servers/rendering/renderer_compositor.h"
-#include "servers/rendering/renderer_rd/effects_rd.h"
-#include "servers/rendering/renderer_rd/shaders/environment/voxel_gi_sdf.glsl.gen.h"
-#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
-#include "servers/rendering/renderer_scene_render.h"
-#include "servers/rendering/rendering_device.h"
-#include "servers/rendering/shader_compiler.h"
-
-class RendererStorageRD : public RendererStorage {
-public:
-	static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.basis.rows[0][0];
-		p_array[1] = p_mtx.basis.rows[1][0];
-		p_array[2] = p_mtx.basis.rows[2][0];
-		p_array[3] = 0;
-		p_array[4] = p_mtx.basis.rows[0][1];
-		p_array[5] = p_mtx.basis.rows[1][1];
-		p_array[6] = p_mtx.basis.rows[2][1];
-		p_array[7] = 0;
-		p_array[8] = p_mtx.basis.rows[0][2];
-		p_array[9] = p_mtx.basis.rows[1][2];
-		p_array[10] = p_mtx.basis.rows[2][2];
-		p_array[11] = 0;
-		p_array[12] = p_mtx.origin.x;
-		p_array[13] = p_mtx.origin.y;
-		p_array[14] = p_mtx.origin.z;
-		p_array[15] = 1;
-	}
-
-	static _FORCE_INLINE_ void store_basis_3x4(const Basis &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.rows[0][0];
-		p_array[1] = p_mtx.rows[1][0];
-		p_array[2] = p_mtx.rows[2][0];
-		p_array[3] = 0;
-		p_array[4] = p_mtx.rows[0][1];
-		p_array[5] = p_mtx.rows[1][1];
-		p_array[6] = p_mtx.rows[2][1];
-		p_array[7] = 0;
-		p_array[8] = p_mtx.rows[0][2];
-		p_array[9] = p_mtx.rows[1][2];
-		p_array[10] = p_mtx.rows[2][2];
-		p_array[11] = 0;
-	}
-
-	static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.rows[0][0];
-		p_array[1] = p_mtx.rows[1][0];
-		p_array[2] = p_mtx.rows[2][0];
-		p_array[3] = 0;
-		p_array[4] = p_mtx.rows[0][1];
-		p_array[5] = p_mtx.rows[1][1];
-		p_array[6] = p_mtx.rows[2][1];
-		p_array[7] = 0;
-		p_array[8] = p_mtx.rows[0][2];
-		p_array[9] = p_mtx.rows[1][2];
-		p_array[10] = p_mtx.rows[2][2];
-		p_array[11] = 0;
-	}
-
-	static _FORCE_INLINE_ void store_transform_transposed_3x4(const Transform3D &p_mtx, float *p_array) {
-		p_array[0] = p_mtx.basis.rows[0][0];
-		p_array[1] = p_mtx.basis.rows[0][1];
-		p_array[2] = p_mtx.basis.rows[0][2];
-		p_array[3] = p_mtx.origin.x;
-		p_array[4] = p_mtx.basis.rows[1][0];
-		p_array[5] = p_mtx.basis.rows[1][1];
-		p_array[6] = p_mtx.basis.rows[1][2];
-		p_array[7] = p_mtx.origin.y;
-		p_array[8] = p_mtx.basis.rows[2][0];
-		p_array[9] = p_mtx.basis.rows[2][1];
-		p_array[10] = p_mtx.basis.rows[2][2];
-		p_array[11] = p_mtx.origin.z;
-	}
-
-	static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
-		for (int i = 0; i < 4; i++) {
-			for (int j = 0; j < 4; j++) {
-				p_array[i * 4 + j] = p_mtx.matrix[i][j];
-			}
-		}
-	}
-
-	static _FORCE_INLINE_ void store_soft_shadow_kernel(const float *p_kernel, float *p_array) {
-		for (int i = 0; i < 128; i++) {
-			p_array[i] = p_kernel[i];
-		}
-	}
-
-private:
-	/* FOG VOLUMES */
-
-	struct FogVolume {
-		RID material;
-		Vector3 extents = Vector3(1, 1, 1);
-
-		RS::FogVolumeShape shape = RS::FOG_VOLUME_SHAPE_BOX;
-
-		Dependency dependency;
-	};
-
-	mutable RID_Owner<FogVolume, true> fog_volume_owner;
-
-	/* visibility_notifier */
-
-	struct VisibilityNotifier {
-		AABB aabb;
-		Callable enter_callback;
-		Callable exit_callback;
-		Dependency dependency;
-	};
-
-	mutable RID_Owner<VisibilityNotifier> visibility_notifier_owner;
-
-	/* EFFECTS */
-
-	EffectsRD *effects = nullptr;
-
-public:
-	//internal usage
-
-	void base_update_dependency(RID p_base, DependencyTracker *p_instance);
-
-	/* FOG VOLUMES */
-
-	virtual RID fog_volume_allocate();
-	virtual void fog_volume_initialize(RID p_rid);
-
-	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape);
-	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents);
-	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material);
-	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const;
-	virtual RID fog_volume_get_material(RID p_fog_volume) const;
-	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const;
-	virtual Vector3 fog_volume_get_extents(RID p_fog_volume) const;
-
-	/* VISIBILITY NOTIFIER */
-
-	virtual RID visibility_notifier_allocate();
-	virtual void visibility_notifier_initialize(RID p_notifier);
-	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb);
-	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable);
-
-	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const;
-	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred);
-
-	RS::InstanceType get_base_type(RID p_rid) const;
-
-	bool free(RID p_rid);
-
-	bool has_os_feature(const String &p_feature) const;
-
-	void update_dirty_resources();
-
-	void set_debug_generate_wireframes(bool p_generate) {}
-
-	//keep cached since it can be called form any thread
-	uint64_t texture_mem_cache = 0;
-	uint64_t buffer_mem_cache = 0;
-	uint64_t total_mem_cache = 0;
-
-	virtual void update_memory_info();
-	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info);
-
-	String get_video_adapter_name() const;
-	String get_video_adapter_vendor() const;
-	RenderingDevice::DeviceType get_video_adapter_type() const;
-	String get_video_adapter_api_version() const;
-
-	virtual void capture_timestamps_begin();
-	virtual void capture_timestamp(const String &p_name);
-	virtual uint32_t get_captured_timestamps_count() const;
-	virtual uint64_t get_captured_timestamps_frame() const;
-	virtual uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const;
-	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const;
-	virtual String get_captured_timestamp_name(uint32_t p_index) const;
-
-	static RendererStorageRD *base_singleton;
-
-	void init_effects(bool p_prefer_raster_effects);
-	EffectsRD *get_effects();
-
-	RendererStorageRD();
-	~RendererStorageRD();
-};
-
-#endif // RASTERIZER_STORAGE_RD_H

+ 19 - 19
servers/rendering/renderer_rd/storage_rd/light_storage.cpp

@@ -156,12 +156,12 @@ void LightStorage::light_set_param(RID p_light, RS::LightParam p_param, float p_
 		case RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE:
 		case RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE:
 		case RS::LIGHT_PARAM_SHADOW_BIAS: {
 		case RS::LIGHT_PARAM_SHADOW_BIAS: {
 			light->version++;
 			light->version++;
-			light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+			light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 		} break;
 		} break;
 		case RS::LIGHT_PARAM_SIZE: {
 		case RS::LIGHT_PARAM_SIZE: {
 			if ((light->param[p_param] > CMP_EPSILON) != (p_value > CMP_EPSILON)) {
 			if ((light->param[p_param] > CMP_EPSILON) != (p_value > CMP_EPSILON)) {
 				//changing from no size to size and the opposite
 				//changing from no size to size and the opposite
-				light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
+				light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
 			}
 			}
 		} break;
 		} break;
 		default: {
 		default: {
@@ -177,7 +177,7 @@ void LightStorage::light_set_shadow(RID p_light, bool p_enabled) {
 	light->shadow = p_enabled;
 	light->shadow = p_enabled;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_projector(RID p_light, RID p_texture) {
 void LightStorage::light_set_projector(RID p_light, RID p_texture) {
@@ -199,7 +199,7 @@ void LightStorage::light_set_projector(RID p_light, RID p_texture) {
 		if (light->projector.is_valid()) {
 		if (light->projector.is_valid()) {
 			texture_storage->texture_add_to_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI);
 			texture_storage->texture_add_to_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI);
 		}
 		}
-		light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
+		light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR);
 	}
 	}
 }
 }
 
 
@@ -217,7 +217,7 @@ void LightStorage::light_set_cull_mask(RID p_light, uint32_t p_mask) {
 	light->cull_mask = p_mask;
 	light->cull_mask = p_mask;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) {
 void LightStorage::light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) {
@@ -237,7 +237,7 @@ void LightStorage::light_set_reverse_cull_face_mode(RID p_light, bool p_enabled)
 	light->reverse_cull = p_enabled;
 	light->reverse_cull = p_enabled;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) {
 void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) {
@@ -247,7 +247,7 @@ void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mod
 	light->bake_mode = p_bake_mode;
 	light->bake_mode = p_bake_mode;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade) {
 void LightStorage::light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade) {
@@ -257,7 +257,7 @@ void LightStorage::light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade)
 	light->max_sdfgi_cascade = p_cascade;
 	light->max_sdfgi_cascade = p_cascade;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMode p_mode) {
 void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMode p_mode) {
@@ -267,7 +267,7 @@ void LightStorage::light_omni_set_shadow_mode(RID p_light, RS::LightOmniShadowMo
 	light->omni_shadow_mode = p_mode;
 	light->omni_shadow_mode = p_mode;
 
 
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 RS::LightOmniShadowMode LightStorage::light_omni_get_shadow_mode(RID p_light) {
 RS::LightOmniShadowMode LightStorage::light_omni_get_shadow_mode(RID p_light) {
@@ -283,7 +283,7 @@ void LightStorage::light_directional_set_shadow_mode(RID p_light, RS::LightDirec
 
 
 	light->directional_shadow_mode = p_mode;
 	light->directional_shadow_mode = p_mode;
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable) {
 void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable) {
@@ -292,7 +292,7 @@ void LightStorage::light_directional_set_blend_splits(RID p_light, bool p_enable
 
 
 	light->directional_blend_splits = p_enable;
 	light->directional_blend_splits = p_enable;
 	light->version++;
 	light->version++;
-	light->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_LIGHT);
+	light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
 }
 }
 
 
 bool LightStorage::light_directional_get_blend_splits(RID p_light) const {
 bool LightStorage::light_directional_get_blend_splits(RID p_light) const {
@@ -387,7 +387,7 @@ void LightStorage::reflection_probe_set_update_mode(RID p_probe, RS::ReflectionP
 	ERR_FAIL_COND(!reflection_probe);
 	ERR_FAIL_COND(!reflection_probe);
 
 
 	reflection_probe->update_mode = p_mode;
 	reflection_probe->update_mode = p_mode;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_intensity(RID p_probe, float p_intensity) {
 void LightStorage::reflection_probe_set_intensity(RID p_probe, float p_intensity) {
@@ -424,7 +424,7 @@ void LightStorage::reflection_probe_set_max_distance(RID p_probe, float p_distan
 
 
 	reflection_probe->max_distance = p_distance;
 	reflection_probe->max_distance = p_distance;
 
 
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_extents(RID p_probe, const Vector3 &p_extents) {
 void LightStorage::reflection_probe_set_extents(RID p_probe, const Vector3 &p_extents) {
@@ -435,7 +435,7 @@ void LightStorage::reflection_probe_set_extents(RID p_probe, const Vector3 &p_ex
 		return;
 		return;
 	}
 	}
 	reflection_probe->extents = p_extents;
 	reflection_probe->extents = p_extents;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_origin_offset(RID p_probe, const Vector3 &p_offset) {
 void LightStorage::reflection_probe_set_origin_offset(RID p_probe, const Vector3 &p_offset) {
@@ -443,7 +443,7 @@ void LightStorage::reflection_probe_set_origin_offset(RID p_probe, const Vector3
 	ERR_FAIL_COND(!reflection_probe);
 	ERR_FAIL_COND(!reflection_probe);
 
 
 	reflection_probe->origin_offset = p_offset;
 	reflection_probe->origin_offset = p_offset;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_as_interior(RID p_probe, bool p_enable) {
 void LightStorage::reflection_probe_set_as_interior(RID p_probe, bool p_enable) {
@@ -451,7 +451,7 @@ void LightStorage::reflection_probe_set_as_interior(RID p_probe, bool p_enable)
 	ERR_FAIL_COND(!reflection_probe);
 	ERR_FAIL_COND(!reflection_probe);
 
 
 	reflection_probe->interior = p_enable;
 	reflection_probe->interior = p_enable;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_enable_box_projection(RID p_probe, bool p_enable) {
 void LightStorage::reflection_probe_set_enable_box_projection(RID p_probe, bool p_enable) {
@@ -466,7 +466,7 @@ void LightStorage::reflection_probe_set_enable_shadows(RID p_probe, bool p_enabl
 	ERR_FAIL_COND(!reflection_probe);
 	ERR_FAIL_COND(!reflection_probe);
 
 
 	reflection_probe->enable_shadows = p_enable;
 	reflection_probe->enable_shadows = p_enable;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) {
 void LightStorage::reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) {
@@ -474,7 +474,7 @@ void LightStorage::reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers
 	ERR_FAIL_COND(!reflection_probe);
 	ERR_FAIL_COND(!reflection_probe);
 
 
 	reflection_probe->cull_mask = p_layers;
 	reflection_probe->cull_mask = p_layers;
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 void LightStorage::reflection_probe_set_resolution(RID p_probe, int p_resolution) {
 void LightStorage::reflection_probe_set_resolution(RID p_probe, int p_resolution) {
@@ -491,7 +491,7 @@ void LightStorage::reflection_probe_set_mesh_lod_threshold(RID p_probe, float p_
 
 
 	reflection_probe->mesh_lod_threshold = p_ratio;
 	reflection_probe->mesh_lod_threshold = p_ratio;
 
 
-	reflection_probe->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE);
+	reflection_probe->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE);
 }
 }
 
 
 AABB LightStorage::reflection_probe_get_aabb(RID p_probe) const {
 AABB LightStorage::reflection_probe_get_aabb(RID p_probe) const {

+ 4 - 3
servers/rendering/renderer_rd/storage_rd/light_storage.h

@@ -35,6 +35,7 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/storage/light_storage.h"
 #include "servers/rendering/storage/light_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererRD {
 namespace RendererRD {
 
 
@@ -61,7 +62,7 @@ struct Light {
 	RS::LightDirectionalSkyMode directional_sky_mode = RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_AND_SKY;
 	RS::LightDirectionalSkyMode directional_sky_mode = RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_AND_SKY;
 	uint64_t version = 0;
 	uint64_t version = 0;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* REFLECTION PROBE */
 /* REFLECTION PROBE */
@@ -82,7 +83,7 @@ struct ReflectionProbe {
 	uint32_t cull_mask = (1 << 20) - 1;
 	uint32_t cull_mask = (1 << 20) - 1;
 	float mesh_lod_threshold = 0.01;
 	float mesh_lod_threshold = 0.01;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* LIGHTMAP */
 /* LIGHTMAP */
@@ -104,7 +105,7 @@ struct Lightmap {
 		int32_t over = EMPTY_LEAF, under = EMPTY_LEAF;
 		int32_t over = EMPTY_LEAF, under = EMPTY_LEAF;
 	};
 	};
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 class LightStorage : public RendererLightStorage {
 class LightStorage : public RendererLightStorage {

+ 7 - 7
servers/rendering/renderer_rd/storage_rd/material_storage.cpp

@@ -2346,7 +2346,7 @@ void MaterialStorage::shader_set_code(RID p_shader, const String &p_code) {
 
 
 	for (Material *E : shader->owners) {
 	for (Material *E : shader->owners) {
 		Material *material = E;
 		Material *material = E;
-		material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+		material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 		_material_queue_update(material, true, true);
 		_material_queue_update(material, true, true);
 	}
 	}
 }
 }
@@ -2436,7 +2436,7 @@ void MaterialStorage::_material_uniform_set_erased(void *p_material) {
 			// if a texture is deleted, so re-create it.
 			// if a texture is deleted, so re-create it.
 			MaterialStorage::get_singleton()->_material_queue_update(material, false, true);
 			MaterialStorage::get_singleton()->_material_queue_update(material, false, true);
 		}
 		}
-		material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+		material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 	}
 	}
 }
 }
 
 
@@ -2466,7 +2466,7 @@ void MaterialStorage::_update_queued_materials() {
 
 
 		if (uniforms_changed) {
 		if (uniforms_changed) {
 			//some implementations such as 3D renderer cache the matreial uniform set, so update is required
 			//some implementations such as 3D renderer cache the matreial uniform set, so update is required
-			material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+			material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 		}
 		}
 	}
 	}
 }
 }
@@ -2507,7 +2507,7 @@ void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
 	}
 	}
 
 
 	if (p_shader.is_null()) {
 	if (p_shader.is_null()) {
-		material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+		material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 		material->shader_id = 0;
 		material->shader_id = 0;
 		return;
 		return;
 	}
 	}
@@ -2530,7 +2530,7 @@ void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
 	material->data->set_next_pass(material->next_pass);
 	material->data->set_next_pass(material->next_pass);
 	material->data->set_render_priority(material->priority);
 	material->data->set_render_priority(material->priority);
 	//updating happens later
 	//updating happens later
-	material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 	_material_queue_update(material, true, true);
 	_material_queue_update(material, true, true);
 }
 }
 
 
@@ -2576,7 +2576,7 @@ void MaterialStorage::material_set_next_pass(RID p_material, RID p_next_material
 		material->data->set_next_pass(p_next_material);
 		material->data->set_next_pass(p_next_material);
 	}
 	}
 
 
-	material->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 }
 }
 
 
 void MaterialStorage::material_set_render_priority(RID p_material, int priority) {
 void MaterialStorage::material_set_render_priority(RID p_material, int priority) {
@@ -2626,7 +2626,7 @@ void MaterialStorage::material_get_instance_shader_parameters(RID p_material, Li
 	}
 	}
 }
 }
 
 
-void MaterialStorage::material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) {
+void MaterialStorage::material_update_dependency(RID p_material, DependencyTracker *p_instance) {
 	Material *material = material_owner.get_or_null(p_material);
 	Material *material = material_owner.get_or_null(p_material);
 	ERR_FAIL_COND(!material);
 	ERR_FAIL_COND(!material);
 	p_instance->update_dependency(&material->dependency);
 	p_instance->update_dependency(&material->dependency);

+ 84 - 2
servers/rendering/renderer_rd/storage_rd/material_storage.h

@@ -31,12 +31,14 @@
 #ifndef MATERIAL_STORAGE_RD_H
 #ifndef MATERIAL_STORAGE_RD_H
 #define MATERIAL_STORAGE_RD_H
 #define MATERIAL_STORAGE_RD_H
 
 
+#include "core/math/camera_matrix.h"
 #include "core/templates/local_vector.h"
 #include "core/templates/local_vector.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_language.h"
 #include "servers/rendering/shader_language.h"
 #include "servers/rendering/storage/material_storage.h"
 #include "servers/rendering/storage/material_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererRD {
 namespace RendererRD {
 
 
@@ -125,7 +127,7 @@ struct Material {
 	RID next_pass;
 	RID next_pass;
 	SelfList<Material> update_element;
 	SelfList<Material> update_element;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 
 
 	Material() :
 	Material() :
 			update_element(this) {}
 			update_element(this) {}
@@ -232,6 +234,86 @@ public:
 	MaterialStorage();
 	MaterialStorage();
 	virtual ~MaterialStorage();
 	virtual ~MaterialStorage();
 
 
+	/* Helpers */
+
+	static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.basis.rows[0][0];
+		p_array[1] = p_mtx.basis.rows[1][0];
+		p_array[2] = p_mtx.basis.rows[2][0];
+		p_array[3] = 0;
+		p_array[4] = p_mtx.basis.rows[0][1];
+		p_array[5] = p_mtx.basis.rows[1][1];
+		p_array[6] = p_mtx.basis.rows[2][1];
+		p_array[7] = 0;
+		p_array[8] = p_mtx.basis.rows[0][2];
+		p_array[9] = p_mtx.basis.rows[1][2];
+		p_array[10] = p_mtx.basis.rows[2][2];
+		p_array[11] = 0;
+		p_array[12] = p_mtx.origin.x;
+		p_array[13] = p_mtx.origin.y;
+		p_array[14] = p_mtx.origin.z;
+		p_array[15] = 1;
+	}
+
+	static _FORCE_INLINE_ void store_basis_3x4(const Basis &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.rows[0][0];
+		p_array[1] = p_mtx.rows[1][0];
+		p_array[2] = p_mtx.rows[2][0];
+		p_array[3] = 0;
+		p_array[4] = p_mtx.rows[0][1];
+		p_array[5] = p_mtx.rows[1][1];
+		p_array[6] = p_mtx.rows[2][1];
+		p_array[7] = 0;
+		p_array[8] = p_mtx.rows[0][2];
+		p_array[9] = p_mtx.rows[1][2];
+		p_array[10] = p_mtx.rows[2][2];
+		p_array[11] = 0;
+	}
+
+	static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.rows[0][0];
+		p_array[1] = p_mtx.rows[1][0];
+		p_array[2] = p_mtx.rows[2][0];
+		p_array[3] = 0;
+		p_array[4] = p_mtx.rows[0][1];
+		p_array[5] = p_mtx.rows[1][1];
+		p_array[6] = p_mtx.rows[2][1];
+		p_array[7] = 0;
+		p_array[8] = p_mtx.rows[0][2];
+		p_array[9] = p_mtx.rows[1][2];
+		p_array[10] = p_mtx.rows[2][2];
+		p_array[11] = 0;
+	}
+
+	static _FORCE_INLINE_ void store_transform_transposed_3x4(const Transform3D &p_mtx, float *p_array) {
+		p_array[0] = p_mtx.basis.rows[0][0];
+		p_array[1] = p_mtx.basis.rows[0][1];
+		p_array[2] = p_mtx.basis.rows[0][2];
+		p_array[3] = p_mtx.origin.x;
+		p_array[4] = p_mtx.basis.rows[1][0];
+		p_array[5] = p_mtx.basis.rows[1][1];
+		p_array[6] = p_mtx.basis.rows[1][2];
+		p_array[7] = p_mtx.origin.y;
+		p_array[8] = p_mtx.basis.rows[2][0];
+		p_array[9] = p_mtx.basis.rows[2][1];
+		p_array[10] = p_mtx.basis.rows[2][2];
+		p_array[11] = p_mtx.origin.z;
+	}
+
+	static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
+		for (int i = 0; i < 4; i++) {
+			for (int j = 0; j < 4; j++) {
+				p_array[i * 4 + j] = p_mtx.matrix[i][j];
+			}
+		}
+	}
+
+	static _FORCE_INLINE_ void store_soft_shadow_kernel(const float *p_kernel, float *p_array) {
+		for (int i = 0; i < 128; i++) {
+			p_array[i] = p_kernel[i];
+		}
+	}
+
 	/* Samplers */
 	/* Samplers */
 
 
 	_FORCE_INLINE_ RID sampler_rd_get_default(RS::CanvasItemTextureFilter p_filter, RS::CanvasItemTextureRepeat p_repeat) {
 	_FORCE_INLINE_ RID sampler_rd_get_default(RS::CanvasItemTextureFilter p_filter, RS::CanvasItemTextureRepeat p_repeat) {
@@ -317,7 +399,7 @@ public:
 
 
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
 
 
-	virtual void material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) override;
+	virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override;
 
 
 	void material_set_data_request_function(ShaderType p_shader_type, MaterialDataRequestFunction p_function);
 	void material_set_data_request_function(ShaderType p_shader_type, MaterialDataRequestFunction p_function);
 	MaterialDataRequestFunction material_get_data_request_function(ShaderType p_shader_type);
 	MaterialDataRequestFunction material_get_data_request_function(ShaderType p_shader_type);

+ 15 - 15
servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp

@@ -218,7 +218,7 @@ void MeshStorage::mesh_free(RID p_rid) {
 		for (Mesh *E : mesh->shadow_owners) {
 		for (Mesh *E : mesh->shadow_owners) {
 			Mesh *shadow_owner = E;
 			Mesh *shadow_owner = E;
 			shadow_owner->shadow_mesh = RID();
 			shadow_owner->shadow_mesh = RID();
-			shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+			shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 		}
 		}
 	}
 	}
 	mesh_owner.free(p_rid);
 	mesh_owner.free(p_rid);
@@ -429,12 +429,12 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
 		_mesh_instance_add_surface(mi, mesh, mesh->surface_count - 1);
 		_mesh_instance_add_surface(mi, mesh, mesh->surface_count - 1);
 	}
 	}
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 
 
 	for (Mesh *E : mesh->shadow_owners) {
 	for (Mesh *E : mesh->shadow_owners) {
 		Mesh *shadow_owner = E;
 		Mesh *shadow_owner = E;
 		shadow_owner->shadow_mesh = RID();
 		shadow_owner->shadow_mesh = RID();
-		shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+		shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 	}
 	}
 
 
 	mesh->material_cache.clear();
 	mesh->material_cache.clear();
@@ -501,7 +501,7 @@ void MeshStorage::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_mat
 	ERR_FAIL_UNSIGNED_INDEX((uint32_t)p_surface, mesh->surface_count);
 	ERR_FAIL_UNSIGNED_INDEX((uint32_t)p_surface, mesh->surface_count);
 	mesh->surfaces[p_surface]->material = p_material;
 	mesh->surfaces[p_surface]->material = p_material;
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MATERIAL);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
 	mesh->material_cache.clear();
 	mesh->material_cache.clear();
 }
 }
 
 
@@ -692,7 +692,7 @@ void MeshStorage::mesh_set_shadow_mesh(RID p_mesh, RID p_shadow_mesh) {
 		shadow_mesh->shadow_owners.insert(mesh);
 		shadow_mesh->shadow_owners.insert(mesh);
 	}
 	}
 
 
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 }
 }
 
 
 void MeshStorage::mesh_clear(RID p_mesh) {
 void MeshStorage::mesh_clear(RID p_mesh) {
@@ -740,12 +740,12 @@ void MeshStorage::mesh_clear(RID p_mesh) {
 		_mesh_instance_clear(mi);
 		_mesh_instance_clear(mi);
 	}
 	}
 	mesh->has_bone_weights = false;
 	mesh->has_bone_weights = false;
-	mesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 
 
 	for (Mesh *E : mesh->shadow_owners) {
 	for (Mesh *E : mesh->shadow_owners) {
 		Mesh *shadow_owner = E;
 		Mesh *shadow_owner = E;
 		shadow_owner->shadow_mesh = RID();
 		shadow_owner->shadow_mesh = RID();
-		shadow_owner->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+		shadow_owner->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 	}
 	}
 }
 }
 
 
@@ -1209,7 +1209,7 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS::
 		multimesh->buffer = RD::get_singleton()->storage_buffer_create(multimesh->instances * multimesh->stride_cache * 4);
 		multimesh->buffer = RD::get_singleton()->storage_buffer_create(multimesh->instances * multimesh->stride_cache * 4);
 	}
 	}
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MULTIMESH);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH);
 }
 }
 
 
 int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const {
 int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const {
@@ -1243,7 +1243,7 @@ void MeshStorage::multimesh_set_mesh(RID p_multimesh, RID p_mesh) {
 		}
 		}
 	}
 	}
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MESH);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
 }
 }
 
 
 #define MULTIMESH_DIRTY_REGION_SIZE 512
 #define MULTIMESH_DIRTY_REGION_SIZE 512
@@ -1602,7 +1602,7 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b
 		const float *data = p_buffer.ptr();
 		const float *data = p_buffer.ptr();
 
 
 		_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
 		_multimesh_re_create_aabb(multimesh, data, multimesh->instances);
-		multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+		multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 	}
 	}
 }
 }
 
 
@@ -1644,7 +1644,7 @@ void MeshStorage::multimesh_set_visible_instances(RID p_multimesh, int p_visible
 
 
 	multimesh->visible_instances = p_visible;
 	multimesh->visible_instances = p_visible;
 
 
-	multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES);
+	multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES);
 }
 }
 
 
 int MeshStorage::multimesh_get_visible_instances(RID p_multimesh) const {
 int MeshStorage::multimesh_get_visible_instances(RID p_multimesh) const {
@@ -1703,7 +1703,7 @@ void MeshStorage::_update_dirty_multimeshes() {
 				//aabb is dirty..
 				//aabb is dirty..
 				_multimesh_re_create_aabb(multimesh, data, visible_instances);
 				_multimesh_re_create_aabb(multimesh, data, visible_instances);
 				multimesh->aabb_dirty = false;
 				multimesh->aabb_dirty = false;
-				multimesh->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+				multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 			}
 			}
 		}
 		}
 
 
@@ -1781,7 +1781,7 @@ void MeshStorage::skeleton_allocate_data(RID p_skeleton, int p_bones, bool p_2d_
 		}
 		}
 	}
 	}
 
 
-	skeleton->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_SKELETON_DATA);
+	skeleton->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_SKELETON_DATA);
 }
 }
 
 
 int MeshStorage::skeleton_get_bone_count(RID p_skeleton) const {
 int MeshStorage::skeleton_get_bone_count(RID p_skeleton) const {
@@ -1902,7 +1902,7 @@ void MeshStorage::_update_dirty_skeletons() {
 
 
 		skeleton_dirty_list = skeleton->dirty_list;
 		skeleton_dirty_list = skeleton->dirty_list;
 
 
-		skeleton->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_SKELETON_BONES);
+		skeleton->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_SKELETON_BONES);
 
 
 		skeleton->version++;
 		skeleton->version++;
 
 
@@ -1913,7 +1913,7 @@ void MeshStorage::_update_dirty_skeletons() {
 	skeleton_dirty_list = nullptr;
 	skeleton_dirty_list = nullptr;
 }
 }
 
 
-void MeshStorage::skeleton_update_dependency(RID p_skeleton, RendererStorage::DependencyTracker *p_instance) {
+void MeshStorage::skeleton_update_dependency(RID p_skeleton, DependencyTracker *p_instance) {
 	Skeleton *skeleton = skeleton_owner.get_or_null(p_skeleton);
 	Skeleton *skeleton = skeleton_owner.get_or_null(p_skeleton);
 	ERR_FAIL_COND(!skeleton);
 	ERR_FAIL_COND(!skeleton);
 
 

+ 5 - 5
servers/rendering/renderer_rd/storage_rd/mesh_storage.h

@@ -35,8 +35,8 @@
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "core/templates/self_list.h"
 #include "core/templates/self_list.h"
 #include "servers/rendering/renderer_rd/shaders/skeleton.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/skeleton.glsl.gen.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererRD {
 namespace RendererRD {
 
 
@@ -143,7 +143,7 @@ struct Mesh {
 	RID shadow_mesh;
 	RID shadow_mesh;
 	HashSet<Mesh *> shadow_owners;
 	HashSet<Mesh *> shadow_owners;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* Mesh Instance */
 /* Mesh Instance */
@@ -199,7 +199,7 @@ struct MultiMesh {
 	bool dirty = false;
 	bool dirty = false;
 	MultiMesh *dirty_list = nullptr;
 	MultiMesh *dirty_list = nullptr;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 /* Skeleton */
 /* Skeleton */
@@ -256,7 +256,7 @@ struct Skeleton {
 
 
 	uint64_t version = 1;
 	uint64_t version = 1;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 class MeshStorage : public RendererMeshStorage {
 class MeshStorage : public RendererMeshStorage {
@@ -672,7 +672,7 @@ public:
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override;
 	virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) override;
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override;
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const override;
 
 
-	virtual void skeleton_update_dependency(RID p_skeleton, RendererStorage::DependencyTracker *p_instance) override;
+	virtual void skeleton_update_dependency(RID p_skeleton, DependencyTracker *p_instance) override;
 
 
 	void _update_dirty_skeletons();
 	void _update_dirty_skeletons();
 
 

+ 21 - 22
servers/rendering/renderer_rd/storage_rd/particles_storage.cpp

@@ -30,7 +30,6 @@
 
 
 #include "particles_storage.h"
 #include "particles_storage.h"
 #include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
 #include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "texture_storage.h"
 #include "texture_storage.h"
 
 
@@ -321,7 +320,7 @@ void ParticlesStorage::particles_set_amount(RID p_particles, int p_amount) {
 	particles->prev_phase = 0;
 	particles->prev_phase = 0;
 	particles->clear = true;
 	particles->clear = true;
 
 
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES);
 }
 }
 
 
 void ParticlesStorage::particles_set_lifetime(RID p_particles, double p_lifetime) {
 void ParticlesStorage::particles_set_lifetime(RID p_particles, double p_lifetime) {
@@ -356,7 +355,7 @@ void ParticlesStorage::particles_set_custom_aabb(RID p_particles, const AABB &p_
 	Particles *particles = particles_owner.get_or_null(p_particles);
 	Particles *particles = particles_owner.get_or_null(p_particles);
 	ERR_FAIL_COND(!particles);
 	ERR_FAIL_COND(!particles);
 	particles->custom_aabb = p_aabb;
 	particles->custom_aabb = p_aabb;
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void ParticlesStorage::particles_set_speed_scale(RID p_particles, double p_scale) {
 void ParticlesStorage::particles_set_speed_scale(RID p_particles, double p_scale) {
@@ -370,7 +369,7 @@ void ParticlesStorage::particles_set_use_local_coordinates(RID p_particles, bool
 	ERR_FAIL_COND(!particles);
 	ERR_FAIL_COND(!particles);
 
 
 	particles->use_local_coords = p_enable;
 	particles->use_local_coords = p_enable;
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES);
 }
 }
 
 
 void ParticlesStorage::particles_set_fixed_fps(RID p_particles, int p_fps) {
 void ParticlesStorage::particles_set_fixed_fps(RID p_particles, int p_fps) {
@@ -386,7 +385,7 @@ void ParticlesStorage::particles_set_fixed_fps(RID p_particles, int p_fps) {
 	particles->prev_phase = 0;
 	particles->prev_phase = 0;
 	particles->clear = true;
 	particles->clear = true;
 
 
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES);
 }
 }
 
 
 void ParticlesStorage::particles_set_interpolate(RID p_particles, bool p_enable) {
 void ParticlesStorage::particles_set_interpolate(RID p_particles, bool p_enable) {
@@ -419,7 +418,7 @@ void ParticlesStorage::particles_set_trails(RID p_particles, bool p_enable, doub
 	particles->prev_phase = 0;
 	particles->prev_phase = 0;
 	particles->clear = true;
 	particles->clear = true;
 
 
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES);
 }
 }
 
 
 void ParticlesStorage::particles_set_trail_bind_poses(RID p_particles, const Vector<Transform3D> &p_bind_poses) {
 void ParticlesStorage::particles_set_trail_bind_poses(RID p_particles, const Vector<Transform3D> &p_bind_poses) {
@@ -436,7 +435,7 @@ void ParticlesStorage::particles_set_trail_bind_poses(RID p_particles, const Vec
 	particles->trail_bind_poses = p_bind_poses;
 	particles->trail_bind_poses = p_bind_poses;
 	particles->trail_bind_poses_dirty = true;
 	particles->trail_bind_poses_dirty = true;
 
 
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES);
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES);
 }
 }
 
 
 void ParticlesStorage::particles_set_collision_base_size(RID p_particles, real_t p_size) {
 void ParticlesStorage::particles_set_collision_base_size(RID p_particles, real_t p_size) {
@@ -458,7 +457,7 @@ void ParticlesStorage::particles_set_process_material(RID p_particles, RID p_mat
 	ERR_FAIL_COND(!particles);
 	ERR_FAIL_COND(!particles);
 
 
 	particles->process_material = p_material;
 	particles->process_material = p_material;
-	particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_PARTICLES); //the instance buffer may have changed
+	particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES); //the instance buffer may have changed
 }
 }
 
 
 RID ParticlesStorage::particles_get_process_material(RID p_particles) const {
 RID ParticlesStorage::particles_get_process_material(RID p_particles) const {
@@ -545,7 +544,7 @@ void ParticlesStorage::particles_emit(RID p_particles, const Transform3D &p_tran
 
 
 	int32_t idx = particles->emission_buffer->particle_count;
 	int32_t idx = particles->emission_buffer->particle_count;
 	if (idx < particles->emission_buffer->particle_max) {
 	if (idx < particles->emission_buffer->particle_max) {
-		RendererStorageRD::store_transform(p_transform, particles->emission_buffer->data[idx].xform);
+		RendererRD::MaterialStorage::store_transform(p_transform, particles->emission_buffer->data[idx].xform);
 
 
 		particles->emission_buffer->data[idx].velocity[0] = p_velocity.x;
 		particles->emission_buffer->data[idx].velocity[0] = p_velocity.x;
 		particles->emission_buffer->data[idx].velocity[1] = p_velocity.y;
 		particles->emission_buffer->data[idx].velocity[1] = p_velocity.y;
@@ -766,9 +765,9 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta
 	frame_params.randomness = p_particles->randomness;
 	frame_params.randomness = p_particles->randomness;
 
 
 	if (p_particles->use_local_coords) {
 	if (p_particles->use_local_coords) {
-		RendererStorageRD::store_transform(Transform3D(), frame_params.emission_transform);
+		RendererRD::MaterialStorage::store_transform(Transform3D(), frame_params.emission_transform);
 	} else {
 	} else {
-		RendererStorageRD::store_transform(p_particles->emission_transform, frame_params.emission_transform);
+		RendererRD::MaterialStorage::store_transform(p_particles->emission_transform, frame_params.emission_transform);
 	}
 	}
 
 
 	frame_params.cycle = p_particles->cycle_number;
 	frame_params.cycle = p_particles->cycle_number;
@@ -858,7 +857,7 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta
 
 
 				ParticlesFrameParams::Attractor &attr = frame_params.attractors[frame_params.attractor_count];
 				ParticlesFrameParams::Attractor &attr = frame_params.attractors[frame_params.attractor_count];
 
 
-				RendererStorageRD::store_transform(to_collider, attr.transform);
+				RendererRD::MaterialStorage::store_transform(to_collider, attr.transform);
 				attr.strength = pc->attractor_strength;
 				attr.strength = pc->attractor_strength;
 				attr.attenuation = pc->attractor_attenuation;
 				attr.attenuation = pc->attractor_attenuation;
 				attr.directionality = pc->attractor_directionality;
 				attr.directionality = pc->attractor_directionality;
@@ -906,7 +905,7 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta
 
 
 				ParticlesFrameParams::Collider &col = frame_params.colliders[frame_params.collider_count];
 				ParticlesFrameParams::Collider &col = frame_params.colliders[frame_params.collider_count];
 
 
-				RendererStorageRD::store_transform(to_collider, col.transform);
+				RendererRD::MaterialStorage::store_transform(to_collider, col.transform);
 				switch (pc->type) {
 				switch (pc->type) {
 					case RS::PARTICLES_COLLISION_TYPE_SPHERE_COLLIDE: {
 					case RS::PARTICLES_COLLISION_TYPE_SPHERE_COLLIDE: {
 						col.type = ParticlesFrameParams::COLLISION_TYPE_SPHERE;
 						col.type = ParticlesFrameParams::COLLISION_TYPE_SPHERE;
@@ -1203,7 +1202,7 @@ void ParticlesStorage::particles_set_view_axis(RID p_particles, const Vector3 &p
 		RD::get_singleton()->compute_list_dispatch_threads(compute_list, particles->amount, 1, 1);
 		RD::get_singleton()->compute_list_dispatch_threads(compute_list, particles->amount, 1, 1);
 
 
 		RD::get_singleton()->compute_list_end();
 		RD::get_singleton()->compute_list_end();
-		RendererStorageRD::base_singleton->get_effects()->sort_buffer(particles->particles_sort_uniform_set, particles->amount);
+		RendererCompositorRD::singleton->get_effects()->sort_buffer(particles->particles_sort_uniform_set, particles->amount);
 	}
 	}
 
 
 	copy_push_constant.total_particles *= copy_push_constant.total_particles;
 	copy_push_constant.total_particles *= copy_push_constant.total_particles;
@@ -1383,7 +1382,7 @@ void ParticlesStorage::update_particles() {
 				}
 				}
 
 
 				for (int i = 0; i < particles->trail_bind_poses.size(); i++) {
 				for (int i = 0; i < particles->trail_bind_poses.size(); i++) {
-					RendererStorageRD::store_transform(particles->trail_bind_poses[i], &particles_shader.pose_update_buffer[i * 16]);
+					RendererRD::MaterialStorage::store_transform(particles->trail_bind_poses[i], &particles_shader.pose_update_buffer[i * 16]);
 				}
 				}
 
 
 				RD::get_singleton()->buffer_update(particles->trail_bind_pose_buffer, 0, particles->trail_bind_poses.size() * 16 * sizeof(float), particles_shader.pose_update_buffer.ptr());
 				RD::get_singleton()->buffer_update(particles->trail_bind_pose_buffer, 0, particles->trail_bind_poses.size() * 16 * sizeof(float), particles_shader.pose_update_buffer.ptr());
@@ -1457,14 +1456,14 @@ void ParticlesStorage::update_particles() {
 				// In local mode, particle positions are calculated locally (relative to the node position)
 				// In local mode, particle positions are calculated locally (relative to the node position)
 				// and they're also drawn locally.
 				// and they're also drawn locally.
 				// It works as expected, so we just pass an identity transform.
 				// It works as expected, so we just pass an identity transform.
-				RendererStorageRD::store_transform(Transform3D(), copy_push_constant.inv_emission_transform);
+				RendererRD::MaterialStorage::store_transform(Transform3D(), copy_push_constant.inv_emission_transform);
 			} else {
 			} else {
 				// In global mode, particle positions are calculated globally (relative to the canvas origin)
 				// In global mode, particle positions are calculated globally (relative to the canvas origin)
 				// but they're drawn locally.
 				// but they're drawn locally.
 				// So, we need to pass the inverse of the emission transform to bring the
 				// So, we need to pass the inverse of the emission transform to bring the
 				// particles to local coordinates before drawing.
 				// particles to local coordinates before drawing.
 				Transform3D inv = particles->emission_transform.affine_inverse();
 				Transform3D inv = particles->emission_transform.affine_inverse();
-				RendererStorageRD::store_transform(inv, copy_push_constant.inv_emission_transform);
+				RendererRD::MaterialStorage::store_transform(inv, copy_push_constant.inv_emission_transform);
 			}
 			}
 
 
 			copy_push_constant.total_particles = total_amount;
 			copy_push_constant.total_particles = total_amount;
@@ -1500,7 +1499,7 @@ void ParticlesStorage::update_particles() {
 			RD::get_singleton()->compute_list_end();
 			RD::get_singleton()->compute_list_end();
 		}
 		}
 
 
-		particles->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+		particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 	}
 	}
 }
 }
 
 
@@ -1756,7 +1755,7 @@ void ParticlesStorage::particles_collision_set_collision_type(RID p_particles_co
 		particles_collision->heightfield_texture = RID();
 		particles_collision->heightfield_texture = RID();
 	}
 	}
 	particles_collision->type = p_type;
 	particles_collision->type = p_type;
-	particles_collision->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	particles_collision->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void ParticlesStorage::particles_collision_set_cull_mask(RID p_particles_collision, uint32_t p_cull_mask) {
 void ParticlesStorage::particles_collision_set_cull_mask(RID p_particles_collision, uint32_t p_cull_mask) {
@@ -1770,7 +1769,7 @@ void ParticlesStorage::particles_collision_set_sphere_radius(RID p_particles_col
 	ERR_FAIL_COND(!particles_collision);
 	ERR_FAIL_COND(!particles_collision);
 
 
 	particles_collision->radius = p_radius;
 	particles_collision->radius = p_radius;
-	particles_collision->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	particles_collision->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void ParticlesStorage::particles_collision_set_box_extents(RID p_particles_collision, const Vector3 &p_extents) {
 void ParticlesStorage::particles_collision_set_box_extents(RID p_particles_collision, const Vector3 &p_extents) {
@@ -1778,7 +1777,7 @@ void ParticlesStorage::particles_collision_set_box_extents(RID p_particles_colli
 	ERR_FAIL_COND(!particles_collision);
 	ERR_FAIL_COND(!particles_collision);
 
 
 	particles_collision->extents = p_extents;
 	particles_collision->extents = p_extents;
-	particles_collision->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	particles_collision->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void ParticlesStorage::particles_collision_set_attractor_strength(RID p_particles_collision, real_t p_strength) {
 void ParticlesStorage::particles_collision_set_attractor_strength(RID p_particles_collision, real_t p_strength) {
@@ -1812,7 +1811,7 @@ void ParticlesStorage::particles_collision_set_field_texture(RID p_particles_col
 void ParticlesStorage::particles_collision_height_field_update(RID p_particles_collision) {
 void ParticlesStorage::particles_collision_height_field_update(RID p_particles_collision) {
 	ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
 	ParticlesCollision *particles_collision = particles_collision_owner.get_or_null(p_particles_collision);
 	ERR_FAIL_COND(!particles_collision);
 	ERR_FAIL_COND(!particles_collision);
-	particles_collision->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	particles_collision->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void ParticlesStorage::particles_collision_set_height_field_resolution(RID p_particles_collision, RS::ParticlesCollisionHeightfieldResolution p_resolution) {
 void ParticlesStorage::particles_collision_set_height_field_resolution(RID p_particles_collision, RS::ParticlesCollisionHeightfieldResolution p_resolution) {

+ 3 - 3
servers/rendering/renderer_rd/storage_rd/particles_storage.h

@@ -37,9 +37,9 @@
 #include "servers/rendering/renderer_rd/shaders/particles.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/particles.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/particles_copy.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/particles_copy.glsl.gen.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/shader_compiler.h"
 #include "servers/rendering/storage/particles_storage.h"
 #include "servers/rendering/storage/particles_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererRD {
 namespace RendererRD {
 
 
@@ -226,7 +226,7 @@ struct Particles {
 
 
 	HashSet<RID> collisions;
 	HashSet<RID> collisions;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 
 
 	double trail_length = 1.0;
 	double trail_length = 1.0;
 	bool trails_enabled = false;
 	bool trails_enabled = false;
@@ -254,7 +254,7 @@ struct ParticlesCollision {
 
 
 	RS::ParticlesCollisionHeightfieldResolution heightfield_resolution = RS::PARTICLES_COLLISION_HEIGHTFIELD_RESOLUTION_1024;
 	RS::ParticlesCollisionHeightfieldResolution heightfield_resolution = RS::PARTICLES_COLLISION_HEIGHTFIELD_RESOLUTION_1024;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 struct ParticlesCollisionInstance {
 struct ParticlesCollisionInstance {

+ 3 - 3
servers/rendering/renderer_rd/storage_rd/texture_storage.cpp

@@ -1712,7 +1712,7 @@ void TextureStorage::decal_set_extents(RID p_decal, const Vector3 &p_extents) {
 	Decal *decal = decal_owner.get_or_null(p_decal);
 	Decal *decal = decal_owner.get_or_null(p_decal);
 	ERR_FAIL_COND(!decal);
 	ERR_FAIL_COND(!decal);
 	decal->extents = p_extents;
 	decal->extents = p_extents;
-	decal->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	decal->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void TextureStorage::decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID p_texture) {
 void TextureStorage::decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID p_texture) {
@@ -1736,7 +1736,7 @@ void TextureStorage::decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID
 		texture_add_to_decal_atlas(decal->textures[p_type]);
 		texture_add_to_decal_atlas(decal->textures[p_type]);
 	}
 	}
 
 
-	decal->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_DECAL);
+	decal->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_DECAL);
 }
 }
 
 
 void TextureStorage::decal_set_emission_energy(RID p_decal, float p_energy) {
 void TextureStorage::decal_set_emission_energy(RID p_decal, float p_energy) {
@@ -1761,7 +1761,7 @@ void TextureStorage::decal_set_cull_mask(RID p_decal, uint32_t p_layers) {
 	Decal *decal = decal_owner.get_or_null(p_decal);
 	Decal *decal = decal_owner.get_or_null(p_decal);
 	ERR_FAIL_COND(!decal);
 	ERR_FAIL_COND(!decal);
 	decal->cull_mask = p_layers;
 	decal->cull_mask = p_layers;
-	decal->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
+	decal->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
 }
 }
 
 
 void TextureStorage::decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length) {
 void TextureStorage::decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length) {

+ 2 - 2
servers/rendering/renderer_rd/storage_rd/texture_storage.h

@@ -33,8 +33,8 @@
 
 
 #include "core/templates/rid_owner.h"
 #include "core/templates/rid_owner.h"
 #include "servers/rendering/renderer_rd/shaders/canvas_sdf.glsl.gen.h"
 #include "servers/rendering/renderer_rd/shaders/canvas_sdf.glsl.gen.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 namespace RendererRD {
 namespace RendererRD {
 
 
@@ -193,7 +193,7 @@ struct Decal {
 	float distance_fade_length = 1;
 	float distance_fade_length = 1;
 	float normal_fade = 0.0;
 	float normal_fade = 0.0;
 
 
-	RendererStorage::Dependency dependency;
+	Dependency dependency;
 };
 };
 
 
 struct RenderTarget {
 struct RenderTarget {

+ 174 - 256
servers/rendering/renderer_rd/renderer_storage_rd.cpp → servers/rendering/renderer_rd/storage_rd/utilities.cpp

@@ -1,5 +1,5 @@
 /*************************************************************************/
 /*************************************************************************/
-/*  renderer_storage_rd.cpp                                              */
+/*  utilities.cpp                                                        */
 /*************************************************************************/
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
 /*                           GODOT ENGINE                                */
@@ -28,195 +28,29 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-#include "renderer_storage_rd.h"
-
-#include "core/config/engine.h"
-#include "core/config/project_settings.h"
-#include "core/io/resource_loader.h"
-#include "core/math/math_defs.h"
-#include "renderer_compositor_rd.h"
-#include "servers/rendering/renderer_rd/environment/gi.h"
-#include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
-#include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
-#include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
-#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
-#include "servers/rendering/rendering_server_globals.h"
-#include "servers/rendering/shader_language.h"
-
-/* FOG VOLUMES */
-
-RID RendererStorageRD::fog_volume_allocate() {
-	return fog_volume_owner.allocate_rid();
-}
-void RendererStorageRD::fog_volume_initialize(RID p_rid) {
-	fog_volume_owner.initialize_rid(p_rid, FogVolume());
-}
-
-void RendererStorageRD::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND(!fog_volume);
-
-	if (p_shape == fog_volume->shape) {
-		return;
-	}
-
-	fog_volume->shape = p_shape;
-	fog_volume->dependency.changed_notify(DEPENDENCY_CHANGED_AABB);
-}
+#include "utilities.h"
+#include "../environment/fog.h"
+#include "../environment/gi.h"
+#include "light_storage.h"
+#include "mesh_storage.h"
+#include "particles_storage.h"
+#include "texture_storage.h"
 
 
-void RendererStorageRD::fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND(!fog_volume);
+using namespace RendererRD;
 
 
-	fog_volume->extents = p_extents;
-	fog_volume->dependency.changed_notify(DEPENDENCY_CHANGED_AABB);
-}
+Utilities *Utilities::singleton = nullptr;
 
 
-void RendererStorageRD::fog_volume_set_material(RID p_fog_volume, RID p_material) {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND(!fog_volume);
-	fog_volume->material = p_material;
+Utilities::Utilities() {
+	singleton = this;
 }
 }
 
 
-RID RendererStorageRD::fog_volume_get_material(RID p_fog_volume) const {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND_V(!fog_volume, RID());
-
-	return fog_volume->material;
+Utilities::~Utilities() {
+	singleton = nullptr;
 }
 }
 
 
-RS::FogVolumeShape RendererStorageRD::fog_volume_get_shape(RID p_fog_volume) const {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND_V(!fog_volume, RS::FOG_VOLUME_SHAPE_BOX);
-
-	return fog_volume->shape;
-}
+/* INSTANCES */
 
 
-AABB RendererStorageRD::fog_volume_get_aabb(RID p_fog_volume) const {
-	FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND_V(!fog_volume, AABB());
-
-	switch (fog_volume->shape) {
-		case RS::FOG_VOLUME_SHAPE_ELLIPSOID:
-		case RS::FOG_VOLUME_SHAPE_CONE:
-		case RS::FOG_VOLUME_SHAPE_CYLINDER:
-		case RS::FOG_VOLUME_SHAPE_BOX: {
-			AABB aabb;
-			aabb.position = -fog_volume->extents;
-			aabb.size = fog_volume->extents * 2;
-			return aabb;
-		}
-		default: {
-			// Need some size otherwise will get culled
-			return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2));
-		}
-	}
-
-	return AABB();
-}
-
-Vector3 RendererStorageRD::fog_volume_get_extents(RID p_fog_volume) const {
-	const FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
-	ERR_FAIL_COND_V(!fog_volume, Vector3());
-	return fog_volume->extents;
-}
-
-/* VISIBILITY NOTIFIER */
-
-RID RendererStorageRD::visibility_notifier_allocate() {
-	return visibility_notifier_owner.allocate_rid();
-}
-void RendererStorageRD::visibility_notifier_initialize(RID p_notifier) {
-	visibility_notifier_owner.initialize_rid(p_notifier, VisibilityNotifier());
-}
-void RendererStorageRD::visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) {
-	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
-	ERR_FAIL_COND(!vn);
-	vn->aabb = p_aabb;
-	vn->dependency.changed_notify(DEPENDENCY_CHANGED_AABB);
-}
-void RendererStorageRD::visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) {
-	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
-	ERR_FAIL_COND(!vn);
-	vn->enter_callback = p_enter_callbable;
-	vn->exit_callback = p_exit_callable;
-}
-
-AABB RendererStorageRD::visibility_notifier_get_aabb(RID p_notifier) const {
-	const VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
-	ERR_FAIL_COND_V(!vn, AABB());
-	return vn->aabb;
-}
-void RendererStorageRD::visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) {
-	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
-	ERR_FAIL_COND(!vn);
-
-	if (p_enter) {
-		if (!vn->enter_callback.is_null()) {
-			if (p_deferred) {
-				vn->enter_callback.call_deferred(nullptr, 0);
-			} else {
-				Variant r;
-				Callable::CallError ce;
-				vn->enter_callback.call(nullptr, 0, r, ce);
-			}
-		}
-	} else {
-		if (!vn->exit_callback.is_null()) {
-			if (p_deferred) {
-				vn->exit_callback.call_deferred(nullptr, 0);
-			} else {
-				Variant r;
-				Callable::CallError ce;
-				vn->exit_callback.call(nullptr, 0, r, ce);
-			}
-		}
-	}
-}
-
-/* misc */
-
-void RendererStorageRD::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
-	if (RendererRD::MeshStorage::get_singleton()->owns_mesh(p_base)) {
-		RendererRD::Mesh *mesh = RendererRD::MeshStorage::get_singleton()->get_mesh(p_base);
-		p_instance->update_dependency(&mesh->dependency);
-	} else if (RendererRD::MeshStorage::get_singleton()->owns_multimesh(p_base)) {
-		RendererRD::MultiMesh *multimesh = RendererRD::MeshStorage::get_singleton()->get_multimesh(p_base);
-		p_instance->update_dependency(&multimesh->dependency);
-		if (multimesh->mesh.is_valid()) {
-			base_update_dependency(multimesh->mesh, p_instance);
-		}
-	} else if (RendererRD::LightStorage::get_singleton()->owns_reflection_probe(p_base)) {
-		RendererRD::ReflectionProbe *rp = RendererRD::LightStorage::get_singleton()->get_reflection_probe(p_base);
-		p_instance->update_dependency(&rp->dependency);
-	} else if (RendererRD::TextureStorage::get_singleton()->owns_decal(p_base)) {
-		RendererRD::Decal *decal = RendererRD::TextureStorage::get_singleton()->get_decal(p_base);
-		p_instance->update_dependency(&decal->dependency);
-	} else if (RendererRD::GI::get_singleton()->owns_voxel_gi(p_base)) {
-		RendererRD::GI::VoxelGI *gip = RendererRD::GI::get_singleton()->get_voxel_gi(p_base);
-		p_instance->update_dependency(&gip->dependency);
-	} else if (RendererRD::LightStorage::get_singleton()->owns_lightmap(p_base)) {
-		RendererRD::Lightmap *lm = RendererRD::LightStorage::get_singleton()->get_lightmap(p_base);
-		p_instance->update_dependency(&lm->dependency);
-	} else if (RendererRD::LightStorage::get_singleton()->owns_light(p_base)) {
-		RendererRD::Light *l = RendererRD::LightStorage::get_singleton()->get_light(p_base);
-		p_instance->update_dependency(&l->dependency);
-	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles(p_base)) {
-		RendererRD::Particles *p = RendererRD::ParticlesStorage::get_singleton()->get_particles(p_base);
-		p_instance->update_dependency(&p->dependency);
-	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_base)) {
-		RendererRD::ParticlesCollision *pc = RendererRD::ParticlesStorage::get_singleton()->get_particles_collision(p_base);
-		p_instance->update_dependency(&pc->dependency);
-	} else if (fog_volume_owner.owns(p_base)) {
-		FogVolume *fv = fog_volume_owner.get_or_null(p_base);
-		p_instance->update_dependency(&fv->dependency);
-	} else if (visibility_notifier_owner.owns(p_base)) {
-		VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_base);
-		p_instance->update_dependency(&vn->dependency);
-	}
-}
-
-RS::InstanceType RendererStorageRD::get_base_type(RID p_rid) const {
+RS::InstanceType Utilities::get_base_type(RID p_rid) const {
 	if (RendererRD::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
 	if (RendererRD::MeshStorage::get_singleton()->owns_mesh(p_rid)) {
 		return RS::INSTANCE_MESH;
 		return RS::INSTANCE_MESH;
 	}
 	}
@@ -244,49 +78,17 @@ RS::InstanceType RendererStorageRD::get_base_type(RID p_rid) const {
 	if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_rid)) {
 	if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_rid)) {
 		return RS::INSTANCE_PARTICLES_COLLISION;
 		return RS::INSTANCE_PARTICLES_COLLISION;
 	}
 	}
-	if (fog_volume_owner.owns(p_rid)) {
+	if (RendererRD::Fog::get_singleton()->owns_fog_volume(p_rid)) {
 		return RS::INSTANCE_FOG_VOLUME;
 		return RS::INSTANCE_FOG_VOLUME;
 	}
 	}
-	if (visibility_notifier_owner.owns(p_rid)) {
+	if (owns_visibility_notifier(p_rid)) {
 		return RS::INSTANCE_VISIBLITY_NOTIFIER;
 		return RS::INSTANCE_VISIBLITY_NOTIFIER;
 	}
 	}
 
 
 	return RS::INSTANCE_NONE;
 	return RS::INSTANCE_NONE;
 }
 }
 
 
-void RendererStorageRD::update_dirty_resources() {
-	RendererRD::MaterialStorage::get_singleton()->_update_global_variables(); //must do before materials, so it can queue them for update
-	RendererRD::MaterialStorage::get_singleton()->_update_queued_materials();
-	RendererRD::MeshStorage::get_singleton()->_update_dirty_multimeshes();
-	RendererRD::MeshStorage::get_singleton()->_update_dirty_skeletons();
-	RendererRD::TextureStorage::get_singleton()->update_decal_atlas();
-}
-
-bool RendererStorageRD::has_os_feature(const String &p_feature) const {
-	if (!RD::get_singleton()) {
-		return false;
-	}
-
-	if (p_feature == "rgtc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC5_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
-		return true;
-	}
-
-	if (p_feature == "s3tc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC1_RGB_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
-		return true;
-	}
-
-	if (p_feature == "bptc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC7_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
-		return true;
-	}
-
-	if ((p_feature == "etc" || p_feature == "etc2") && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
-		return true;
-	}
-
-	return false;
-}
-
-bool RendererStorageRD::free(RID p_rid) {
+bool Utilities::free(RID p_rid) {
 	if (RendererRD::TextureStorage::get_singleton()->owns_texture(p_rid)) {
 	if (RendererRD::TextureStorage::get_singleton()->owns_texture(p_rid)) {
 		RendererRD::TextureStorage::get_singleton()->texture_free(p_rid);
 		RendererRD::TextureStorage::get_singleton()->texture_free(p_rid);
 	} else if (RendererRD::TextureStorage::get_singleton()->owns_canvas_texture(p_rid)) {
 	} else if (RendererRD::TextureStorage::get_singleton()->owns_canvas_texture(p_rid)) {
@@ -317,16 +119,12 @@ bool RendererStorageRD::free(RID p_rid) {
 		RendererRD::ParticlesStorage::get_singleton()->particles_free(p_rid);
 		RendererRD::ParticlesStorage::get_singleton()->particles_free(p_rid);
 	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_rid)) {
 	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_rid)) {
 		RendererRD::ParticlesStorage::get_singleton()->particles_collision_free(p_rid);
 		RendererRD::ParticlesStorage::get_singleton()->particles_collision_free(p_rid);
-	} else if (visibility_notifier_owner.owns(p_rid)) {
-		VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_rid);
-		vn->dependency.deleted_notify(p_rid);
-		visibility_notifier_owner.free(p_rid);
+	} else if (owns_visibility_notifier(p_rid)) {
+		visibility_notifier_free(p_rid);
 	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision_instance(p_rid)) {
 	} else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision_instance(p_rid)) {
 		RendererRD::ParticlesStorage::get_singleton()->particles_collision_instance_free(p_rid);
 		RendererRD::ParticlesStorage::get_singleton()->particles_collision_instance_free(p_rid);
-	} else if (fog_volume_owner.owns(p_rid)) {
-		FogVolume *fog_volume = fog_volume_owner.get_or_null(p_rid);
-		fog_volume->dependency.deleted_notify(p_rid);
-		fog_volume_owner.free(p_rid);
+	} else if (RendererRD::Fog::get_singleton()->owns_fog_volume(p_rid)) {
+		RendererRD::Fog::get_singleton()->fog_free(p_rid);
 	} else if (RendererRD::TextureStorage::get_singleton()->owns_render_target(p_rid)) {
 	} else if (RendererRD::TextureStorage::get_singleton()->owns_render_target(p_rid)) {
 		RendererRD::TextureStorage::get_singleton()->render_target_free(p_rid);
 		RendererRD::TextureStorage::get_singleton()->render_target_free(p_rid);
 	} else {
 	} else {
@@ -336,49 +134,182 @@ bool RendererStorageRD::free(RID p_rid) {
 	return true;
 	return true;
 }
 }
 
 
-void RendererStorageRD::init_effects(bool p_prefer_raster_effects) {
-	effects = memnew(EffectsRD(p_prefer_raster_effects));
+/* DEPENDENCIES */
+
+void Utilities::base_update_dependency(RID p_base, DependencyTracker *p_instance) {
+	if (MeshStorage::get_singleton()->owns_mesh(p_base)) {
+		Mesh *mesh = MeshStorage::get_singleton()->get_mesh(p_base);
+		p_instance->update_dependency(&mesh->dependency);
+	} else if (MeshStorage::get_singleton()->owns_multimesh(p_base)) {
+		MultiMesh *multimesh = MeshStorage::get_singleton()->get_multimesh(p_base);
+		p_instance->update_dependency(&multimesh->dependency);
+		if (multimesh->mesh.is_valid()) {
+			base_update_dependency(multimesh->mesh, p_instance);
+		}
+	} else if (LightStorage::get_singleton()->owns_reflection_probe(p_base)) {
+		ReflectionProbe *rp = LightStorage::get_singleton()->get_reflection_probe(p_base);
+		p_instance->update_dependency(&rp->dependency);
+	} else if (TextureStorage::get_singleton()->owns_decal(p_base)) {
+		Decal *decal = TextureStorage::get_singleton()->get_decal(p_base);
+		p_instance->update_dependency(&decal->dependency);
+	} else if (GI::get_singleton()->owns_voxel_gi(p_base)) {
+		GI::VoxelGI *gip = GI::get_singleton()->get_voxel_gi(p_base);
+		p_instance->update_dependency(&gip->dependency);
+	} else if (LightStorage::get_singleton()->owns_lightmap(p_base)) {
+		Lightmap *lm = LightStorage::get_singleton()->get_lightmap(p_base);
+		p_instance->update_dependency(&lm->dependency);
+	} else if (LightStorage::get_singleton()->owns_light(p_base)) {
+		Light *l = LightStorage::get_singleton()->get_light(p_base);
+		p_instance->update_dependency(&l->dependency);
+	} else if (ParticlesStorage::get_singleton()->owns_particles(p_base)) {
+		Particles *p = ParticlesStorage::get_singleton()->get_particles(p_base);
+		p_instance->update_dependency(&p->dependency);
+	} else if (ParticlesStorage::get_singleton()->owns_particles_collision(p_base)) {
+		ParticlesCollision *pc = ParticlesStorage::get_singleton()->get_particles_collision(p_base);
+		p_instance->update_dependency(&pc->dependency);
+	} else if (Fog::get_singleton()->owns_fog_volume(p_base)) {
+		Fog::FogVolume *fv = Fog::get_singleton()->get_fog_volume(p_base);
+		p_instance->update_dependency(&fv->dependency);
+	} else if (owns_visibility_notifier(p_base)) {
+		VisibilityNotifier *vn = get_visibility_notifier(p_base);
+		p_instance->update_dependency(&vn->dependency);
+	}
+}
+
+/* VISIBILITY NOTIFIER */
+
+RID Utilities::visibility_notifier_allocate() {
+	return visibility_notifier_owner.allocate_rid();
+}
+
+void Utilities::visibility_notifier_initialize(RID p_notifier) {
+	visibility_notifier_owner.initialize_rid(p_notifier, VisibilityNotifier());
+}
+
+void Utilities::visibility_notifier_free(RID p_notifier) {
+	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
+	vn->dependency.deleted_notify(p_notifier);
+	visibility_notifier_owner.free(p_notifier);
+}
+
+void Utilities::visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) {
+	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
+	ERR_FAIL_COND(!vn);
+	vn->aabb = p_aabb;
+	vn->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
+}
+
+void Utilities::visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) {
+	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
+	ERR_FAIL_COND(!vn);
+	vn->enter_callback = p_enter_callbable;
+	vn->exit_callback = p_exit_callable;
+}
+
+AABB Utilities::visibility_notifier_get_aabb(RID p_notifier) const {
+	const VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
+	ERR_FAIL_COND_V(!vn, AABB());
+	return vn->aabb;
 }
 }
 
 
-EffectsRD *RendererStorageRD::get_effects() {
-	ERR_FAIL_NULL_V_MSG(effects, nullptr, "Effects haven't been initialised yet.");
-	return effects;
+void Utilities::visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) {
+	VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_notifier);
+	ERR_FAIL_COND(!vn);
+
+	if (p_enter) {
+		if (!vn->enter_callback.is_null()) {
+			if (p_deferred) {
+				vn->enter_callback.call_deferred(nullptr, 0);
+			} else {
+				Variant r;
+				Callable::CallError ce;
+				vn->enter_callback.call(nullptr, 0, r, ce);
+			}
+		}
+	} else {
+		if (!vn->exit_callback.is_null()) {
+			if (p_deferred) {
+				vn->exit_callback.call_deferred(nullptr, 0);
+			} else {
+				Variant r;
+				Callable::CallError ce;
+				vn->exit_callback.call(nullptr, 0, r, ce);
+			}
+		}
+	}
 }
 }
 
 
-void RendererStorageRD::capture_timestamps_begin() {
+/* TIMING */
+
+void Utilities::capture_timestamps_begin() {
 	RD::get_singleton()->capture_timestamp("Frame Begin");
 	RD::get_singleton()->capture_timestamp("Frame Begin");
 }
 }
 
 
-void RendererStorageRD::capture_timestamp(const String &p_name) {
+void Utilities::capture_timestamp(const String &p_name) {
 	RD::get_singleton()->capture_timestamp(p_name);
 	RD::get_singleton()->capture_timestamp(p_name);
 }
 }
 
 
-uint32_t RendererStorageRD::get_captured_timestamps_count() const {
+uint32_t Utilities::get_captured_timestamps_count() const {
 	return RD::get_singleton()->get_captured_timestamps_count();
 	return RD::get_singleton()->get_captured_timestamps_count();
 }
 }
 
 
-uint64_t RendererStorageRD::get_captured_timestamps_frame() const {
+uint64_t Utilities::get_captured_timestamps_frame() const {
 	return RD::get_singleton()->get_captured_timestamps_frame();
 	return RD::get_singleton()->get_captured_timestamps_frame();
 }
 }
 
 
-uint64_t RendererStorageRD::get_captured_timestamp_gpu_time(uint32_t p_index) const {
+uint64_t Utilities::get_captured_timestamp_gpu_time(uint32_t p_index) const {
 	return RD::get_singleton()->get_captured_timestamp_gpu_time(p_index);
 	return RD::get_singleton()->get_captured_timestamp_gpu_time(p_index);
 }
 }
 
 
-uint64_t RendererStorageRD::get_captured_timestamp_cpu_time(uint32_t p_index) const {
+uint64_t Utilities::get_captured_timestamp_cpu_time(uint32_t p_index) const {
 	return RD::get_singleton()->get_captured_timestamp_cpu_time(p_index);
 	return RD::get_singleton()->get_captured_timestamp_cpu_time(p_index);
 }
 }
 
 
-String RendererStorageRD::get_captured_timestamp_name(uint32_t p_index) const {
+String Utilities::get_captured_timestamp_name(uint32_t p_index) const {
 	return RD::get_singleton()->get_captured_timestamp_name(p_index);
 	return RD::get_singleton()->get_captured_timestamp_name(p_index);
 }
 }
 
 
-void RendererStorageRD::update_memory_info() {
+/* MISC */
+
+void Utilities::update_dirty_resources() {
+	MaterialStorage::get_singleton()->_update_global_variables(); //must do before materials, so it can queue them for update
+	MaterialStorage::get_singleton()->_update_queued_materials();
+	MeshStorage::get_singleton()->_update_dirty_multimeshes();
+	MeshStorage::get_singleton()->_update_dirty_skeletons();
+	TextureStorage::get_singleton()->update_decal_atlas();
+}
+
+bool Utilities::has_os_feature(const String &p_feature) const {
+	if (!RD::get_singleton()) {
+		return false;
+	}
+
+	if (p_feature == "rgtc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC5_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
+		return true;
+	}
+
+	if (p_feature == "s3tc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC1_RGB_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
+		return true;
+	}
+
+	if (p_feature == "bptc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC7_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
+		return true;
+	}
+
+	if ((p_feature == "etc" || p_feature == "etc2") && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) {
+		return true;
+	}
+
+	return false;
+}
+
+void Utilities::update_memory_info() {
 	texture_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_TEXTURES);
 	texture_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_TEXTURES);
 	buffer_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_BUFFERS);
 	buffer_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_BUFFERS);
 	total_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_TOTAL);
 	total_mem_cache = RenderingDevice::get_singleton()->get_memory_usage(RenderingDevice::MEMORY_TOTAL);
 }
 }
-uint64_t RendererStorageRD::get_rendering_info(RS::RenderingInfo p_info) {
+
+uint64_t Utilities::get_rendering_info(RS::RenderingInfo p_info) {
 	if (p_info == RS::RENDERING_INFO_TEXTURE_MEM_USED) {
 	if (p_info == RS::RENDERING_INFO_TEXTURE_MEM_USED) {
 		return texture_mem_cache;
 		return texture_mem_cache;
 	} else if (p_info == RS::RENDERING_INFO_BUFFER_MEM_USED) {
 	} else if (p_info == RS::RENDERING_INFO_BUFFER_MEM_USED) {
@@ -389,31 +320,18 @@ uint64_t RendererStorageRD::get_rendering_info(RS::RenderingInfo p_info) {
 	return 0;
 	return 0;
 }
 }
 
 
-String RendererStorageRD::get_video_adapter_name() const {
+String Utilities::get_video_adapter_name() const {
 	return RenderingDevice::get_singleton()->get_device_name();
 	return RenderingDevice::get_singleton()->get_device_name();
 }
 }
 
 
-String RendererStorageRD::get_video_adapter_vendor() const {
+String Utilities::get_video_adapter_vendor() const {
 	return RenderingDevice::get_singleton()->get_device_vendor_name();
 	return RenderingDevice::get_singleton()->get_device_vendor_name();
 }
 }
 
 
-RenderingDevice::DeviceType RendererStorageRD::get_video_adapter_type() const {
+RenderingDevice::DeviceType Utilities::get_video_adapter_type() const {
 	return RenderingDevice::get_singleton()->get_device_type();
 	return RenderingDevice::get_singleton()->get_device_type();
 }
 }
 
 
-String RendererStorageRD::get_video_adapter_api_version() const {
+String Utilities::get_video_adapter_api_version() const {
 	return RenderingDevice::get_singleton()->get_device_api_version();
 	return RenderingDevice::get_singleton()->get_device_api_version();
 }
 }
-
-RendererStorageRD *RendererStorageRD::base_singleton = nullptr;
-
-RendererStorageRD::RendererStorageRD() {
-	base_singleton = this;
-}
-
-RendererStorageRD::~RendererStorageRD() {
-	if (effects) {
-		memdelete(effects);
-		effects = nullptr;
-	}
-}

+ 122 - 0
servers/rendering/renderer_rd/storage_rd/utilities.h

@@ -0,0 +1,122 @@
+/*************************************************************************/
+/*  utilities.h                                                          */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef UTILITIES_RD_H
+#define UTILITIES_RD_H
+
+#include "core/templates/rid_owner.h"
+#include "servers/rendering/storage/utilities.h"
+
+namespace RendererRD {
+
+/* VISIBILITY NOTIFIER */
+
+struct VisibilityNotifier {
+	AABB aabb;
+	Callable enter_callback;
+	Callable exit_callback;
+	Dependency dependency;
+};
+
+class Utilities : public RendererUtilities {
+private:
+	static Utilities *singleton;
+
+	/* VISIBILITY NOTIFIER */
+
+	mutable RID_Owner<VisibilityNotifier> visibility_notifier_owner;
+
+	/* MISC */
+
+	//keep cached since it can be called form any thread
+	uint64_t texture_mem_cache = 0;
+	uint64_t buffer_mem_cache = 0;
+	uint64_t total_mem_cache = 0;
+
+public:
+	static Utilities *get_singleton() { return singleton; }
+
+	Utilities();
+	virtual ~Utilities() override;
+
+	/* INSTANCES */
+
+	virtual RS::InstanceType get_base_type(RID p_rid) const override;
+	virtual bool free(RID p_rid) override;
+
+	/* DEPENDENCIES */
+
+	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) override;
+
+	/* VISIBILITY NOTIFIER */
+
+	VisibilityNotifier *get_visibility_notifier(RID p_rid) { return visibility_notifier_owner.get_or_null(p_rid); };
+	bool owns_visibility_notifier(RID p_rid) const { return visibility_notifier_owner.owns(p_rid); };
+
+	virtual RID visibility_notifier_allocate() override;
+	virtual void visibility_notifier_initialize(RID p_notifier) override;
+	virtual void visibility_notifier_free(RID p_notifier) override;
+
+	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) override;
+	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) override;
+
+	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const override;
+	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) override;
+
+	/* TIMING */
+
+	virtual void capture_timestamps_begin() override;
+	virtual void capture_timestamp(const String &p_name) override;
+	virtual uint32_t get_captured_timestamps_count() const override;
+	virtual uint64_t get_captured_timestamps_frame() const override;
+	virtual uint64_t get_captured_timestamp_gpu_time(uint32_t p_index) const override;
+	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const override;
+	virtual String get_captured_timestamp_name(uint32_t p_index) const override;
+
+	/* MISC */
+
+	virtual void update_dirty_resources() override;
+	virtual void set_debug_generate_wireframes(bool p_generate) override {}
+
+	virtual bool has_os_feature(const String &p_feature) const override;
+
+	virtual void update_memory_info() override;
+
+	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) override;
+
+	virtual String get_video_adapter_name() const override;
+	virtual String get_video_adapter_vendor() const override;
+	virtual RenderingDevice::DeviceType get_video_adapter_type() const override;
+	virtual String get_video_adapter_api_version() const override;
+};
+
+} // namespace RendererRD
+
+#endif // !UTILITIES_RD_H

+ 12 - 12
servers/rendering/renderer_scene_cull.cpp

@@ -470,7 +470,7 @@ void RendererSceneCull::_instance_update_mesh_instance(Instance *p_instance) {
 			p_instance->mesh_instance = RSG::mesh_storage->mesh_instance_create(p_instance->base);
 			p_instance->mesh_instance = RSG::mesh_storage->mesh_instance_create(p_instance->base);
 
 
 		} else {
 		} else {
-			RSG::storage->free(p_instance->mesh_instance);
+			RSG::mesh_storage->mesh_free(p_instance->mesh_instance);
 			p_instance->mesh_instance = RID();
 			p_instance->mesh_instance = RID();
 		}
 		}
 
 
@@ -506,7 +506,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
 		}
 		}
 
 
 		if (instance->mesh_instance.is_valid()) {
 		if (instance->mesh_instance.is_valid()) {
-			RSG::storage->free(instance->mesh_instance);
+			RSG::mesh_storage->mesh_free(instance->mesh_instance);
 			instance->mesh_instance = RID();
 			instance->mesh_instance = RID();
 			// no need to set instance data flag here, as it was freed above
 			// no need to set instance data flag here, as it was freed above
 		}
 		}
@@ -538,7 +538,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
 			} break;
 			} break;
 			case RS::INSTANCE_PARTICLES_COLLISION: {
 			case RS::INSTANCE_PARTICLES_COLLISION: {
 				InstanceParticlesCollisionData *collision = static_cast<InstanceParticlesCollisionData *>(instance->base_data);
 				InstanceParticlesCollisionData *collision = static_cast<InstanceParticlesCollisionData *>(instance->base_data);
-				RSG::storage->free(collision->instance);
+				RSG::utilities->free(collision->instance);
 			} break;
 			} break;
 			case RS::INSTANCE_FOG_VOLUME: {
 			case RS::INSTANCE_FOG_VOLUME: {
 				InstanceFogVolumeData *volume = static_cast<InstanceFogVolumeData *>(instance->base_data);
 				InstanceFogVolumeData *volume = static_cast<InstanceFogVolumeData *>(instance->base_data);
@@ -607,7 +607,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
 	instance->base = RID();
 	instance->base = RID();
 
 
 	if (p_base.is_valid()) {
 	if (p_base.is_valid()) {
-		instance->base_type = RSG::storage->get_base_type(p_base);
+		instance->base_type = RSG::utilities->get_base_type(p_base);
 
 
 		// fix up a specific malfunctioning case before the switch, so it can be handled
 		// fix up a specific malfunctioning case before the switch, so it can be handled
 		if (instance->base_type == RS::INSTANCE_NONE && RendererSceneOcclusionCull::get_singleton()->is_occluder(p_base)) {
 		if (instance->base_type == RS::INSTANCE_NONE && RendererSceneOcclusionCull::get_singleton()->is_occluder(p_base)) {
@@ -724,7 +724,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
 		}
 		}
 
 
 		//forcefully update the dependency now, so if for some reason it gets removed, we can immediately clear it
 		//forcefully update the dependency now, so if for some reason it gets removed, we can immediately clear it
-		RSG::storage->base_update_dependency(p_base, &instance->dependency_tracker);
+		RSG::utilities->base_update_dependency(p_base, &instance->dependency_tracker);
 	}
 	}
 
 
 	_instance_queue_update(instance, true, true);
 	_instance_queue_update(instance, true, true);
@@ -1876,10 +1876,10 @@ void RendererSceneCull::_update_instance_aabb(Instance *p_instance) {
 
 
 		} break;
 		} break;
 		case RenderingServer::INSTANCE_FOG_VOLUME: {
 		case RenderingServer::INSTANCE_FOG_VOLUME: {
-			new_aabb = RSG::storage->fog_volume_get_aabb(p_instance->base);
+			new_aabb = RSG::fog->fog_volume_get_aabb(p_instance->base);
 		} break;
 		} break;
 		case RenderingServer::INSTANCE_VISIBLITY_NOTIFIER: {
 		case RenderingServer::INSTANCE_VISIBLITY_NOTIFIER: {
-			new_aabb = RSG::storage->visibility_notifier_get_aabb(p_instance->base);
+			new_aabb = RSG::utilities->visibility_notifier_get_aabb(p_instance->base);
 		} break;
 		} break;
 		case RenderingServer::INSTANCE_LIGHT: {
 		case RenderingServer::INSTANCE_LIGHT: {
 			new_aabb = RSG::light_storage->light_get_aabb(p_instance->base);
 			new_aabb = RSG::light_storage->light_get_aabb(p_instance->base);
@@ -3677,7 +3677,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
 		p_instance->dependency_tracker.update_begin();
 		p_instance->dependency_tracker.update_begin();
 
 
 		if (p_instance->base.is_valid()) {
 		if (p_instance->base.is_valid()) {
-			RSG::storage->base_update_dependency(p_instance->base, &p_instance->dependency_tracker);
+			RSG::utilities->base_update_dependency(p_instance->base, &p_instance->dependency_tracker);
 		}
 		}
 
 
 		if (p_instance->material_override.is_valid()) {
 		if (p_instance->material_override.is_valid()) {
@@ -3785,7 +3785,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
 							can_cast_shadows = false;
 							can_cast_shadows = false;
 						}
 						}
 
 
-						RSG::storage->base_update_dependency(mesh, &p_instance->dependency_tracker);
+						RSG::utilities->base_update_dependency(mesh, &p_instance->dependency_tracker);
 					}
 					}
 				} else if (p_instance->base_type == RS::INSTANCE_PARTICLES) {
 				} else if (p_instance->base_type == RS::INSTANCE_PARTICLES) {
 					bool cast_shadows = false;
 					bool cast_shadows = false;
@@ -3885,7 +3885,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
 }
 }
 
 
 void RendererSceneCull::update_dirty_instances() {
 void RendererSceneCull::update_dirty_instances() {
-	RSG::storage->update_dirty_resources();
+	RSG::utilities->update_dirty_resources();
 
 
 	while (_instance_update_list.first()) {
 	while (_instance_update_list.first()) {
 		_update_dirty_instance(_instance_update_list.first()->self());
 		_update_dirty_instance(_instance_update_list.first()->self());
@@ -3978,12 +3978,12 @@ void RendererSceneCull::update_visibility_notifiers() {
 		if (visibility_notifier->just_visible) {
 		if (visibility_notifier->just_visible) {
 			visibility_notifier->just_visible = false;
 			visibility_notifier->just_visible = false;
 
 
-			RSG::storage->visibility_notifier_call(visibility_notifier->base, true, RSG::threaded);
+			RSG::utilities->visibility_notifier_call(visibility_notifier->base, true, RSG::threaded);
 		} else {
 		} else {
 			if (visibility_notifier->visible_in_frame != RSG::rasterizer->get_frame_number()) {
 			if (visibility_notifier->visible_in_frame != RSG::rasterizer->get_frame_number()) {
 				visible_notifier_list.remove(E);
 				visible_notifier_list.remove(E);
 
 
-				RSG::storage->visibility_notifier_call(visibility_notifier->base, false, RSG::threaded);
+				RSG::utilities->visibility_notifier_call(visibility_notifier->base, false, RSG::threaded);
 			}
 			}
 		}
 		}
 
 

+ 16 - 16
servers/rendering/renderer_scene_cull.h

@@ -42,7 +42,7 @@
 #include "servers/rendering/renderer_scene.h"
 #include "servers/rendering/renderer_scene.h"
 #include "servers/rendering/renderer_scene_occlusion_cull.h"
 #include "servers/rendering/renderer_scene_occlusion_cull.h"
 #include "servers/rendering/renderer_scene_render.h"
 #include "servers/rendering/renderer_scene_render.h"
-#include "servers/rendering/renderer_storage.h"
+#include "servers/rendering/storage/utilities.h"
 #include "servers/xr/xr_interface.h"
 #include "servers/xr/xr_interface.h"
 
 
 class RendererSceneCull : public RendererScene {
 class RendererSceneCull : public RendererScene {
@@ -470,32 +470,32 @@ public:
 		SelfList<InstancePair>::List pairs;
 		SelfList<InstancePair>::List pairs;
 		uint64_t pair_check;
 		uint64_t pair_check;
 
 
-		RendererStorage::DependencyTracker dependency_tracker;
+		DependencyTracker dependency_tracker;
 
 
-		static void dependency_changed(RendererStorage::DependencyChangedNotification p_notification, RendererStorage::DependencyTracker *tracker) {
+		static void dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *tracker) {
 			Instance *instance = (Instance *)tracker->userdata;
 			Instance *instance = (Instance *)tracker->userdata;
 			switch (p_notification) {
 			switch (p_notification) {
-				case RendererStorage::DEPENDENCY_CHANGED_SKELETON_DATA:
-				case RendererStorage::DEPENDENCY_CHANGED_AABB: {
+				case Dependency::DEPENDENCY_CHANGED_SKELETON_DATA:
+				case Dependency::DEPENDENCY_CHANGED_AABB: {
 					singleton->_instance_queue_update(instance, true, false);
 					singleton->_instance_queue_update(instance, true, false);
 
 
 				} break;
 				} break;
-				case RendererStorage::DEPENDENCY_CHANGED_MATERIAL: {
+				case Dependency::DEPENDENCY_CHANGED_MATERIAL: {
 					singleton->_instance_queue_update(instance, false, true);
 					singleton->_instance_queue_update(instance, false, true);
 				} break;
 				} break;
-				case RendererStorage::DEPENDENCY_CHANGED_MESH:
-				case RendererStorage::DEPENDENCY_CHANGED_PARTICLES:
-				case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH:
-				case RendererStorage::DEPENDENCY_CHANGED_DECAL:
-				case RendererStorage::DEPENDENCY_CHANGED_LIGHT:
-				case RendererStorage::DEPENDENCY_CHANGED_REFLECTION_PROBE: {
+				case Dependency::DEPENDENCY_CHANGED_MESH:
+				case Dependency::DEPENDENCY_CHANGED_PARTICLES:
+				case Dependency::DEPENDENCY_CHANGED_MULTIMESH:
+				case Dependency::DEPENDENCY_CHANGED_DECAL:
+				case Dependency::DEPENDENCY_CHANGED_LIGHT:
+				case Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE: {
 					singleton->_instance_queue_update(instance, true, true);
 					singleton->_instance_queue_update(instance, true, true);
 				} break;
 				} break;
-				case RendererStorage::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES:
-				case RendererStorage::DEPENDENCY_CHANGED_SKELETON_BONES: {
+				case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES:
+				case Dependency::DEPENDENCY_CHANGED_SKELETON_BONES: {
 					//ignored
 					//ignored
 				} break;
 				} break;
-				case RendererStorage::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR: {
+				case Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR: {
 					//requires repairing
 					//requires repairing
 					if (instance->indexer_id.is_valid()) {
 					if (instance->indexer_id.is_valid()) {
 						singleton->_unpair_instance(instance);
 						singleton->_unpair_instance(instance);
@@ -506,7 +506,7 @@ public:
 			}
 			}
 		}
 		}
 
 
-		static void dependency_deleted(const RID &p_dependency, RendererStorage::DependencyTracker *tracker) {
+		static void dependency_deleted(const RID &p_dependency, DependencyTracker *tracker) {
 			Instance *instance = (Instance *)tracker->userdata;
 			Instance *instance = (Instance *)tracker->userdata;
 
 
 			if (p_dependency == instance->base) {
 			if (p_dependency == instance->base) {

+ 4 - 4
servers/rendering/renderer_viewport.cpp

@@ -175,7 +175,7 @@ void RendererViewport::_draw_3d(Viewport *p_viewport) {
 void RendererViewport::_draw_viewport(Viewport *p_viewport) {
 void RendererViewport::_draw_viewport(Viewport *p_viewport) {
 	if (p_viewport->measure_render_time) {
 	if (p_viewport->measure_render_time) {
 		String rt_id = "vp_begin_" + itos(p_viewport->self.get_id());
 		String rt_id = "vp_begin_" + itos(p_viewport->self.get_id());
-		RSG::storage->capture_timestamp(rt_id);
+		RSG::utilities->capture_timestamp(rt_id);
 		timestamp_vp_map[rt_id] = p_viewport->self;
 		timestamp_vp_map[rt_id] = p_viewport->self;
 	}
 	}
 
 
@@ -212,7 +212,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
 		_configure_3d_render_buffers(p_viewport);
 		_configure_3d_render_buffers(p_viewport);
 	}
 	}
 
 
-	Color bgcolor = p_viewport->transparent_bg ? Color(0, 0, 0, 0) : RSG::storage->get_default_clear_color();
+	Color bgcolor = p_viewport->transparent_bg ? Color(0, 0, 0, 0) : RSG::texture_storage->get_default_clear_color();
 
 
 	if (p_viewport->clear_mode != RS::VIEWPORT_CLEAR_NEVER) {
 	if (p_viewport->clear_mode != RS::VIEWPORT_CLEAR_NEVER) {
 		RSG::texture_storage->render_target_request_clear(p_viewport->render_target, bgcolor);
 		RSG::texture_storage->render_target_request_clear(p_viewport->render_target, bgcolor);
@@ -521,7 +521,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
 
 
 	if (p_viewport->measure_render_time) {
 	if (p_viewport->measure_render_time) {
 		String rt_id = "vp_end_" + itos(p_viewport->self.get_id());
 		String rt_id = "vp_end_" + itos(p_viewport->self.get_id());
-		RSG::storage->capture_timestamp(rt_id);
+		RSG::utilities->capture_timestamp(rt_id);
 		timestamp_vp_map[rt_id] = p_viewport->self;
 		timestamp_vp_map[rt_id] = p_viewport->self;
 	}
 	}
 }
 }
@@ -1259,7 +1259,7 @@ void RendererViewport::handle_timestamp(String p_timestamp, uint64_t p_cpu_time,
 }
 }
 
 
 void RendererViewport::set_default_clear_color(const Color &p_color) {
 void RendererViewport::set_default_clear_color(const Color &p_color) {
-	RSG::storage->set_default_clear_color(p_color);
+	RSG::texture_storage->set_default_clear_color(p_color);
 }
 }
 
 
 // Workaround for setting this on thread.
 // Workaround for setting this on thread.

+ 26 - 25
servers/rendering/rendering_server_default.cpp

@@ -48,7 +48,7 @@ void RenderingServerDefault::_free(RID p_rid) {
 	if (unlikely(p_rid.is_null())) {
 	if (unlikely(p_rid.is_null())) {
 		return;
 		return;
 	}
 	}
-	if (RSG::storage->free(p_rid)) {
+	if (RSG::utilities->free(p_rid)) {
 		return;
 		return;
 	}
 	}
 	if (RSG::canvas->free(p_rid)) {
 	if (RSG::canvas->free(p_rid)) {
@@ -116,35 +116,35 @@ void RenderingServerDefault::_draw(bool p_swap_buffers, double frame_step) {
 	}
 	}
 	RS::get_singleton()->emit_signal(SNAME("frame_post_draw"));
 	RS::get_singleton()->emit_signal(SNAME("frame_post_draw"));
 
 
-	if (RSG::storage->get_captured_timestamps_count()) {
+	if (RSG::utilities->get_captured_timestamps_count()) {
 		Vector<FrameProfileArea> new_profile;
 		Vector<FrameProfileArea> new_profile;
-		if (RSG::storage->capturing_timestamps) {
-			new_profile.resize(RSG::storage->get_captured_timestamps_count());
+		if (RSG::utilities->capturing_timestamps) {
+			new_profile.resize(RSG::utilities->get_captured_timestamps_count());
 		}
 		}
 
 
-		uint64_t base_cpu = RSG::storage->get_captured_timestamp_cpu_time(0);
-		uint64_t base_gpu = RSG::storage->get_captured_timestamp_gpu_time(0);
-		for (uint32_t i = 0; i < RSG::storage->get_captured_timestamps_count(); i++) {
-			uint64_t time_cpu = RSG::storage->get_captured_timestamp_cpu_time(i);
-			uint64_t time_gpu = RSG::storage->get_captured_timestamp_gpu_time(i);
+		uint64_t base_cpu = RSG::utilities->get_captured_timestamp_cpu_time(0);
+		uint64_t base_gpu = RSG::utilities->get_captured_timestamp_gpu_time(0);
+		for (uint32_t i = 0; i < RSG::utilities->get_captured_timestamps_count(); i++) {
+			uint64_t time_cpu = RSG::utilities->get_captured_timestamp_cpu_time(i);
+			uint64_t time_gpu = RSG::utilities->get_captured_timestamp_gpu_time(i);
 
 
-			String name = RSG::storage->get_captured_timestamp_name(i);
+			String name = RSG::utilities->get_captured_timestamp_name(i);
 
 
 			if (name.begins_with("vp_")) {
 			if (name.begins_with("vp_")) {
 				RSG::viewport->handle_timestamp(name, time_cpu, time_gpu);
 				RSG::viewport->handle_timestamp(name, time_cpu, time_gpu);
 			}
 			}
 
 
-			if (RSG::storage->capturing_timestamps) {
+			if (RSG::utilities->capturing_timestamps) {
 				new_profile.write[i].gpu_msec = double((time_gpu - base_gpu) / 1000) / 1000.0;
 				new_profile.write[i].gpu_msec = double((time_gpu - base_gpu) / 1000) / 1000.0;
 				new_profile.write[i].cpu_msec = double(time_cpu - base_cpu) / 1000.0;
 				new_profile.write[i].cpu_msec = double(time_cpu - base_cpu) / 1000.0;
-				new_profile.write[i].name = RSG::storage->get_captured_timestamp_name(i);
+				new_profile.write[i].name = RSG::utilities->get_captured_timestamp_name(i);
 			}
 			}
 		}
 		}
 
 
 		frame_profile = new_profile;
 		frame_profile = new_profile;
 	}
 	}
 
 
-	frame_profile_frame = RSG::storage->get_captured_timestamps_frame();
+	frame_profile_frame = RSG::utilities->get_captured_timestamps_frame();
 
 
 	if (print_gpu_profile) {
 	if (print_gpu_profile) {
 		if (print_frame_profile_ticks_from == 0) {
 		if (print_frame_profile_ticks_from == 0) {
@@ -191,7 +191,7 @@ void RenderingServerDefault::_draw(bool p_swap_buffers, double frame_step) {
 		}
 		}
 	}
 	}
 
 
-	RSG::storage->update_memory_info();
+	RSG::utilities->update_memory_info();
 }
 }
 
 
 double RenderingServerDefault::get_frame_setup_time_cpu() const {
 double RenderingServerDefault::get_frame_setup_time_cpu() const {
@@ -250,27 +250,27 @@ uint64_t RenderingServerDefault::get_rendering_info(RenderingInfo p_info) {
 	} else if (p_info == RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME) {
 	} else if (p_info == RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME) {
 		return RSG::viewport->get_total_draw_calls_used();
 		return RSG::viewport->get_total_draw_calls_used();
 	}
 	}
-	return RSG::storage->get_rendering_info(p_info);
+	return RSG::utilities->get_rendering_info(p_info);
 }
 }
 
 
 String RenderingServerDefault::get_video_adapter_name() const {
 String RenderingServerDefault::get_video_adapter_name() const {
-	return RSG::storage->get_video_adapter_name();
+	return RSG::utilities->get_video_adapter_name();
 }
 }
 
 
 String RenderingServerDefault::get_video_adapter_vendor() const {
 String RenderingServerDefault::get_video_adapter_vendor() const {
-	return RSG::storage->get_video_adapter_vendor();
+	return RSG::utilities->get_video_adapter_vendor();
 }
 }
 
 
 RenderingDevice::DeviceType RenderingServerDefault::get_video_adapter_type() const {
 RenderingDevice::DeviceType RenderingServerDefault::get_video_adapter_type() const {
-	return RSG::storage->get_video_adapter_type();
+	return RSG::utilities->get_video_adapter_type();
 }
 }
 
 
 String RenderingServerDefault::get_video_adapter_api_version() const {
 String RenderingServerDefault::get_video_adapter_api_version() const {
-	return RSG::storage->get_video_adapter_api_version();
+	return RSG::utilities->get_video_adapter_api_version();
 }
 }
 
 
 void RenderingServerDefault::set_frame_profiling_enabled(bool p_enable) {
 void RenderingServerDefault::set_frame_profiling_enabled(bool p_enable) {
-	RSG::storage->capturing_timestamps = p_enable;
+	RSG::utilities->capturing_timestamps = p_enable;
 }
 }
 
 
 uint64_t RenderingServerDefault::get_frame_profile_frame() {
 uint64_t RenderingServerDefault::get_frame_profile_frame() {
@@ -301,7 +301,7 @@ void RenderingServerDefault::sdfgi_set_debug_probe_select(const Vector3 &p_posit
 }
 }
 
 
 void RenderingServerDefault::set_print_gpu_profile(bool p_enable) {
 void RenderingServerDefault::set_print_gpu_profile(bool p_enable) {
-	RSG::storage->capturing_timestamps = p_enable;
+	RSG::utilities->capturing_timestamps = p_enable;
 	print_gpu_profile = p_enable;
 	print_gpu_profile = p_enable;
 }
 }
 
 
@@ -313,15 +313,15 @@ RID RenderingServerDefault::get_test_cube() {
 }
 }
 
 
 bool RenderingServerDefault::has_os_feature(const String &p_feature) const {
 bool RenderingServerDefault::has_os_feature(const String &p_feature) const {
-	if (RSG::storage) {
-		return RSG::storage->has_os_feature(p_feature);
+	if (RSG::utilities) {
+		return RSG::utilities->has_os_feature(p_feature);
 	} else {
 	} else {
 		return false;
 		return false;
 	}
 	}
 }
 }
 
 
 void RenderingServerDefault::set_debug_generate_wireframes(bool p_generate) {
 void RenderingServerDefault::set_debug_generate_wireframes(bool p_generate) {
-	RSG::storage->set_debug_generate_wireframes(p_generate);
+	RSG::utilities->set_debug_generate_wireframes(p_generate);
 }
 }
 
 
 bool RenderingServerDefault::is_low_end() const {
 bool RenderingServerDefault::is_low_end() const {
@@ -399,13 +399,14 @@ RenderingServerDefault::RenderingServerDefault(bool p_create_thread) :
 	RendererSceneCull *sr = memnew(RendererSceneCull);
 	RendererSceneCull *sr = memnew(RendererSceneCull);
 	RSG::scene = sr;
 	RSG::scene = sr;
 	RSG::rasterizer = RendererCompositor::create();
 	RSG::rasterizer = RendererCompositor::create();
+	RSG::utilities = RSG::rasterizer->get_utilities();
 	RSG::light_storage = RSG::rasterizer->get_light_storage();
 	RSG::light_storage = RSG::rasterizer->get_light_storage();
 	RSG::material_storage = RSG::rasterizer->get_material_storage();
 	RSG::material_storage = RSG::rasterizer->get_material_storage();
 	RSG::mesh_storage = RSG::rasterizer->get_mesh_storage();
 	RSG::mesh_storage = RSG::rasterizer->get_mesh_storage();
 	RSG::particles_storage = RSG::rasterizer->get_particles_storage();
 	RSG::particles_storage = RSG::rasterizer->get_particles_storage();
 	RSG::texture_storage = RSG::rasterizer->get_texture_storage();
 	RSG::texture_storage = RSG::rasterizer->get_texture_storage();
 	RSG::gi = RSG::rasterizer->get_gi();
 	RSG::gi = RSG::rasterizer->get_gi();
-	RSG::storage = RSG::rasterizer->get_storage();
+	RSG::fog = RSG::rasterizer->get_fog();
 	RSG::canvas_render = RSG::rasterizer->get_canvas();
 	RSG::canvas_render = RSG::rasterizer->get_canvas();
 	sr->set_scene_render(RSG::rasterizer->get_scene());
 	sr->set_scene_render(RSG::rasterizer->get_scene());
 
 

+ 8 - 2
servers/rendering/rendering_server_default.h

@@ -524,8 +524,8 @@ public:
 #undef ServerName
 #undef ServerName
 #undef server_name
 #undef server_name
 
 
-#define ServerName RendererStorage
-#define server_name RSG::storage
+#define ServerName RendererFog
+#define server_name RSG::fog
 
 
 	FUNCRIDSPLIT(fog_volume)
 	FUNCRIDSPLIT(fog_volume)
 
 
@@ -535,6 +535,12 @@ public:
 
 
 	/* VISIBILITY_NOTIFIER */
 	/* VISIBILITY_NOTIFIER */
 
 
+#undef ServerName
+#undef server_name
+
+#define ServerName RendererUtilities
+#define server_name RSG::utilities
+
 	FUNCRIDSPLIT(visibility_notifier)
 	FUNCRIDSPLIT(visibility_notifier)
 	FUNC2(visibility_notifier_set_aabb, RID, const AABB &)
 	FUNC2(visibility_notifier_set_aabb, RID, const AABB &)
 	FUNC3(visibility_notifier_set_callbacks, RID, const Callable &, const Callable &)
 	FUNC3(visibility_notifier_set_callbacks, RID, const Callable &, const Callable &)

+ 2 - 1
servers/rendering/rendering_server_globals.cpp

@@ -32,13 +32,14 @@
 
 
 bool RenderingServerGlobals::threaded = false;
 bool RenderingServerGlobals::threaded = false;
 
 
+RendererUtilities *RenderingServerGlobals::utilities = nullptr;
 RendererLightStorage *RenderingServerGlobals::light_storage = nullptr;
 RendererLightStorage *RenderingServerGlobals::light_storage = nullptr;
 RendererMaterialStorage *RenderingServerGlobals::material_storage = nullptr;
 RendererMaterialStorage *RenderingServerGlobals::material_storage = nullptr;
 RendererMeshStorage *RenderingServerGlobals::mesh_storage = nullptr;
 RendererMeshStorage *RenderingServerGlobals::mesh_storage = nullptr;
 RendererParticlesStorage *RenderingServerGlobals::particles_storage = nullptr;
 RendererParticlesStorage *RenderingServerGlobals::particles_storage = nullptr;
 RendererTextureStorage *RenderingServerGlobals::texture_storage = nullptr;
 RendererTextureStorage *RenderingServerGlobals::texture_storage = nullptr;
 RendererGI *RenderingServerGlobals::gi = nullptr;
 RendererGI *RenderingServerGlobals::gi = nullptr;
-RendererStorage *RenderingServerGlobals::storage = nullptr;
+RendererFog *RenderingServerGlobals::fog = nullptr;
 RendererCanvasRender *RenderingServerGlobals::canvas_render = nullptr;
 RendererCanvasRender *RenderingServerGlobals::canvas_render = nullptr;
 RendererCompositor *RenderingServerGlobals::rasterizer = nullptr;
 RendererCompositor *RenderingServerGlobals::rasterizer = nullptr;
 
 

+ 4 - 1
servers/rendering/rendering_server_globals.h

@@ -31,6 +31,7 @@
 #ifndef RENDERING_SERVER_GLOBALS_H
 #ifndef RENDERING_SERVER_GLOBALS_H
 #define RENDERING_SERVER_GLOBALS_H
 #define RENDERING_SERVER_GLOBALS_H
 
 
+#include "servers/rendering/environment/renderer_fog.h"
 #include "servers/rendering/environment/renderer_gi.h"
 #include "servers/rendering/environment/renderer_gi.h"
 #include "servers/rendering/renderer_canvas_cull.h"
 #include "servers/rendering/renderer_canvas_cull.h"
 #include "servers/rendering/renderer_canvas_render.h"
 #include "servers/rendering/renderer_canvas_render.h"
@@ -40,6 +41,7 @@
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/mesh_storage.h"
 #include "servers/rendering/storage/particles_storage.h"
 #include "servers/rendering/storage/particles_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
 #include "servers/rendering/storage/texture_storage.h"
+#include "servers/rendering/storage/utilities.h"
 
 
 class RendererCanvasCull;
 class RendererCanvasCull;
 class RendererViewport;
 class RendererViewport;
@@ -49,13 +51,14 @@ class RenderingServerGlobals {
 public:
 public:
 	static bool threaded;
 	static bool threaded;
 
 
+	static RendererUtilities *utilities;
 	static RendererLightStorage *light_storage;
 	static RendererLightStorage *light_storage;
 	static RendererMaterialStorage *material_storage;
 	static RendererMaterialStorage *material_storage;
 	static RendererMeshStorage *mesh_storage;
 	static RendererMeshStorage *mesh_storage;
 	static RendererParticlesStorage *particles_storage;
 	static RendererParticlesStorage *particles_storage;
 	static RendererTextureStorage *texture_storage;
 	static RendererTextureStorage *texture_storage;
 	static RendererGI *gi;
 	static RendererGI *gi;
-	static RendererStorage *storage;
+	static RendererFog *fog;
 	static RendererCanvasRender *canvas_render;
 	static RendererCanvasRender *canvas_render;
 	static RendererCompositor *rasterizer;
 	static RendererCompositor *rasterizer;
 
 

+ 0 - 1
servers/rendering/storage/light_storage.h

@@ -31,7 +31,6 @@
 #ifndef LIGHT_STORAGE_H
 #ifndef LIGHT_STORAGE_H
 #define LIGHT_STORAGE_H
 #define LIGHT_STORAGE_H
 
 
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 class RendererLightStorage {
 class RendererLightStorage {

+ 2 - 2
servers/rendering/storage/material_storage.h

@@ -31,8 +31,8 @@
 #ifndef MATERIAL_STORAGE_H
 #ifndef MATERIAL_STORAGE_H
 #define MATERIAL_STORAGE_H
 #define MATERIAL_STORAGE_H
 
 
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
+#include "utilities.h"
 
 
 class RendererMaterialStorage {
 class RendererMaterialStorage {
 public:
 public:
@@ -95,7 +95,7 @@ public:
 
 
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) = 0;
 	virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) = 0;
 
 
-	virtual void material_update_dependency(RID p_material, RendererStorage::DependencyTracker *p_instance) = 0;
+	virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) = 0;
 };
 };
 
 
 #endif // !MATERIAL_STORAGE_H
 #endif // !MATERIAL_STORAGE_H

+ 2 - 2
servers/rendering/storage/mesh_storage.h

@@ -31,8 +31,8 @@
 #ifndef MESH_STORAGE_H
 #ifndef MESH_STORAGE_H
 #define MESH_STORAGE_H
 #define MESH_STORAGE_H
 
 
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
+#include "utilities.h"
 
 
 class RendererMeshStorage {
 class RendererMeshStorage {
 public:
 public:
@@ -130,7 +130,7 @@ public:
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const = 0;
 	virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const = 0;
 	virtual void skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform) = 0;
 	virtual void skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform) = 0;
 
 
-	virtual void skeleton_update_dependency(RID p_base, RendererStorage::DependencyTracker *p_instance) = 0;
+	virtual void skeleton_update_dependency(RID p_base, DependencyTracker *p_instance) = 0;
 };
 };
 
 
 #endif // !MESH_STORAGE_H
 #endif // !MESH_STORAGE_H

+ 0 - 1
servers/rendering/storage/particles_storage.h

@@ -31,7 +31,6 @@
 #ifndef PARTICLES_STORAGE_H
 #ifndef PARTICLES_STORAGE_H
 #define PARTICLES_STORAGE_H
 #define PARTICLES_STORAGE_H
 
 
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 class RendererParticlesStorage {
 class RendererParticlesStorage {

+ 11 - 0
servers/rendering/storage/texture_storage.h

@@ -34,7 +34,18 @@
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 class RendererTextureStorage {
 class RendererTextureStorage {
+private:
+	Color default_clear_color;
+
 public:
 public:
+	void set_default_clear_color(const Color &p_color) {
+		default_clear_color = p_color;
+	}
+
+	Color get_default_clear_color() const {
+		return default_clear_color;
+	}
+
 	/* Canvas Texture API */
 	/* Canvas Texture API */
 
 
 	virtual RID canvas_texture_allocate() = 0;
 	virtual RID canvas_texture_allocate() = 0;

+ 5 - 11
servers/rendering/renderer_storage.cpp → servers/rendering/storage/utilities.cpp

@@ -1,5 +1,5 @@
 /*************************************************************************/
 /*************************************************************************/
-/*  renderer_storage.cpp                                                 */
+/*  utilities.cpp                                                        */
 /*************************************************************************/
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
 /*                           GODOT ENGINE                                */
@@ -28,11 +28,9 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-#include "renderer_storage.h"
+#include "utilities.h"
 
 
-RendererStorage *RendererStorage::base_singleton = nullptr;
-
-void RendererStorage::Dependency::changed_notify(DependencyChangedNotification p_notification) {
+void Dependency::changed_notify(DependencyChangedNotification p_notification) {
 	for (const KeyValue<DependencyTracker *, uint32_t> &E : instances) {
 	for (const KeyValue<DependencyTracker *, uint32_t> &E : instances) {
 		if (E.key->changed_callback) {
 		if (E.key->changed_callback) {
 			E.key->changed_callback(p_notification, E.key);
 			E.key->changed_callback(p_notification, E.key);
@@ -40,7 +38,7 @@ void RendererStorage::Dependency::changed_notify(DependencyChangedNotification p
 	}
 	}
 }
 }
 
 
-void RendererStorage::Dependency::deleted_notify(const RID &p_rid) {
+void Dependency::deleted_notify(const RID &p_rid) {
 	for (const KeyValue<DependencyTracker *, uint32_t> &E : instances) {
 	for (const KeyValue<DependencyTracker *, uint32_t> &E : instances) {
 		if (E.key->deleted_callback) {
 		if (E.key->deleted_callback) {
 			E.key->deleted_callback(p_rid, E.key);
 			E.key->deleted_callback(p_rid, E.key);
@@ -52,7 +50,7 @@ void RendererStorage::Dependency::deleted_notify(const RID &p_rid) {
 	instances.clear();
 	instances.clear();
 }
 }
 
 
-RendererStorage::Dependency::~Dependency() {
+Dependency::~Dependency() {
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	if (instances.size()) {
 	if (instances.size()) {
 		WARN_PRINT("Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.");
 		WARN_PRINT("Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.");
@@ -62,7 +60,3 @@ RendererStorage::Dependency::~Dependency() {
 	}
 	}
 #endif
 #endif
 }
 }
-
-RendererStorage::RendererStorage() {
-	base_singleton = this;
-}

+ 92 - 104
servers/rendering/renderer_storage.h → servers/rendering/storage/utilities.h

@@ -1,5 +1,5 @@
 /*************************************************************************/
 /*************************************************************************/
-/*  renderer_storage.h                                                   */
+/*  utilities.h                                                          */
 /*************************************************************************/
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
 /*                           GODOT ENGINE                                */
@@ -28,14 +28,14 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-#ifndef RENDERINGSERVERSTORAGE_H
-#define RENDERINGSERVERSTORAGE_H
+#ifndef RENDERER_UTILITIES_H
+#define RENDERER_UTILITIES_H
 
 
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
-class RendererStorage {
-	Color default_clear_color;
+class DependencyTracker;
 
 
+class Dependency {
 public:
 public:
 	enum DependencyChangedNotification {
 	enum DependencyChangedNotification {
 		DEPENDENCY_CHANGED_AABB,
 		DEPENDENCY_CHANGED_AABB,
@@ -52,137 +52,113 @@ public:
 		DEPENDENCY_CHANGED_REFLECTION_PROBE,
 		DEPENDENCY_CHANGED_REFLECTION_PROBE,
 	};
 	};
 
 
-	struct DependencyTracker;
+	void changed_notify(DependencyChangedNotification p_notification);
+	void deleted_notify(const RID &p_rid);
 
 
-	struct Dependency {
-		void changed_notify(DependencyChangedNotification p_notification);
-		void deleted_notify(const RID &p_rid);
+	~Dependency();
 
 
-		~Dependency();
-
-	private:
-		friend struct DependencyTracker;
-		HashMap<DependencyTracker *, uint32_t> instances;
-	};
+private:
+	friend class DependencyTracker;
+	HashMap<DependencyTracker *, uint32_t> instances;
+};
 
 
-	struct DependencyTracker {
-		void *userdata = nullptr;
-		typedef void (*ChangedCallback)(DependencyChangedNotification, DependencyTracker *);
-		typedef void (*DeletedCallback)(const RID &, DependencyTracker *);
+class DependencyTracker {
+public:
+	void *userdata = nullptr;
+	typedef void (*ChangedCallback)(Dependency::DependencyChangedNotification, DependencyTracker *);
+	typedef void (*DeletedCallback)(const RID &, DependencyTracker *);
 
 
-		ChangedCallback changed_callback = nullptr;
-		DeletedCallback deleted_callback = nullptr;
+	ChangedCallback changed_callback = nullptr;
+	DeletedCallback deleted_callback = nullptr;
 
 
-		void update_begin() { // call before updating dependencies
-			instance_version++;
-		}
+	void update_begin() { // call before updating dependencies
+		instance_version++;
+	}
 
 
-		void update_dependency(Dependency *p_dependency) { //called internally, can't be used directly, use update functions in Storage
-			dependencies.insert(p_dependency);
-			p_dependency->instances[this] = instance_version;
-		}
+	void update_dependency(Dependency *p_dependency) { //called internally, can't be used directly, use update functions in Storage
+		dependencies.insert(p_dependency);
+		p_dependency->instances[this] = instance_version;
+	}
 
 
-		void update_end() { //call after updating dependencies
-			List<Pair<Dependency *, DependencyTracker *>> to_clean_up;
-
-			for (Dependency *E : dependencies) {
-				Dependency *dep = E;
-				HashMap<DependencyTracker *, uint32_t>::Iterator F = dep->instances.find(this);
-				ERR_CONTINUE(!F);
-				if (F->value != instance_version) {
-					Pair<Dependency *, DependencyTracker *> p;
-					p.first = dep;
-					p.second = F->key;
-					to_clean_up.push_back(p);
-				}
+	void update_end() { //call after updating dependencies
+		List<Pair<Dependency *, DependencyTracker *>> to_clean_up;
+
+		for (Dependency *E : dependencies) {
+			Dependency *dep = E;
+			HashMap<DependencyTracker *, uint32_t>::Iterator F = dep->instances.find(this);
+			ERR_CONTINUE(!F);
+			if (F->value != instance_version) {
+				Pair<Dependency *, DependencyTracker *> p;
+				p.first = dep;
+				p.second = F->key;
+				to_clean_up.push_back(p);
 			}
 			}
+		}
 
 
-			while (to_clean_up.size()) {
-				to_clean_up.front()->get().first->instances.erase(to_clean_up.front()->get().second);
-				dependencies.erase(to_clean_up.front()->get().first);
-				to_clean_up.pop_front();
-			}
+		while (to_clean_up.size()) {
+			to_clean_up.front()->get().first->instances.erase(to_clean_up.front()->get().second);
+			dependencies.erase(to_clean_up.front()->get().first);
+			to_clean_up.pop_front();
 		}
 		}
+	}
 
 
-		void clear() { // clear all dependencies
-			for (Dependency *E : dependencies) {
-				Dependency *dep = E;
-				dep->instances.erase(this);
-			}
-			dependencies.clear();
+	void clear() { // clear all dependencies
+		for (Dependency *E : dependencies) {
+			Dependency *dep = E;
+			dep->instances.erase(this);
 		}
 		}
+		dependencies.clear();
+	}
 
 
-		~DependencyTracker() { clear(); }
+	~DependencyTracker() { clear(); }
 
 
-	private:
-		friend struct Dependency;
-		uint32_t instance_version = 0;
-		HashSet<Dependency *> dependencies;
-	};
+private:
+	friend class Dependency;
+	uint32_t instance_version = 0;
+	HashSet<Dependency *> dependencies;
+};
 
 
-	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) = 0;
+class RendererUtilities {
+public:
+	virtual ~RendererUtilities() {}
 
 
-	/* FOG VOLUMES */
+	/* INSTANCES */
 
 
-	virtual RID fog_volume_allocate() = 0;
-	virtual void fog_volume_initialize(RID p_rid) = 0;
+	virtual RS::InstanceType get_base_type(RID p_rid) const = 0;
+	virtual bool free(RID p_rid) = 0;
 
 
-	virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) = 0;
-	virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) = 0;
-	virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) = 0;
-	virtual AABB fog_volume_get_aabb(RID p_fog_volume) const = 0;
-	virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const = 0;
+	/* DEPENDENCIES */
+
+	virtual void base_update_dependency(RID p_base, DependencyTracker *p_instance) = 0;
 
 
 	/* VISIBILITY NOTIFIER */
 	/* VISIBILITY NOTIFIER */
 
 
 	virtual RID visibility_notifier_allocate() = 0;
 	virtual RID visibility_notifier_allocate() = 0;
 	virtual void visibility_notifier_initialize(RID p_notifier) = 0;
 	virtual void visibility_notifier_initialize(RID p_notifier) = 0;
+	virtual void visibility_notifier_free(RID p_notifier) = 0;
+
 	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) = 0;
 	virtual void visibility_notifier_set_aabb(RID p_notifier, const AABB &p_aabb) = 0;
 	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) = 0;
 	virtual void visibility_notifier_set_callbacks(RID p_notifier, const Callable &p_enter_callbable, const Callable &p_exit_callable) = 0;
 
 
 	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const = 0;
 	virtual AABB visibility_notifier_get_aabb(RID p_notifier) const = 0;
 	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) = 0;
 	virtual void visibility_notifier_call(RID p_notifier, bool p_enter, bool p_deferred) = 0;
 
 
-	virtual RS::InstanceType get_base_type(RID p_rid) const = 0;
-	virtual bool free(RID p_rid) = 0;
-
-	virtual bool has_os_feature(const String &p_feature) const = 0;
+	/* TIMING */
 
 
-	virtual void update_dirty_resources() = 0;
-
-	virtual void set_debug_generate_wireframes(bool p_generate) = 0;
-
-	virtual void update_memory_info() = 0;
-
-	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) = 0;
-	virtual String get_video_adapter_name() const = 0;
-	virtual String get_video_adapter_vendor() const = 0;
-	virtual RenderingDevice::DeviceType get_video_adapter_type() const = 0;
-	virtual String get_video_adapter_api_version() const = 0;
-
-	static RendererStorage *base_singleton;
-
-	void set_default_clear_color(const Color &p_color) {
-		default_clear_color = p_color;
-	}
+	bool capturing_timestamps = false;
 
 
-	Color get_default_clear_color() const {
-		return default_clear_color;
-	}
-#define TIMESTAMP_BEGIN()                             \
-	{                                                 \
-		if (RSG::storage->capturing_timestamps)       \
-			RSG::storage->capture_timestamps_begin(); \
+#define TIMESTAMP_BEGIN()                               \
+	{                                                   \
+		if (RSG::utilities->capturing_timestamps)       \
+			RSG::utilities->capture_timestamps_begin(); \
 	}
 	}
 
 
-#define RENDER_TIMESTAMP(m_text)                     \
-	{                                                \
-		if (RSG::storage->capturing_timestamps)      \
-			RSG::storage->capture_timestamp(m_text); \
+#define RENDER_TIMESTAMP(m_text)                       \
+	{                                                  \
+		if (RSG::utilities->capturing_timestamps)      \
+			RSG::utilities->capture_timestamp(m_text); \
 	}
 	}
 
 
-	bool capturing_timestamps = false;
-
 	virtual void capture_timestamps_begin() = 0;
 	virtual void capture_timestamps_begin() = 0;
 	virtual void capture_timestamp(const String &p_name) = 0;
 	virtual void capture_timestamp(const String &p_name) = 0;
 	virtual uint32_t get_captured_timestamps_count() const = 0;
 	virtual uint32_t get_captured_timestamps_count() const = 0;
@@ -191,8 +167,20 @@ public:
 	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const = 0;
 	virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const = 0;
 	virtual String get_captured_timestamp_name(uint32_t p_index) const = 0;
 	virtual String get_captured_timestamp_name(uint32_t p_index) const = 0;
 
 
-	RendererStorage();
-	virtual ~RendererStorage() {}
+	/* MISC */
+
+	virtual void update_dirty_resources() = 0;
+	virtual void set_debug_generate_wireframes(bool p_generate) = 0;
+
+	virtual bool has_os_feature(const String &p_feature) const = 0;
+
+	virtual void update_memory_info() = 0;
+
+	virtual uint64_t get_rendering_info(RS::RenderingInfo p_info) = 0;
+	virtual String get_video_adapter_name() const = 0;
+	virtual String get_video_adapter_vendor() const = 0;
+	virtual RenderingDevice::DeviceType get_video_adapter_type() const = 0;
+	virtual String get_video_adapter_api_version() const = 0;
 };
 };
 
 
-#endif // RENDERINGSERVERSTORAGE_H
+#endif // !RENDERER_UTILITIES_H

+ 0 - 2
servers/xr/xr_interface_extension.cpp

@@ -29,9 +29,7 @@
 /*************************************************************************/
 /*************************************************************************/
 
 
 #include "xr_interface_extension.h"
 #include "xr_interface_extension.h"
-#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
 #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
-#include "servers/rendering/renderer_storage.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "servers/rendering/rendering_server_globals.h"
 
 
 void XRInterfaceExtension::_bind_methods() {
 void XRInterfaceExtension::_bind_methods() {