Only call initial_setup_default on the main thread, and document that shader duplication can crash if done from a different thread. Removed the material mutex from the prop cache as it's not needed anymore.

This commit is contained in:
Relintai 2021-08-25 17:24:25 +02:00
parent 4be30142fb
commit 2568178b42
6 changed files with 21 additions and 8 deletions

View File

@ -282,6 +282,8 @@ void PropMaterialCache::refresh_rects() {
}
void PropMaterialCache::initial_setup_default() {
//Note: call only on the main thread! Shader->duplicate() can crash if done from an another thread!
PropCache *pc = PropCache::get_singleton();
pc->ensure_materials_loaded();

View File

@ -533,6 +533,21 @@ void PropInstanceMerger::_build() {
Ref<PropMaterialCache> cache = PropCache::get_singleton()->material_cache_get(_prop_data);
if (!cache->get_initialized()) {
//lock it!
cache->mutex_lock();
//check again, this thread might have gotten here after an another one already did the initialization!
//this check might not be needed here
if (!cache->get_initialized()) {
//this will set up materials, and settings
//needs to be called from the main thread!
cache->initial_setup_default();
}
cache->mutex_unlock();
}
_job->set_material_cache(cache);
prop_preprocess(Transform(), _prop_data);
@ -588,7 +603,6 @@ void PropInstanceMerger::_prop_preprocess(Transform transform, const Ref<PropDat
Ref<PropDataTiledWall> tiled_wall_data = e;
if (tiled_wall_data.is_valid()) {
_job->add_tiled_wall(tiled_wall_data, t);
if (tiled_wall_data->get_collision()) {

View File

@ -267,7 +267,9 @@ void PropInstancePropJob::phase_setup_cache() {
//check again, this thread might have gotten here after an another one already did the initialization!
if (!_material_cache->get_initialized()) {
//this will set up materials, and settings
_material_cache->initial_setup_default();
//Can only be called from the main thread!
//Merger calls this
//_material_cache->initial_setup_default();
_material_cache->prop_add_textures(_prop_instace->get_prop_data());

View File

@ -170,13 +170,9 @@ void PropCache::materials_load() {
}
void PropCache::ensure_materials_loaded() {
_material_mutex.lock();
if (_materials.size() != _material_paths.size()) {
materials_load();
}
_material_mutex.unlock();
}
Vector<Variant> PropCache::materials_get() {

View File

@ -122,8 +122,6 @@ protected:
Mutex _tiled_wall_material_cache_mutex;
Mutex _custom_keyed_material_cache_mutex;
Mutex _material_mutex;
#ifdef TEXTURE_PACKER_PRESENT
int _texture_flags;
int _max_atlas_size;

View File

@ -155,6 +155,7 @@ void TiledWall::refresh() {
//An anouther thread could have initialized it before wo got the mutex!
if (!_cache->get_initialized()) {
//can only be called from the main thread!
_cache->initial_setup_default();
_data->setup_cache(_cache);