diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-03-16 19:58:45 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-03-16 19:58:45 +0300 |
commit | f17dcf58c86274661a10cf4f95939deb63a02fa7 (patch) | |
tree | 94fc52b7e0d41d6cb806eaf5e0b0e604c20722c1 /source/blender/nodes/intern/CMP_nodes/CMP_viewer.c | |
parent | 735b444d74d41bf2cec1ab81e781283e79d9c3d6 (diff) |
Fixes for thread related render / compositing crashes:
* Viewer node could free image while it is being redrawn, viewer image
buffers now need acquire/release to be accessed as was already the
case for render results.
* The Composite node could free the image buffers outside of a lock,
also causing simultaneous redraw to crash.
* Especially on Windows, re-rendering could crash when drawing an image
that was freed. When RE_RenderInProgress was true it would access the
image buffer and simply return it while it could still contain a pointer
to a render result buffer that was already freed. I don't understand
why this case was there in the first place, so I've removed it.
Possibly fixes bugs #20174, #21418, #21391, #21394.
Diffstat (limited to 'source/blender/nodes/intern/CMP_nodes/CMP_viewer.c')
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_viewer.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c index e62a7462702..80200ad9ce6 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c @@ -50,13 +50,15 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, ImBuf *ibuf; CompBuf *cbuf, *tbuf; int rectx, recty; + void *lock; BKE_image_user_calc_frame(node->storage, rd->cfra, 0); /* always returns for viewer image, but we check nevertheless */ - ibuf= BKE_image_get_ibuf(ima, node->storage); + ibuf= BKE_image_acquire_ibuf(ima, node->storage, &lock); if(ibuf==NULL) { printf("node_composit_exec_viewer error\n"); + BKE_image_release_ibuf(ima, lock); return; } @@ -106,6 +108,8 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, free_compbuf(zbuf); } + BKE_image_release_ibuf(ima, lock); + generate_preview(data, node, cbuf); free_compbuf(cbuf); |