Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2017-12-22 14:45:06 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-01-09 16:11:58 +0300
commit83b0603061c2f767f46e352566b0f407e0f6b9ad (patch)
tree98cd36636ddaba89cad32acd15d40bcb5782b359
parentb01fe3bf01e090711371476ec878660dd82fe22f (diff)
Subsurf: Avoid global lock for loops and orig index layers
This is a bit annoying to have per-DM locking, but it's way better (as in, up to 4 times better) for playback speed when having lots of subsurf objects,
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h6
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c26
2 files changed, 21 insertions, 11 deletions
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index f52bb2ab9cb..840c57ecfd3 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -34,6 +34,9 @@
/* struct DerivedMesh is used directly */
#include "BKE_DerivedMesh.h"
+/* Thread sync primitives used directly. */
+#include "BLI_threads.h"
+
struct CCGElem;
struct DMFlagMat;
struct DMGridAdjacency;
@@ -138,6 +141,9 @@ typedef struct CCGDerivedMesh {
} multires;
struct EdgeHash *ehash;
+
+ ThreadRWMutex loops_cache_rwlock;
+ ThreadRWMutex origindex_cache_rwlock;
} CCGDerivedMesh;
#ifdef WITH_OPENSUBDIV
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index ee1f5dc6696..6f2b755f0cd 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -88,9 +88,6 @@
/* assumes MLoop's are layed out 4 for each poly, in order */
#define USE_LOOP_LAYOUT_FAST
-static ThreadRWMutex loops_cache_rwlock = BLI_RWLOCK_INITIALIZER;
-static ThreadRWMutex origindex_cache_rwlock = BLI_RWLOCK_INITIALIZER;
-
static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int drawInteriorEdges,
int useSubsurfUv,
@@ -1490,7 +1487,7 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
/* DMFlagMat *faceFlags = ccgdm->faceFlags; */ /* UNUSED */
if (!ccgdm->ehash) {
- BLI_rw_mutex_lock(&loops_cache_rwlock, THREAD_LOCK_WRITE);
+ BLI_rw_mutex_lock(&ccgdm->loops_cache_rwlock, THREAD_LOCK_WRITE);
if (!ccgdm->ehash) {
MEdge *medge;
@@ -1501,10 +1498,10 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
BLI_edgehash_insert(ccgdm->ehash, medge[i].v1, medge[i].v2, SET_INT_IN_POINTER(i));
}
}
- BLI_rw_mutex_unlock(&loops_cache_rwlock);
+ BLI_rw_mutex_unlock(&ccgdm->loops_cache_rwlock);
}
- BLI_rw_mutex_lock(&loops_cache_rwlock, THREAD_LOCK_READ);
+ BLI_rw_mutex_lock(&ccgdm->loops_cache_rwlock, THREAD_LOCK_READ);
totface = ccgSubSurf_getNumFaces(ss);
mv = mloop;
for (index = 0; index < totface; index++) {
@@ -1547,7 +1544,7 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
}
}
}
- BLI_rw_mutex_unlock(&loops_cache_rwlock);
+ BLI_rw_mutex_unlock(&ccgdm->loops_cache_rwlock);
}
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, MPoly *mpoly)
@@ -4041,6 +4038,10 @@ static void ccgDM_release(DerivedMesh *dm)
MEM_freeN(ccgdm->edgeMap);
MEM_freeN(ccgdm->faceMap);
}
+
+ BLI_rw_mutex_end(&ccgdm->loops_cache_rwlock);
+ BLI_rw_mutex_end(&ccgdm->origindex_cache_rwlock);
+
MEM_freeN(ccgdm);
}
}
@@ -4055,14 +4056,14 @@ static void *ccgDM_get_vert_data_layer(DerivedMesh *dm, int type)
int a, index, totnone, totorig;
/* Avoid re-creation if the layer exists already */
- BLI_rw_mutex_lock(&origindex_cache_rwlock, THREAD_LOCK_READ);
+ BLI_rw_mutex_lock(&ccgdm->origindex_cache_rwlock, THREAD_LOCK_READ);
origindex = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
- BLI_rw_mutex_unlock(&origindex_cache_rwlock);
+ BLI_rw_mutex_unlock(&ccgdm->origindex_cache_rwlock);
if (origindex) {
return origindex;
}
- BLI_rw_mutex_lock(&origindex_cache_rwlock, THREAD_LOCK_WRITE);
+ BLI_rw_mutex_lock(&ccgdm->origindex_cache_rwlock, THREAD_LOCK_WRITE);
DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
origindex = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
@@ -4077,7 +4078,7 @@ static void *ccgDM_get_vert_data_layer(DerivedMesh *dm, int type)
CCGVert *v = ccgdm->vertMap[index].vert;
origindex[a] = ccgDM_getVertMapIndex(ccgdm->ss, v);
}
- BLI_rw_mutex_unlock(&origindex_cache_rwlock);
+ BLI_rw_mutex_unlock(&ccgdm->origindex_cache_rwlock);
return origindex;
}
@@ -5019,6 +5020,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->dm.numLoopData = ccgdm->dm.numPolyData * 4;
ccgdm->dm.numTessFaceData = 0;
+ BLI_rw_mutex_init(&ccgdm->loops_cache_rwlock);
+ BLI_rw_mutex_init(&ccgdm->origindex_cache_rwlock);
+
return ccgdm;
}