diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-08-14 12:06:22 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-08-14 12:43:19 +0300 |
commit | 4ac019cc07e374975bb65629d96dbd590f5e7a78 (patch) | |
tree | 8a828a0e746b301c8cf7f5852b2cbc92077542fe /source/blender | |
parent | 7dfc1ad6c15522a3b7ddfd410198a32ba946d89e (diff) |
Tracking: Make frame access cache aware of region
Cache is still kept disabled, need to think of a policy for cache cleanup.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/tracking_util.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c index 5a8f3f63f44..00918e62403 100644 --- a/source/blender/blenkernel/intern/tracking_util.c +++ b/source/blender/blenkernel/intern/tracking_util.c @@ -523,6 +523,8 @@ typedef struct AccessCacheKey { int frame; int downscale; libmv_InputMode input_mode; + bool has_region; + float region_min[2], region_max[2]; int64_t transform_key; } AccessCacheKey; @@ -541,10 +543,19 @@ static bool accesscache_hashcmp(const void *a_v, const void *b_v) a->frame != b->frame || a->downscale != b->downscale || a->input_mode != b->input_mode || + a->has_region != b->has_region || a->transform_key != b->transform_key) { return true; } + /* If there is region applied, compare it. */ + if (a->has_region) { + if (!equals_v2v2(a->region_min, b->region_min) || + !equals_v2v2(a->region_max, b->region_max)) + { + return true; + } + } return false; } @@ -553,14 +564,25 @@ static void accesscache_put(TrackingImageAccessor *accessor, int frame, libmv_InputMode input_mode, int downscale, + const libmv_Region *region, int64_t transform_key, ImBuf *ibuf) { + /* Currently we don't want global memory limiter to be tossing our cached + * frames from tracking context. We are controlling what we want to be cached + * from our side. + */ + ibuf->userflags |= IB_PERSISTENT; AccessCacheKey key; key.clip_index = clip_index; key.frame = frame; key.input_mode = input_mode; key.downscale = downscale; + key.has_region = (region != NULL); + if (key.has_region) { + copy_v2_v2(key.region_min, region->min); + copy_v2_v2(key.region_max, region->max); + } key.transform_key = transform_key; IMB_moviecache_put(accessor->cache, &key, ibuf); } @@ -570,6 +592,7 @@ static ImBuf *accesscache_get(TrackingImageAccessor *accessor, int frame, libmv_InputMode input_mode, int downscale, + const libmv_Region *region, int64_t transform_key) { AccessCacheKey key; @@ -577,6 +600,11 @@ static ImBuf *accesscache_get(TrackingImageAccessor *accessor, key.frame = frame; key.input_mode = input_mode; key.downscale = downscale; + key.has_region = (region != NULL); + if (key.has_region) { + copy_v2_v2(key.region_min, region->min); + copy_v2_v2(key.region_max, region->max); + } key.transform_key = transform_key; return IMB_moviecache_get(accessor->cache, &key); } @@ -677,6 +705,7 @@ static ImBuf *accessor_get_ibuf(TrackingImageAccessor *accessor, frame, input_mode, downscale, + region, transform_key); if (ibuf != NULL) { return ibuf; @@ -800,11 +829,8 @@ static ImBuf *accessor_get_ibuf(TrackingImageAccessor *accessor, * not the smartest thing in the world, but who cares at this point. */ - /* TODO(sergey): Disable cache for now, because we don't store region - * in the cache key and can't check whether cached version is usable for - * us or not. - * - * Need to think better about what to cache and when. + /* TODO(sergey): Disable cache for now, need some good policy on what to + * cache and for how long. */ if (false) { accesscache_put(accessor, @@ -812,6 +838,7 @@ static ImBuf *accessor_get_ibuf(TrackingImageAccessor *accessor, frame, input_mode, downscale, + region, transform_key, final_ibuf); } |