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:
Ibrahn Sahir 2018-11-21 15:48:05 +00:00
parent 03bd4d28a5
commit c1f5233217
6 changed files with 33 additions and 18 deletions

View File

@ -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)

View File

@ -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();

View File

@ -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)

View File

@ -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;

View File

@ -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)

View File

@ -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;