Moved dirty material lists from static to lifetime controlled by main.
As with 7d82bed4f4,
The list is now destroyed before the OS object, so can print errors if
there are unfreed materials.
This commit is contained in:
parent
03bd4d28a5
commit
c1f5233217
6 changed files with 33 additions and 18 deletions
|
|
@ -42,7 +42,7 @@
|
|||
#include "servers/visual_server.h"
|
||||
|
||||
Mutex *CanvasItemMaterial::material_mutex = NULL;
|
||||
SelfList<CanvasItemMaterial>::List CanvasItemMaterial::dirty_materials;
|
||||
SelfList<CanvasItemMaterial>::List *CanvasItemMaterial::dirty_materials = NULL;
|
||||
Map<CanvasItemMaterial::MaterialKey, CanvasItemMaterial::ShaderData> CanvasItemMaterial::shader_map;
|
||||
CanvasItemMaterial::ShaderNames *CanvasItemMaterial::shader_names = NULL;
|
||||
|
||||
|
|
@ -52,6 +52,8 @@ void CanvasItemMaterial::init_shaders() {
|
|||
material_mutex = Mutex::create();
|
||||
#endif
|
||||
|
||||
dirty_materials = memnew(SelfList<CanvasItemMaterial>::List);
|
||||
|
||||
shader_names = memnew(ShaderNames);
|
||||
|
||||
shader_names->particles_anim_h_frames = "particles_anim_h_frames";
|
||||
|
|
@ -61,6 +63,9 @@ void CanvasItemMaterial::init_shaders() {
|
|||
|
||||
void CanvasItemMaterial::finish_shaders() {
|
||||
|
||||
memdelete(dirty_materials);
|
||||
dirty_materials = NULL;
|
||||
|
||||
#ifndef NO_THREADS
|
||||
memdelete(material_mutex);
|
||||
#endif
|
||||
|
|
@ -68,7 +73,7 @@ void CanvasItemMaterial::finish_shaders() {
|
|||
|
||||
void CanvasItemMaterial::_update_shader() {
|
||||
|
||||
dirty_materials.remove(&element);
|
||||
dirty_materials->remove(&element);
|
||||
|
||||
MaterialKey mk = _compute_key();
|
||||
if (mk.key == current_key.key)
|
||||
|
|
@ -157,9 +162,9 @@ void CanvasItemMaterial::flush_changes() {
|
|||
if (material_mutex)
|
||||
material_mutex->lock();
|
||||
|
||||
while (dirty_materials.first()) {
|
||||
while (dirty_materials->first()) {
|
||||
|
||||
dirty_materials.first()->self()->_update_shader();
|
||||
dirty_materials->first()->self()->_update_shader();
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
@ -172,7 +177,7 @@ void CanvasItemMaterial::_queue_shader_change() {
|
|||
material_mutex->lock();
|
||||
|
||||
if (!element.in_list()) {
|
||||
dirty_materials.add(&element);
|
||||
dirty_materials->add(&element);
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ private:
|
|||
}
|
||||
|
||||
static Mutex *material_mutex;
|
||||
static SelfList<CanvasItemMaterial>::List dirty_materials;
|
||||
static SelfList<CanvasItemMaterial>::List *dirty_materials;
|
||||
SelfList<CanvasItemMaterial> element;
|
||||
|
||||
void _update_shader();
|
||||
|
|
|
|||
|
|
@ -258,7 +258,7 @@ ShaderMaterial::~ShaderMaterial() {
|
|||
/////////////////////////////////
|
||||
|
||||
Mutex *SpatialMaterial::material_mutex = NULL;
|
||||
SelfList<SpatialMaterial>::List SpatialMaterial::dirty_materials;
|
||||
SelfList<SpatialMaterial>::List *SpatialMaterial::dirty_materials = NULL;
|
||||
Map<SpatialMaterial::MaterialKey, SpatialMaterial::ShaderData> SpatialMaterial::shader_map;
|
||||
SpatialMaterial::ShaderNames *SpatialMaterial::shader_names = NULL;
|
||||
|
||||
|
|
@ -268,6 +268,8 @@ void SpatialMaterial::init_shaders() {
|
|||
material_mutex = Mutex::create();
|
||||
#endif
|
||||
|
||||
dirty_materials = memnew(SelfList<SpatialMaterial>::List);
|
||||
|
||||
shader_names = memnew(ShaderNames);
|
||||
|
||||
shader_names->albedo = "albedo";
|
||||
|
|
@ -348,12 +350,15 @@ void SpatialMaterial::finish_shaders() {
|
|||
memdelete(material_mutex);
|
||||
#endif
|
||||
|
||||
memdelete(dirty_materials);
|
||||
dirty_materials = NULL;
|
||||
|
||||
memdelete(shader_names);
|
||||
}
|
||||
|
||||
void SpatialMaterial::_update_shader() {
|
||||
|
||||
dirty_materials.remove(&element);
|
||||
dirty_materials->remove(&element);
|
||||
|
||||
MaterialKey mk = _compute_key();
|
||||
if (mk.key == current_key.key)
|
||||
|
|
@ -1002,9 +1007,9 @@ void SpatialMaterial::flush_changes() {
|
|||
if (material_mutex)
|
||||
material_mutex->lock();
|
||||
|
||||
while (dirty_materials.first()) {
|
||||
while (dirty_materials->first()) {
|
||||
|
||||
dirty_materials.first()->self()->_update_shader();
|
||||
dirty_materials->first()->self()->_update_shader();
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
@ -1017,7 +1022,7 @@ void SpatialMaterial::_queue_shader_change() {
|
|||
material_mutex->lock();
|
||||
|
||||
if (!element.in_list()) {
|
||||
dirty_materials.add(&element);
|
||||
dirty_materials->add(&element);
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ private:
|
|||
};
|
||||
|
||||
static Mutex *material_mutex;
|
||||
static SelfList<SpatialMaterial>::List dirty_materials;
|
||||
static SelfList<SpatialMaterial>::List *dirty_materials;
|
||||
static ShaderNames *shader_names;
|
||||
|
||||
SelfList<SpatialMaterial> element;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#include "particles_material.h"
|
||||
|
||||
Mutex *ParticlesMaterial::material_mutex = NULL;
|
||||
SelfList<ParticlesMaterial>::List ParticlesMaterial::dirty_materials;
|
||||
SelfList<ParticlesMaterial>::List *ParticlesMaterial::dirty_materials = NULL;
|
||||
Map<ParticlesMaterial::MaterialKey, ParticlesMaterial::ShaderData> ParticlesMaterial::shader_map;
|
||||
ParticlesMaterial::ShaderNames *ParticlesMaterial::shader_names = NULL;
|
||||
|
||||
|
|
@ -41,6 +41,8 @@ void ParticlesMaterial::init_shaders() {
|
|||
material_mutex = Mutex::create();
|
||||
#endif
|
||||
|
||||
dirty_materials = memnew(SelfList<ParticlesMaterial>::List);
|
||||
|
||||
shader_names = memnew(ShaderNames);
|
||||
|
||||
shader_names->spread = "spread";
|
||||
|
|
@ -106,12 +108,15 @@ void ParticlesMaterial::finish_shaders() {
|
|||
memdelete(material_mutex);
|
||||
#endif
|
||||
|
||||
memdelete(dirty_materials);
|
||||
dirty_materials = NULL;
|
||||
|
||||
memdelete(shader_names);
|
||||
}
|
||||
|
||||
void ParticlesMaterial::_update_shader() {
|
||||
|
||||
dirty_materials.remove(&element);
|
||||
dirty_materials->remove(&element);
|
||||
|
||||
MaterialKey mk = _compute_key();
|
||||
if (mk.key == current_key.key)
|
||||
|
|
@ -584,9 +589,9 @@ void ParticlesMaterial::flush_changes() {
|
|||
if (material_mutex)
|
||||
material_mutex->lock();
|
||||
|
||||
while (dirty_materials.first()) {
|
||||
while (dirty_materials->first()) {
|
||||
|
||||
dirty_materials.first()->self()->_update_shader();
|
||||
dirty_materials->first()->self()->_update_shader();
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
@ -599,7 +604,7 @@ void ParticlesMaterial::_queue_shader_change() {
|
|||
material_mutex->lock();
|
||||
|
||||
if (!element.in_list()) {
|
||||
dirty_materials.add(&element);
|
||||
dirty_materials->add(&element);
|
||||
}
|
||||
|
||||
if (material_mutex)
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ private:
|
|||
}
|
||||
|
||||
static Mutex *material_mutex;
|
||||
static SelfList<ParticlesMaterial>::List dirty_materials;
|
||||
static SelfList<ParticlesMaterial>::List *dirty_materials;
|
||||
|
||||
struct ShaderNames {
|
||||
StringName spread;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue