[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59262] trunk/blender: Made modifiers_getVirtualModifierList safe for threading

Sergey Sharybin sergey.vfx at gmail.com
Mon Aug 19 11:05:35 CEST 2013


Revision: 59262
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59262
Author:   nazgul
Date:     2013-08-19 09:05:34 +0000 (Mon, 19 Aug 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.

--
svn merge -r57899:57900 ^/branches/soc-2013-depsgraph_mt

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57899

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

Property Changed:
----------------
    trunk/blender/
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/space_outliner/


Property changes on: trunk/blender
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573,58822,58989
/branches/soc-2013-depsgraph_mt:57516
/branches/soc-2013-dingto:57424,57487,57507,57525,57599,57670,57918-57919,57981,58091,58245,58253,58587,58772,58774-58775,58828,58835,59032
/tags/blender-2.67b-release/blender:57122
   + /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573,58822,58989
/branches/soc-2013-depsgraph_mt:57516,57900
/branches/soc-2013-dingto:57424,57487,57507,57525,57599,57670,57918-57919,57981,58091,58245,58253,58587,58772,58774-58775,58828,58835,59032
/tags/blender-2.67b-release/blender:57122

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2013-08-19 08:30:03 UTC (rev 59261)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2013-08-19 09:05:34 UTC (rev 59262)
@@ -304,6 +304,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
@@ -377,8 +380,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: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-08-19 08:30:03 UTC (rev 59261)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-08-19 09:05:34 UTC (rev 59262)
@@ -1440,6 +1440,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)
@@ -1451,7 +1453,7 @@
 		has_multires = 0;
 
 	if (!skipVirtualArmature) {
-		firstmd = modifiers_getVirtualModifierList(ob);
+		firstmd = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	}
 	else {
 		/* game engine exception */
@@ -1961,6 +1963,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);
 
@@ -1969,7 +1972,7 @@
 	}
 
 	dm = NULL;
-	md = modifiers_getVirtualModifierList(ob);
+	md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 
 	/* copied from mesh_calc_modifiers */
 	if (do_mod_wmcol) {

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2013-08-19 08:30:03 UTC (rev 59261)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2013-08-19 09:05:34 UTC (rev 59262)
@@ -742,7 +742,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;
 
@@ -784,7 +785,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);
@@ -898,7 +900,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);
@@ -1142,8 +1145,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: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-08-19 08:30:03 UTC (rev 59261)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-08-19 09:05:34 UTC (rev 59262)
@@ -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: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2013-08-19 08:30:03 UTC (rev 59261)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2013-08-19 09:05:34 UTC (rev 59262)
@@ -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)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list