Fix threading conflict when doing Cycles background render

It is possible to have same image used multiple times at different frames,
which means we can not free it's buffers without any guard. From quick tests
this seems to be doing what it is supposed to.

Need more testing and port this to 2.79.
This commit is contained in:
Sergey Sharybin 2017-08-22 15:50:05 +02:00 committed by Bastien Montagne
parent 63e21e7218
commit 9997f5ca91
3 changed files with 15 additions and 2 deletions

View File

@ -58,6 +58,7 @@ void BKE_images_exit(void);
void BKE_image_free_packedfiles(struct Image *image);
void BKE_image_free_views(struct Image *image);
void BKE_image_free_buffers(struct Image *image);
void BKE_image_free_buffers_ex(struct Image *image, bool do_lock);
/* call from library */
void BKE_image_free(struct Image *image);

View File

@ -303,8 +303,11 @@ static void image_free_anims(Image *ima)
* Simply free the image data from memory,
* on display the image can load again (except for render buffers).
*/
void BKE_image_free_buffers(Image *ima)
void BKE_image_free_buffers_ex(Image *ima, bool do_lock)
{
if (do_lock) {
BLI_spin_lock(&image_spin);
}
image_free_cached_frames(ima);
image_free_anims(ima);
@ -323,6 +326,15 @@ void BKE_image_free_buffers(Image *ima)
}
ima->ok = IMA_OK;
if (do_lock) {
BLI_spin_unlock(&image_spin);
}
}
void BKE_image_free_buffers(Image *ima)
{
BKE_image_free_buffers_ex(ima, false);
}
/** Free (or release) any data used by this image (does not free the image itself). */

View File

@ -291,7 +291,7 @@ static void rna_Image_filepath_from_user(Image *image, ImageUser *image_user, ch
static void rna_Image_buffers_free(Image *image)
{
BKE_image_free_buffers(image);
BKE_image_free_buffers_ex(image, true);
}
#else