Fix T93560: crash with image paint undo and cycles preview render
Cycles preview rendering could free the image buffers being used by drawing in another thread due to a race condition. This race condition was unlikely before, but now that preview renders are started right before we draw the image in the image editor or load it as a texture in the 3D viewport, it's likely to happen. As we are close to release this is too risky to fix properly, just avoid freeing the cache for preview renders instead and accept increased memory usage in some cases.
This commit is contained in:
parent
61e92eeb3e
commit
2fd657db5b
Notes:
blender-bot
2023-02-14 11:18:07 +01:00
Referenced by issue #93560, Regression: Crash when undoing Image Paint when showing Material tab in Properties Editor
|
@ -24,8 +24,14 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
/* Packed Images */
|
||||
|
||||
BlenderImageLoader::BlenderImageLoader(BL::Image b_image, int frame)
|
||||
: b_image(b_image), frame(frame), free_cache(!b_image.has_data())
|
||||
BlenderImageLoader::BlenderImageLoader(BL::Image b_image,
|
||||
const int frame,
|
||||
const bool is_preview_render)
|
||||
: b_image(b_image),
|
||||
frame(frame),
|
||||
/* Don't free cache for preview render to avoid race condition from T93560, to be fixed
|
||||
properly later as we are close to release. */
|
||||
free_cache(!is_preview_render && !b_image.has_data())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
class BlenderImageLoader : public ImageLoader {
|
||||
public:
|
||||
BlenderImageLoader(BL::Image b_image, int frame);
|
||||
BlenderImageLoader(BL::Image b_image, const int frame, const bool is_preview_render);
|
||||
|
||||
bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override;
|
||||
bool load_pixels(const ImageMetaData &metadata,
|
||||
|
|
|
@ -762,7 +762,8 @@ static ShaderNode *add_node(Scene *scene,
|
|||
int scene_frame = b_scene.frame_current();
|
||||
int image_frame = image_user_frame_number(b_image_user, b_image, scene_frame);
|
||||
image->handle = scene->image_manager->add_image(
|
||||
new BlenderImageLoader(b_image, image_frame), image->image_params());
|
||||
new BlenderImageLoader(b_image, image_frame, b_engine.is_preview()),
|
||||
image->image_params());
|
||||
}
|
||||
else {
|
||||
ustring filename = ustring(
|
||||
|
@ -797,8 +798,9 @@ static ShaderNode *add_node(Scene *scene,
|
|||
if (is_builtin) {
|
||||
int scene_frame = b_scene.frame_current();
|
||||
int image_frame = image_user_frame_number(b_image_user, b_image, scene_frame);
|
||||
env->handle = scene->image_manager->add_image(new BlenderImageLoader(b_image, image_frame),
|
||||
env->image_params());
|
||||
env->handle = scene->image_manager->add_image(
|
||||
new BlenderImageLoader(b_image, image_frame, b_engine.is_preview()),
|
||||
env->image_params());
|
||||
}
|
||||
else {
|
||||
env->set_filename(
|
||||
|
|
Loading…
Reference in New Issue