diff options
-rw-r--r-- | source/blender/editors/render/render_preview.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 76b88b8df22..35130988aba 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -38,6 +38,8 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "PIL_time.h" + #include "BLO_readfile.h" #include "DNA_world_types.h" @@ -1206,6 +1208,16 @@ static void icon_preview_startjob_all_sizes(void *customdata, IconPreview *ip = (IconPreview *)customdata; IconPreviewSize *cur_size; + /* Wait 2s to start rendering icon previews, to not bog down user interaction. + * Particularly important for heavy scenes and Eevee using OpenGL that blocks + * the user interface drawing. */ + for (int i = 0; i < 20; i++) { + PIL_sleep_ms(100); + if (*stop) { + return; + } + } + for (cur_size = ip->sizes.first; cur_size; cur_size = cur_size->next) { PreviewImage *prv = ip->owner; @@ -1253,6 +1265,10 @@ static void icon_preview_startjob_all_sizes(void *customdata, common_preview_startjob(sp, stop, do_update, progress); shader_preview_free(sp); + + if (*stop) { + break; + } } } @@ -1470,6 +1486,9 @@ void ED_preview_shader_job(const bContext *C, void ED_preview_kill_jobs(wmWindowManager *wm, Main *UNUSED(bmain)) { if (wm) { + /* This is called to stop all preview jobs before scene data changes, to + * avoid invalid memory access. */ WM_jobs_kill(wm, NULL, common_preview_startjob); + WM_jobs_kill(wm, NULL, icon_preview_startjob_all_sizes); } } |