[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57900] branches/soc-2013-depsgraph_mt/ source: Made modifiers_getVirtualModifierList safe for threading

Sergey Sharybin sergey.vfx at gmail.com
Mon Jul 1 13:00:23 CEST 2013


Revision: 57900
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57900
Author:   nazgul
Date:     2013-07-01 11:00:22 +0000 (Mon, 01 Jul 2013)
Log Message:
-----------
Made modifiers_getVirtualModifierList safe for threading

Move static variables to context filling in by this fcuntion
and owned by a callee function. This ensures no conflicts
between threads happens because of static variables used in
this function.

Also moved modifier types and virtual modifiers data to a
function called from creator. This is needed to be sure all
the information is properly initialied to the time when
threads starts to use this data.

Modified Paths:
--------------
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/BKE_modifier.h
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/displist.c
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/lattice.c
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/modifier.c
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/object.c
    branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/object_deform.c
    branches/soc-2013-depsgraph_mt/source/blender/editors/interface/interface_templates.c
    branches/soc-2013-depsgraph_mt/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2013-depsgraph_mt/source/blender/editors/util/crazyspace.c
    branches/soc-2013-depsgraph_mt/source/creator/creator.c
    branches/soc-2013-depsgraph_mt/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/BKE_modifier.h	2013-07-01 09:12:40 UTC (rev 57899)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/BKE_modifier.h	2013-07-01 11:00:22 UTC (rev 57900)
@@ -307,6 +307,9 @@
 	                       TexWalkFunc walk, void *userData);
 } ModifierTypeInfo;
 
+/* Initialize modifier's global data (type info and some common global storages). */
+void BKE_modifier_init(void);
+
 ModifierTypeInfo *modifierType_getInfo(ModifierType type);
 
 /* Modifier utility calls, do call through type pointer and return
@@ -380,8 +383,16 @@
 struct ModifierData *modifiers_getLastPreview(struct Scene *scene,
                                               struct ModifierData *md,
                                               int required_mode);
-struct ModifierData  *modifiers_getVirtualModifierList(struct Object *ob);
 
+typedef struct VirtualModifierData {
+	ArmatureModifierData amd;
+	CurveModifierData cmd;
+	LatticeModifierData lmd;
+	ShapeKeyModifierData smd;
+} VirtualModifierData;
+
+struct ModifierData  *modifiers_getVirtualModifierList(struct Object *ob, struct VirtualModifierData *data);
+
 /* ensure modifier correctness when changing ob->data */
 void test_object_modifiers(struct Object *ob);
 

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/DerivedMesh.c	2013-07-01 09:12:40 UTC (rev 57899)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/DerivedMesh.c	2013-07-01 11:00:22 UTC (rev 57900)
@@ -1443,6 +1443,8 @@
 	/* XXX Same as above... For now, only weights preview in WPaint mode. */
 	const int do_mod_wmcol = do_init_wmcol;
 
+	VirtualModifierData virtualModifierData;
+
 	ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0;
 	ModifierApplyFlag deform_app_flags = app_flags;
 	if (useCache)
@@ -1454,7 +1456,7 @@
 		has_multires = 0;
 
 	if (!skipVirtualArmature) {
-		firstmd = modifiers_getVirtualModifierList(ob);
+		firstmd = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	}
 	else {
 		/* game engine exception */
@@ -1964,6 +1966,7 @@
 	int do_init_wmcol = ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) && !do_final_wmcol);
 	int do_init_statvis = ((((Mesh *)ob->data)->drawflag & ME_DRAW_STATVIS) && !do_init_wmcol);
 	const int do_mod_wmcol = do_init_wmcol;
+	VirtualModifierData virtualModifierData;
 
 	modifiers_clearErrors(ob);
 
@@ -1972,7 +1975,7 @@
 	}
 
 	dm = NULL;
-	md = modifiers_getVirtualModifierList(ob);
+	md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 
 	/* copied from mesh_calc_modifiers */
 	if (do_mod_wmcol) {

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/displist.c
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/displist.c	2013-07-01 09:12:40 UTC (rev 57899)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/displist.c	2013-07-01 11:00:22 UTC (rev 57900)
@@ -736,7 +736,8 @@
 
 static ModifierData *curve_get_tessellate_point(Scene *scene, Object *ob, int renderResolution, int editmode)
 {
-	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	int required_mode;
 
@@ -778,7 +779,8 @@
                                      float (**originalVerts_r)[3],
                                      float (**deformedVerts_r)[3], int *numVerts_r)
 {
-	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	Curve *cu = ob->data;
 	ListBase *nurb = BKE_curve_nurbs_get(cu);
@@ -892,7 +894,8 @@
                                       int forRender, int renderResolution,
                                       float (*originalVerts)[3], float (*deformedVerts)[3])
 {
-	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	Curve *cu = ob->data;
 	ListBase *nurb = BKE_curve_nurbs_get(cu);
@@ -1136,8 +1139,8 @@
 	/* this function represents logic of mesh's orcodm calculation
 	 * for displist-based objects
 	 */
-
-	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	Curve *cu = ob->data;
 	int required_mode;

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/lattice.c
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/lattice.c	2013-07-01 09:12:40 UTC (rev 57899)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/lattice.c	2013-07-01 11:00:22 UTC (rev 57900)
@@ -991,7 +991,8 @@
 void BKE_lattice_modifiers_calc(Scene *scene, Object *ob)
 {
 	Lattice *lt = ob->data;
-	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	float (*vertexCos)[3] = NULL;
 	int numVerts, editmode = (lt->editlatt != NULL);
 

Modified: branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/modifier.c	2013-07-01 09:12:40 UTC (rev 57899)
+++ branches/soc-2013-depsgraph_mt/source/blender/blenkernel/intern/modifier.c	2013-07-01 11:00:22 UTC (rev 57900)
@@ -69,19 +69,44 @@
 
 #include "MOD_modifiertypes.h"
 
-ModifierTypeInfo *modifierType_getInfo(ModifierType type)
+static ModifierTypeInfo *modifier_types[NUM_MODIFIER_TYPES] = {NULL};
+static VirtualModifierData virtualModifierCommonData;
+
+void BKE_modifier_init(void)
 {
-	static ModifierTypeInfo *types[NUM_MODIFIER_TYPES] = {NULL};
-	static int types_init = 1;
+	ModifierData *md;
 
-	if (types_init) {
-		modifier_type_init(types); /* MOD_utils.c */
-		types_init = 0;
-	}
+	/* Initialize modifier types */
+	modifier_type_init(modifier_types); /* MOD_utils.c */
 
+	/* Initialize global cmmon storage used for virtual modifier list */
+	md = modifier_new(eModifierType_Armature);
+	virtualModifierCommonData.amd = *((ArmatureModifierData *) md);
+	modifier_free(md);
+
+	md = modifier_new(eModifierType_Curve);
+	virtualModifierCommonData.cmd = *((CurveModifierData *) md);
+	modifier_free(md);
+
+	md = modifier_new(eModifierType_Lattice);
+	virtualModifierCommonData.lmd = *((LatticeModifierData *) md);
+	modifier_free(md);
+
+	md = modifier_new(eModifierType_ShapeKey);
+	virtualModifierCommonData.smd = *((ShapeKeyModifierData *) md);
+	modifier_free(md);
+
+	virtualModifierCommonData.amd.modifier.mode |= eModifierMode_Virtual;
+	virtualModifierCommonData.cmd.modifier.mode |= eModifierMode_Virtual;
+	virtualModifierCommonData.lmd.modifier.mode |= eModifierMode_Virtual;
+	virtualModifierCommonData.smd.modifier.mode |= eModifierMode_Virtual;
+}
+
+ModifierTypeInfo *modifierType_getInfo(ModifierType type)
+{
 	/* type unsigned, no need to check < 0 */
-	if (type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') {
-		return types[type];
+	if (type < NUM_MODIFIER_TYPES && modifier_types[type]->name[0] != '\0') {
+		return modifier_types[type];
 	}
 	else {
 		return NULL;
@@ -289,7 +314,8 @@
  */
 int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
 {
-	ModifierData *md = (virtual_) ? modifiers_getVirtualModifierList(ob) : ob->modifiers.first;
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = (virtual_) ? modifiers_getVirtualModifierList(ob, &virtualModifierData) : ob->modifiers.first;
 	int i, cageIndex = -1;
 
 	if (lastPossibleCageIndex_r) {
@@ -435,74 +461,43 @@
 /* NOTE: This is to support old files from before Blender supported modifiers,
  * in some cases versioning code updates these so for new files this will
  * return an empty list. */
-ModifierData *modifiers_getVirtualModifierList(Object *ob)
+ModifierData *modifiers_getVirtualModifierList(Object *ob, VirtualModifierData *virtualModifierData)
 {
-	/* Kinda hacky, but should be fine since we are never
-	 * re-entrant and avoid free hassles.
-	 */
-	static ArmatureModifierData amd;
-	static CurveModifierData cmd;
-	static LatticeModifierData lmd;
-	static ShapeKeyModifierData smd;
-	static int init = 1;
 	ModifierData *md;
 
-	if (init) {
-		md = modifier_new(eModifierType_Armature);
-		amd = *((ArmatureModifierData *) md);
-		modifier_free(md);
+	md = ob->modifiers.first;
 
-		md = modifier_new(eModifierType_Curve);
-		cmd = *((CurveModifierData *) md);
-		modifier_free(md);
+	*virtualModifierData = virtualModifierCommonData;
 
-		md = modifier_new(eModifierType_Lattice);
-		lmd = *((LatticeModifierData *) md);
-		modifier_free(md);
-
-		md = modifier_new(eModifierType_ShapeKey);
-		smd = *((ShapeKeyModifierData *) md);
-		modifier_free(md);
-
-		amd.modifier.mode |= eModifierMode_Virtual;
-		cmd.modifier.mode |= eModifierMode_Virtual;
-		lmd.modifier.mode |= eModifierMode_Virtual;
-		smd.modifier.mode |= eModifierMode_Virtual;
-
-		init = 0;
-	}
-
-	md = ob->modifiers.first;
-
 	if (ob->parent) {
 		if (ob->parent->type == OB_ARMATURE && ob->partype == PARSKEL) {
-			amd.object = ob->parent;
-			amd.modifier.next = md;
-			amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag;
-			md = &amd.modifier;
+			virtualModifierData->amd.object = ob->parent;
+			virtualModifierData->amd.modifier.next = md;
+			virtualModifierData->amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag;
+			md = &virtualModifierData->amd.modifier;
 		}
 		else if (ob->parent->type == OB_CURVE && ob->partype == PARSKEL) {
-			cmd.object = ob->parent;
-			cmd.defaxis = ob->trackflag + 1;
-			cmd.modifier.next = md;
-			md = &cmd.modifier;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list