Commit Graph

8994 Commits

Author SHA1 Message Date
Sergey Sharybin
4e9d469dfd Merging r57934 through r57953 from trunk into soc-2013-depsgraph_mt 2013-07-03 08:31:46 +00:00
Campbell Barton
e60a33ba07 fix for own error in 57226, broke subsurf-uv 2013-07-02 21:47:42 +00:00
Sergey Sharybin
7c7a3f7879 Fix for dupli-groups update going wrong
Dupli-groups used to have special case for updating
which is BKE_group_handle_recalc_and_update. This
function calls BKE_object_handle_update for every
object in the group.

This isn't thread-safe, because object could be
updating in separate thread already. And what's
worse dependencies are not known for objects inside
the group, which makes it impossible to schedule
objects from the group in a safe way.

It's even impossible to schedule groups as different
tasks, because groups could share the same objects.

For now used simple but robust solution which is
updating dupli-groups in main thread, handling
groups one-by-one and updating objects from the
group one-by-one as well.

Will work on a proper solution for this later.
2013-07-02 19:23:23 +00:00
Sergey Sharybin
e4f7260bac Move bevel list and path from Curve to Object datablock
I know this is not so much nice to have this guys hanging
around in a general Object datablock and ideally they better
be wrapped around into a structure like DerivedMesh or
something like this. But this is pure runtime only stuff and
we could re-wrap them around later.

Main purpose of this is making curves more thread safe,
so no separate threads will ever start freeing the same path
or the same bevel list.

It also makes sense because path and bevel shall include
deformation coming from modifiers which are applying on
pre-tesselation point and different objects could have
different set of modifiers. This used to be really confusing
in the past and now dtaa which depends on object is stored
in an object, making things clear for understanding even.

This doesn't make curve code fully thread-safe due to
pre-tesselation modifiers still modifies actual nurbs and
lock is still needed in makeDispListsCurveTypes, but this
change makes usage of paths safe for threading.

Once modifiers will stop modifying actual nurbs, curves
will be fully safe for threading.
2013-07-02 19:23:19 +00:00
Sergey Sharybin
79c678be89 Fix issue when the same task gets added twice to the queue
Issue was caused by worker threads updating nodes valency
at the same time while we're filling the queue with "root"
nodes (leaf nodes which don't depend on others).
2013-07-02 19:23:12 +00:00
Sergey Sharybin
a03437cb1a Initial idea of running post-modifiers out of lock wasn't correct
The tihng here is: curve is getting modified by modifier stack
and then it's coordinates are restored. To be really safe we
need to do all this locked.
2013-07-02 19:23:06 +00:00
Sergey Sharybin
d50ff36d3d Add workaroud to make threaded object update stable
Added threading lock around unsafe part of do_makeDispListCurveTypes
(parts which touches Curve->bev and Curve->path). Namely it means
pre-tesselation modifiers, bevel, path and non-modified display
list will be calculated inside a locked thread.

Post-tessellation modifiers will eb calculated outside of locked
thread, which means heavy constructive or deformation modifiers
applying on tesselated spline will be nicely threaded.

This makes it possible to use threaded object update by default
in the branch, so everyone could start testing it.
2013-07-02 19:23:03 +00:00
Sergey Sharybin
41f0c137ba Get rid of a display list stored in Curve datablock
This display list was only used for texture space calculation,
and even there this display list was only used for bounding
box calulation.

Since we alreayd do have boundgind box in a curve datablock
there's no reason to duplicate non-modified display list
just to calculate bounding box later, let's just calculate
boundding box at the first point.

This makes code a little be more thread-safe but curves are
still not safe for threads at all because of bevel list and
path. That would be solved later.
2013-07-02 19:22:59 +00:00
Sergey Sharybin
e607825f6b Replace mutex lock with spinlock in threaded object update
It's not so much happening inside the lock and using spin
lock instead of mutex lock will give some speedup due to
smaller latency of resuming the thread when mutex was locked.
2013-07-02 19:22:52 +00:00
Sergey Sharybin
f129393408 Put debug prints in threaded debug into G.debug & G_DEBUG check. 2013-07-02 19:22:46 +00:00
Sergey Sharybin
8c67e9d799 Merging r57925 through r57933 from trunk into soc-2013-depsgraph_mt 2013-07-02 19:18:10 +00:00
Brecht Van Lommel
a30dc7c74e Fix #35966: remesh modifier + particle use modifier stack option did not work
well together.
2013-07-02 19:17:34 +00:00
Campbell Barton
418011907c remove nan copyrights from code added since blender become opensource (copy paste errors), also remove BKE_script.h 2013-07-02 10:14:59 +00:00
Campbell Barton
1f091fd234 add missing gpl headers 2013-07-02 09:47:22 +00:00
Sergey Sharybin
311d4e15ec Merging r57897 through r57924 from trunk into soc-2013-depsgraph_mt 2013-07-02 06:40:05 +00:00
Sergey Sharybin
ded22d7060 Replace stupid static balancing with task-based one
Initially i wanted to have some really simple and basic
threading scheduler and wrote one based on traversing
depsgraph in advance. But it ended up in some issues with
the single-pass traverse i did which didn't gather all
the dependencies actually.

That was for sure solvable, but it ended up in a bit of
time consuming thing and with huge help of Brecht's
patch it was faster just to write proper balancing.

But it's again really basic thing, which could be
easily changed depending on feedback and design decisions
from Joshua,

So for now it works in the following way:

- Currently DagNode is used for threaded evaluaiton,
  meaning traversing actually happens for DagNodes.

  This is easier than converting DAG to a graph where
  only objects are stored, but required adding one int
  field to DagNode for faster runtime checks.

  We could change this later when it'll be clear how
  and where we'll store evaluation data, but for now
  it work pretty ok.

- The new field is called "valency" and it's basically
  number of node parents which needs to be evaluated
  before the node itself could be evaluated.

- Nodes' valency is getting initialized before threading,
  and when node finished to update valency of it's childs
  is getting decreased by one. And if it happens so
  child's valency became zero, it's adding to task pool.

- There's thread lock around valency update, it'll be
  replaced with spinlock in nearest future.

- Another update runtime data is node color. White nodes
  represents objects, gray one non-objects.

  Currently it's needed to distinguish whether we need to
  call object_handle_update on node->ob or not. In the
  future it could be replaced with node->type to support
  granularity, meaning we then could update object data
  separately from object itself.

- Needed to add some public depsgraph functions to make
  it possible to traverse depsgraph without including
  depsgraph private header to other files.

This change doesn't make code anyhow more stable, but
solves update order issues noticed while working on
fixing underlying bugs.

Threaded update is still ifdef-ed for until curves and
armatures are considered thread-safe, which is next
step to be done.
2013-07-01 21:23:25 +00:00
Campbell Barton
3d845b4a17 move api functions from r57909 into BKE. 2013-07-01 20:27:03 +00:00
Brecht Van Lommel
e6830300b7 Fix incorrect GLSL bump mapping in editmode when the UV coordinates are
flipped, was not passing sign on to GLSL shader.
2013-07-01 14:49:08 +00:00
Joshua Leung
64bc3ce89a Bugfix [#35856] Bones gets scaled chaotically when during NLA Strip Blend In/Out
This was one of the consequences of r.57333 (i.e. influence shouldn't be ignored
on the first strip that animates a channel), as scale should really default to a
base value of 1 (instead of things being blended against 0 as per all other
properties). The end result was that bones were getting scaled to zero here when
the influence of their strip fell to zero.

Now, we use the RNA default values of properties to initialise their initial
values. This may/may not work well in all cases:
1) For properties which don't have the appropriate RNA defaults set, this will
be problematic. But, most properties people are likely to animate here I think
are already set up correctly.
2) It may not always be nice to have values "snapping back" to default values.
In this case, you should still be defining a strip at the bottom of your NLA
stack which defines what the appropriate rest poses *should* be for your shot.
2013-07-01 13:57:00 +00:00
Sergey Sharybin
b763876cae 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.
2013-07-01 11:00:22 +00:00
Sergey Sharybin
16efede680 Merging r57816 through r57896 from trunk into soc-2013-depsgraph_mt 2013-07-01 09:07:21 +00:00
Sergey Sharybin
61d37cd47c Fix for Make Local -> All not working correct with multy-user datablocks
Make Local operator uses BKE_library_make_local function if all the
datablocks needs to be made local. And this function was calling
id_clear_lib_data for every datablock, which only clears library
data. But this function doesn't work correct for datablocks which
areshared by multiple users (this is also mentioned in comment
for this function).

This lead to situations when two datablocks shares the same runtime
data leading to crashes later. For example making everythig local in
scales cycles scene from durian ends up in a crash when toggling
rig edit mode.

Solved by using id_make_local instead of id_clear_lib_data, which
will ensure all the data are nicely expanded and made local.

Checked by Brecht, thanks fr the review!
2013-07-01 08:53:45 +00:00
Campbell Barton
c729c5ab4b fix [#35911] Show weights not working with a weight edit modifier in edit mode 2013-07-01 00:42:44 +00:00
Campbell Barton
e64ae3ad7c fix [#35914] Blender crashes when trying to use vertex selection masking on a copy directly after using SHIFT+d 2013-06-30 22:04:03 +00:00
Gaia Clary
23d3c64b59 fixed Blender crash, but unclear when this situation can happen 2013-06-29 08:38:17 +00:00
Sergey Sharybin
11972c0d82 Towards threaded object update
This commit contains changes related on running function
BKE_object_handle_update_ex from multiple threads in order
to increase scene update time when having multiple
independent groups of objects.

Currently this required changes to two areas:

- scene.c, where scene_update_tagged_recursive is now using
  threads for updating the object

  There're some tricks to prevent threads from being spawned
  when it's not needed:

  * Threading will only happen if there're more than one CPU
    core.

  * Threading will happen only if there're more than single
    object which needed to be updated.

  There's currently one crappy part of the change: which is
  freeing object caches (derivedFinal, derivedDeform and so)
  from main thread. This is so because in case VBO are used
  freeing DM is not thread safe. This is because DrawObject
  used global array. Would look into possibility of making
  that code safe later.

  There're also currently some ifdef-ed debug-only code, which
  helps a lot troubleshooting whether everything is working
  fine. This code looks a bit ugly now, will either drop it
  later or make it more cleat.

  And one more thing: threaded update is CURRENTLY DISABLED.
  This is because of some thread-unsafe issues discovered
  while was working on this patch. Namely:

  * I have once a crash in Curve module. Wasn't been able
    to reproduce the crash, but could thing about some
    unsafe code there.

  * Virtual modifier list is not thread-safe (it uses static
    variables).

  * Armature modifier is also doesn't seem to be thread safe
    because of storing some temporary runtime data in actual
    armature.

  All this issues are to be solved next.

- depsgraph.c, where i've added a function which gives list
  of groups, each group contains objects and dependency is
  only allowed between objects inside one group.

  This is needed to make scheduling of objects easier, which
  means update threads will operate on groups, and will handle
  objects one-by-one inside group. Different threads will
  operate on different groups.

  Currently such groups will be generated on every update.
  Actually, on every run of scene_update_objects_threaded which
  only happens if there're objects marked for update. In the
  future we could consider storing such groups in graph itself,
  which will help saving CPU power on building such groups.
  But this is something to be discussed with Joshua first.

P.S. If you really want to test threaded update, you'll
     need to replace:

       #undef USE_THREADED_UPDATE

     with:

       #define USE_THREADED_UPDATE
2013-06-28 21:58:56 +00:00
Campbell Barton
62ab3baea4 replace LATTICE_PT macro with BKE_lattice_index_from_uvw(). 2013-06-28 21:24:38 +00:00
Campbell Barton
b6ffc681b1 view-selected didnt work for metaballs in object mode (radius from previous commit was 2x too large too). 2013-06-28 18:19:55 +00:00
Campbell Barton
5d413b523a fix for crash when setting the cursor in background mode. 2013-06-28 16:37:39 +00:00
Brecht Van Lommel
0d7dbbb6e1 Fix #35884: crash opening .blend with generated color grid image and preview render.
Printing text on the color grid image would initialize font glyphs from a thread at
the same time as the UI, causing conflicts. The freetype glyph renderer needs to be
mutex locked because it uses a shared buffer internally even when rendering for
different fonts. Also needed to change the image generate function to use the render
monospace font to avoid conflicts in blenfont.

What's still weak in the blenfont API is that there is no distinction between a font
and a thread using that font to render with some particular size, style, etc.
2013-06-28 13:05:15 +00:00
Brecht Van Lommel
6d400423f9 Fix #35808: blender internal viewport with freestyle would keep continuously
rerendering for no reason.

Update tags were not being done in the proper Main database.
2013-06-27 22:13:40 +00:00
Sergey Sharybin
f7216eda79 Merging r57729 through r57815 from trunk into soc-2013-depsgraph_mt 2013-06-27 09:07:19 +00:00
Campbell Barton
603258d763 fix for zero length normalize before scanfill for meshes and other minor changes. 2013-06-27 04:32:44 +00:00
Campbell Barton
ca51930a90 fix [#33068] Can't paint weights of some vertices in some situations.
old limitation where you could only paint onto one side of a mirrored mesh (weight paint, vertex paint).
2013-06-26 18:40:55 +00:00
Campbell Barton
9c85cdceb2 remove unused struct 2013-06-26 16:59:58 +00:00
Campbell Barton
a7858767f4 fix [#35858] Weight Paint: Hiding faces isnt flushing the flag to the vertices. 2013-06-26 02:47:56 +00:00
Brecht Van Lommel
daa54f0f5c Fix #35846: crash rendering with dupligroups visible in 3D viewport during render
in some cases. The dupli code would still do object updates during render indirectly,
while this is disabled for thread safety everywhere else, now we disable it for this
case as well.

Not a pretty solution but this is for the depgraph refactor to solve.
2013-06-25 14:57:45 +00:00
Brecht Van Lommel
40d4dfaba8 Fix #35824: finding missing files not working correct for filepaths with special
characters on Windows.

Replaced some uses of stat() by BLI_stat() to properly handle such filepaths.
2013-06-25 14:48:30 +00:00
Campbell Barton
689ca4aef7 correct assertion error (clear dirty normal flag when there are no vertices) 2013-06-25 14:31:52 +00:00
Campbell Barton
64968e3618 patch [#35830] Add Catmull-Rom spline as an option for lattice deformer 2013-06-25 10:49:20 +00:00
Campbell Barton
37f5945188 style cleanup 2013-06-25 10:44:30 +00:00
Sergey Sharybin
65040080ac Merging r57695 through r57725 from trunk into soc-2013-desgraph_mt 2013-06-25 07:27:59 +00:00
Brecht Van Lommel
454d6e0207 Fix particle hair display percentage not properly getting restored after
rendering. This used to happen in an unneeded frame change update which was
removed. For heavy particle systems this could have a bad impact on viewport
performance after rendering.
2013-06-24 22:41:40 +00:00
Brecht Van Lommel
28dd9c6a40 Fix #35767: transforming nodes in the node editor changed the wireframe color
of the active object in the 3D view. This was due to sharing a global G.moving
flag to indicate that transform is active, now it's only set per transform data
type so different editors don't influence each other.
2013-06-24 22:41:37 +00:00
Daniel Stokes
898b49f753 Making sure free_nodesystem only frees non-NULL data. This helps address some problems in the BGE with loading multiple blendfiles. 2013-06-24 21:11:13 +00:00
Campbell Barton
afb200f217 calculate polygon normals for BKE_mesh_recalc_tessellation() inline rather then using scanfills function. 2013-06-24 18:13:33 +00:00
Campbell Barton
5e72a211b5 remove unused c file 2013-06-24 15:13:51 +00:00
Campbell Barton
1a55b53375 lattice: use functions rather then defines, also added a function to get uvw from an index.
- BKE_lattice_index_from_uvw()
- BKE_lattice_index_to_uvw()
2013-06-24 13:45:35 +00:00
Sergey Sharybin
da97bfaee4 Merging r57629 through r57694 from trunk into soc-2013-depsgraph_mt 2013-06-24 12:30:05 +00:00
Campbell Barton
d5aaf8141e fix [#35855] Change "Scene" crashes randomly 2013-06-24 06:08:47 +00:00