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:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-01-03 21:00:53 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-01-03 21:00:53 +0400
commit0dabf824fbcb7d343919edd88e29bd267a8734f6 (patch)
treee1f43464955962754aebca302ed6c940c698713a
parent56a531eb29bb9ec2e4687645bd22f832054e635f (diff)
Fix T38045: Clone stamp crashes
Issue seems to be caused by thread-unsafe IMB_freeImBuf. Now use generic BKE_image_release_ibuf to de-reference image buffer which was acquired from image datablock.
-rw-r--r--source/blender/blenkernel/intern/image.c7
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c9
-rw-r--r--source/blender/editors/sculpt_paint/paint_image_proj.c2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c2
4 files changed, 8 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 288443db650..f83112ba283 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -3611,7 +3611,9 @@ bool BKE_image_has_loaded_ibuf(Image *image)
return has_loaded_ibuf;
}
-/* References the result, IMB_freeImBuf is to be called to de-reference. */
+/* References the result, BKE_image_release_ibuf is to be called to de-reference.
+ * Use lock=NULL when calling BKE_image_release_ibuf().
+ */
ImBuf *BKE_image_get_ibuf_with_name(Image *image, const char *name)
{
ImBuf *ibuf = NULL;
@@ -3635,7 +3637,8 @@ ImBuf *BKE_image_get_ibuf_with_name(Image *image, const char *name)
return ibuf;
}
-/* References the result, IMB_freeImBuf is to be called to de-reference.
+/* References the result, BKE_image_release_ibuf is to be called to de-reference.
+ * Use lock=NULL when calling BKE_image_release_ibuf().
*
* TODO(sergey): This is actually "get first entry from the cache", which is
* not so much predictable. But using first loaded image buffer
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 5b323a0a396..adcbc721e80 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -250,7 +250,6 @@ void ED_image_undo_restore(bContext *C, ListBase *lb)
for (tile = lb->first; tile; tile = tile->next) {
short use_float;
- bool need_release = true;
/* find image based on name, pointer becomes invalid with global undo */
if (ima && strcmp(tile->idname, ima->id.name) == 0) {
@@ -269,7 +268,6 @@ void ED_image_undo_restore(bContext *C, ListBase *lb)
* matched file name in list of already loaded images */
BKE_image_release_ibuf(ima, ibuf, NULL);
- need_release = false;
ibuf = BKE_image_get_ibuf_with_name(ima, tile->ibufname);
}
@@ -300,12 +298,7 @@ void ED_image_undo_restore(bContext *C, ListBase *lb)
ibuf->userflags |= IB_MIPMAP_INVALID; /* force mipmap recreatiom */
ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
- if (need_release) {
- BKE_image_release_ibuf(ima, ibuf, NULL);
- }
- else {
- IMB_freeImBuf(ibuf);
- }
+ BKE_image_release_ibuf(ima, ibuf, NULL);
}
IMB_freeImBuf(tmpibuf);
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 4b402bc1741..385d1aa57ed 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -598,7 +598,7 @@ static bool project_paint_PickColor(const ProjPaintState *ps, const float pt[2],
}
}
}
- IMB_freeImBuf(ibuf);
+ BKE_image_release_ibuf(ima, ibuf, NULL);
return 1;
}
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 1f0e20a9210..5910941cb3c 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -187,7 +187,7 @@ void GPU_render_text(MTFace *tface, int mode,
}
glPopMatrix();
- IMB_freeImBuf(first_ibuf);
+ BKE_image_release_ibuf(ima, first_ibuf, NULL);
}
}