[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