diff options
7 files changed, 31 insertions, 17 deletions
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h index 3b75797a3a9..902373bcd6b 100644 --- a/source/blender/blenlib/BLI_threads.h +++ b/source/blender/blenlib/BLI_threads.h @@ -70,7 +70,7 @@ int BLI_system_thread_count(void); /* gets the number of threads the system * One custom lock available now. can be extended. */ #define LOCK_IMAGE 0 -#define LOCK_PREVIEW 1 +#define LOCK_DRAW_IMAGE 1 #define LOCK_VIEWER 2 #define LOCK_CUSTOM1 3 #define LOCK_RCACHE 4 diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index 348fa29eae7..9994f89acd5 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -106,7 +106,7 @@ static void *thread_tls_data; ************************************************ */ static pthread_mutex_t _malloc_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _image_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t _preview_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t _image_draw_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER; @@ -337,8 +337,8 @@ void BLI_lock_thread(int type) { if (type == LOCK_IMAGE) pthread_mutex_lock(&_image_lock); - else if (type == LOCK_PREVIEW) - pthread_mutex_lock(&_preview_lock); + else if (type == LOCK_DRAW_IMAGE) + pthread_mutex_lock(&_image_draw_lock); else if (type == LOCK_VIEWER) pthread_mutex_lock(&_viewer_lock); else if (type == LOCK_CUSTOM1) @@ -357,8 +357,8 @@ void BLI_unlock_thread(int type) { if (type == LOCK_IMAGE) pthread_mutex_unlock(&_image_lock); - else if (type == LOCK_PREVIEW) - pthread_mutex_unlock(&_preview_lock); + else if (type == LOCK_DRAW_IMAGE) + pthread_mutex_unlock(&_image_draw_lock); else if (type == LOCK_VIEWER) pthread_mutex_unlock(&_viewer_lock); else if (type == LOCK_CUSTOM1) diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index 445b0634ced..43aad4f19d9 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -27,6 +27,7 @@ #include "BKE_image.h" extern "C" { + #include "BLI_threads.h" #include "RE_pipeline.h" #include "RE_shader_ext.h" #include "RE_render_ext.h" @@ -63,6 +64,7 @@ void CompositorOperation::deinitExecution() const RenderData *rd = this->m_rd; Render *re = RE_GetRender_FromData(rd); RenderResult *rr = RE_AcquireResultWrite(re); + if (rr) { if (rr->rectf != NULL) { MEM_freeN(rr->rectf); @@ -75,7 +77,9 @@ void CompositorOperation::deinitExecution() } } + BLI_lock_thread(LOCK_DRAW_IMAGE); BKE_image_signal(BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), NULL, IMA_SIGNAL_FREE); + BLI_unlock_thread(LOCK_DRAW_IMAGE); if (re) { RE_ReleaseResult(re); diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp index 446b169763c..2470b239987 100644 --- a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp @@ -62,6 +62,8 @@ void ViewerBaseOperation::initImage() if (!ibuf) return; if (ibuf->x != (int)getWidth() || ibuf->y != (int)getHeight()) { + BLI_lock_thread(LOCK_DRAW_IMAGE); + imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); @@ -70,6 +72,8 @@ void ViewerBaseOperation::initImage() imb_addrectImBuf(ibuf); imb_addrectfloatImBuf(ibuf); anImage->ok = IMA_OK_LOADED; + + BLI_unlock_thread(LOCK_DRAW_IMAGE); } /* now we combine the input with ibuf */ diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index ac71eb972f6..88eb280ea6b 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -728,11 +728,21 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) /* retrieve the image and information about it */ ima = ED_space_image(sima); ED_space_image_zoom(sima, ar, &zoomx, &zoomy); - ibuf = ED_space_image_acquire_buffer(sima, &lock); show_viewer = (ima && ima->source == IMA_SRC_VIEWER); show_render = (show_viewer && ima->type == IMA_TYPE_R_RESULT); + if (show_viewer) { + /* use locked draw for drawing viewer image buffer since the conpositor + * is running in separated thread and compositor could free this buffers. + * other images are not modifying in such a way so they does not require + * lock (sergey) + */ + BLI_lock_thread(LOCK_DRAW_IMAGE); + } + + ibuf = ED_space_image_acquire_buffer(sima, &lock); + /* draw the image or grid */ if (ibuf == NULL) ED_region_grid_draw(ar, zoomx, zoomy); @@ -770,5 +780,8 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) /* render info */ if (ima && show_render) draw_render_info(scene, ima, ar); -} + if (show_viewer) { + BLI_unlock_thread(LOCK_DRAW_IMAGE); + } +} diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 17545ddc4de..adf52313307 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -335,9 +335,6 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) /* preview rect? */ if (node->flag & NODE_PREVIEW) { - /* only recalculate size when there's a preview actually, otherwise we use stored result */ - BLI_lock_thread(LOCK_PREVIEW); - if (node->preview && node->preview->rect) { float aspect = 1.0f; @@ -374,8 +371,6 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->prvr.ymin = dy - oldh; dy = node->prvr.ymin - NODE_DYS / 2; } - - BLI_unlock_thread(LOCK_PREVIEW); } /* buttons rect? */ @@ -861,10 +856,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN /* preview */ if (node->flag & NODE_PREVIEW) { - BLI_lock_thread(LOCK_PREVIEW); if (node->preview && node->preview->rect && !BLI_rctf_is_empty(&node->prvr)) node_draw_preview(node->preview, &node->prvr); - BLI_unlock_thread(LOCK_PREVIEW); } UI_ThemeClearColor(color_id); diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c index 98ded3ea3b3..1b9ff610e4c 100644 --- a/source/blender/nodes/composite/node_composite_util.c +++ b/source/blender/nodes/composite/node_composite_util.c @@ -647,7 +647,7 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf) if (stackbuf_use!=stackbuf) free_compbuf(stackbuf_use); - BLI_lock_thread(LOCK_PREVIEW); + // BLI_lock_thread(LOCK_PREVIEW); if (preview->rect) MEM_freeN(preview->rect); @@ -655,7 +655,7 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf) preview->ysize= ysize; preview->rect= rect; - BLI_unlock_thread(LOCK_PREVIEW); + // BLI_unlock_thread(LOCK_PREVIEW); } } |