Subsurf: Use regular mutex instead of RW one
Mutex is now local to particular CCGDM, and guarding edge hash which is only used by a single function only. There is no need to acquire read lock after edge hash was created.
This commit is contained in:
parent
b415ed55a7
commit
498ffef7b0
|
@ -144,7 +144,7 @@ typedef struct CCGDerivedMesh {
|
||||||
|
|
||||||
struct EdgeHash *ehash;
|
struct EdgeHash *ehash;
|
||||||
|
|
||||||
ThreadRWMutex loops_cache_rwlock;
|
ThreadMutex loops_cache_lock;
|
||||||
ThreadRWMutex origindex_cache_rwlock;
|
ThreadRWMutex origindex_cache_rwlock;
|
||||||
} CCGDerivedMesh;
|
} CCGDerivedMesh;
|
||||||
|
|
||||||
|
|
|
@ -1488,7 +1488,7 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
|
||||||
/* DMFlagMat *faceFlags = ccgdm->faceFlags; */ /* UNUSED */
|
/* DMFlagMat *faceFlags = ccgdm->faceFlags; */ /* UNUSED */
|
||||||
|
|
||||||
if (!ccgdm->ehash) {
|
if (!ccgdm->ehash) {
|
||||||
BLI_rw_mutex_lock(&ccgdm->loops_cache_rwlock, THREAD_LOCK_WRITE);
|
BLI_mutex_lock(&ccgdm->loops_cache_lock);
|
||||||
if (!ccgdm->ehash) {
|
if (!ccgdm->ehash) {
|
||||||
MEdge *medge;
|
MEdge *medge;
|
||||||
EdgeHash *ehash;
|
EdgeHash *ehash;
|
||||||
|
@ -1502,10 +1502,9 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
|
||||||
|
|
||||||
atomic_cas_ptr((void**)&ccgdm->ehash, ccgdm->ehash, ehash);
|
atomic_cas_ptr((void**)&ccgdm->ehash, ccgdm->ehash, ehash);
|
||||||
}
|
}
|
||||||
BLI_rw_mutex_unlock(&ccgdm->loops_cache_rwlock);
|
BLI_mutex_unlock(&ccgdm->loops_cache_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_rw_mutex_lock(&ccgdm->loops_cache_rwlock, THREAD_LOCK_READ);
|
|
||||||
totface = ccgSubSurf_getNumFaces(ss);
|
totface = ccgSubSurf_getNumFaces(ss);
|
||||||
ml = mloop;
|
ml = mloop;
|
||||||
for (index = 0; index < totface; index++) {
|
for (index = 0; index < totface; index++) {
|
||||||
|
@ -1548,7 +1547,6 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BLI_rw_mutex_unlock(&ccgdm->loops_cache_rwlock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mpoly)
|
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mpoly)
|
||||||
|
@ -4050,7 +4048,7 @@ static void ccgDM_release(DerivedMesh *dm)
|
||||||
MEM_freeN(ccgdm->faceMap);
|
MEM_freeN(ccgdm->faceMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_rw_mutex_end(&ccgdm->loops_cache_rwlock);
|
BLI_mutex_end(&ccgdm->loops_cache_lock);
|
||||||
BLI_rw_mutex_end(&ccgdm->origindex_cache_rwlock);
|
BLI_rw_mutex_end(&ccgdm->origindex_cache_rwlock);
|
||||||
|
|
||||||
MEM_freeN(ccgdm);
|
MEM_freeN(ccgdm);
|
||||||
|
@ -5044,7 +5042,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
||||||
ccgdm->dm.numLoopData = ccgdm->dm.numPolyData * 4;
|
ccgdm->dm.numLoopData = ccgdm->dm.numPolyData * 4;
|
||||||
ccgdm->dm.numTessFaceData = 0;
|
ccgdm->dm.numTessFaceData = 0;
|
||||||
|
|
||||||
BLI_rw_mutex_init(&ccgdm->loops_cache_rwlock);
|
BLI_mutex_init(&ccgdm->loops_cache_lock);
|
||||||
BLI_rw_mutex_init(&ccgdm->origindex_cache_rwlock);
|
BLI_rw_mutex_init(&ccgdm->origindex_cache_rwlock);
|
||||||
|
|
||||||
return ccgdm;
|
return ccgdm;
|
||||||
|
|
Loading…
Reference in New Issue