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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-03-11 12:07:36 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-03-11 16:34:13 +0300
commit57777b95428cef886bd3b2317b7728fa066acee1 (patch)
treee7555b4ccba56fc33c1a09155c4f25bbcb0d8c1f
parent2cb181d478c3f54adf91188beca0b3fd3e28bcaf (diff)
Fix T61906: crash rendering softbody with Cycles and timeline visible.
Make sure we don't reallocate arrays in the pointcache when not needed, the size of a memory allocation can be slightly bigger than the requested size. Also, use consistent check for shared cached in copy and free functions.
-rw-r--r--source/blender/blenkernel/intern/pointcache.c15
-rw-r--r--source/blender/blenkernel/intern/softbody.c2
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/makesdna/DNA_object_force_types.h4
4 files changed, 16 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index ed949e68f13..3371c3dbe48 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -3202,7 +3202,7 @@ int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
if (cfra<pid->cache->startframe || cfra > pid->cache->endframe)
return 0;
- if (pid->cache->cached_frames && pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
+ if (pid->cache->cached_frames && pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
return 0;
if (pid->cache->flag & PTCACHE_DISK_CACHE) {
@@ -3258,9 +3258,10 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
/* verify cached_frames array is up to date */
if (cache->cached_frames) {
- if (MEM_allocN_len(cache->cached_frames) != sizeof(char) * (cache->endframe-cache->startframe+1)) {
+ if (cache->cached_frames_len != (cache->endframe - cache->startframe + 1)) {
MEM_freeN(cache->cached_frames);
cache->cached_frames = NULL;
+ cache->cached_frames_len = 0;
}
}
@@ -3268,7 +3269,8 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
unsigned int sta=cache->startframe;
unsigned int end=cache->endframe;
- cache->cached_frames = MEM_callocN(sizeof(char) * (cache->endframe-cache->startframe+1), "cached frames array");
+ cache->cached_frames_len = cache->endframe - cache->startframe + 1;
+ cache->cached_frames = MEM_callocN(sizeof(char) * cache->cached_frames_len, "cached frames array");
if (pid->cache->flag & PTCACHE_DISK_CACHE) {
/* mode is same as fopen's modes */
@@ -3544,6 +3546,7 @@ static PointCache *ptcache_copy(PointCache *cache, const bool copy_data)
if (copy_data == false) {
ncache->cached_frames = NULL;
+ ncache->cached_frames_len = 0;
/* flag is a mix of user settings and simulator/baking state */
ncache->flag= ncache->flag & (PTCACHE_DISK_CACHE|PTCACHE_EXTERNAL|PTCACHE_IGNORE_LIBPATH);
@@ -3902,7 +3905,8 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
if (cache->cached_frames) {
MEM_freeN(cache->cached_frames);
- cache->cached_frames=NULL;
+ cache->cached_frames = NULL;
+ cache->cached_frames_len = 0;
}
if (cache->flag & PTCACHE_DISK_CACHE)
@@ -4082,7 +4086,8 @@ void BKE_ptcache_load_external(PTCacheID *pid)
/* make sure all new frames are loaded */
if (cache->cached_frames) {
MEM_freeN(cache->cached_frames);
- cache->cached_frames=NULL;
+ cache->cached_frames = NULL;
+ cache->cached_frames_len = 0;
}
BKE_ptcache_update_info(pid);
}
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index a1e2e0971d1..481eb617cc0 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -3037,7 +3037,7 @@ void sbFree(Object *ob)
free_softbody_intern(sb);
- if ((ob->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0) {
+ if ((ob->id.tag & LIB_TAG_NO_MAIN) == 0) {
/* Only free shared data on non-CoW copies */
BKE_ptcache_free_list(&sb->shared->ptcaches);
sb->shared->pointcache = NULL;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 49c62372a85..4b1ca9aeaef 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4582,6 +4582,7 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
cache->edit = NULL;
cache->free_edit = NULL;
cache->cached_frames = NULL;
+ cache->cached_frames_len = 0;
}
static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache, int force_disk)
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index c7bb3dad809..e09df0635ef 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -272,11 +272,15 @@ typedef struct PointCache {
char info[64];
/** File path, 1024 = FILE_MAX. */
char path[1024];
+
/**
* Array of length endframe-startframe+1 with flags to indicate cached frames.
* Can be later used for other per frame flags too if needed.
*/
char *cached_frames;
+ int cached_frames_len;
+ char _pad1[4];
+
struct ListBase mem_cache;
struct PTCacheEdit *edit;