Fix #36075: editing shading nodes could still crash blender internal rendered

draw mode. This happens because it uses node data structures in threads, now
it does same as preview render, which is to immediately stop the render thread
when e.g. deleting nodes.
This commit is contained in:
Brecht Van Lommel
2013-07-10 01:05:56 +00:00
parent a3643ee3d6
commit 3f34a88fc8
4 changed files with 22 additions and 14 deletions

View File

@@ -52,7 +52,7 @@ void ED_render_engine_changed(struct Main *bmain);
void ED_render_engine_area_exit(struct ScrArea *sa);
void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
void ED_viewport_render_kill_jobs(const struct bContext *C);
void ED_viewport_render_kill_jobs(const struct bContext *C, bool free_database);
/* render_preview.c */

View File

@@ -1141,7 +1141,7 @@ void render_view3d_draw(RenderEngine *engine, const bContext *C)
RE_ReleaseResultImage(re);
}
void ED_viewport_render_kill_jobs(const bContext *C)
void ED_viewport_render_kill_jobs(const bContext *C, bool free_database)
{
wmWindowManager *wm = CTX_wm_manager(C);
Main *bmain = CTX_data_main(C);
@@ -1172,17 +1172,23 @@ void ED_viewport_render_kill_jobs(const bContext *C)
if (rv3d->render_engine) {
/* free render database now before we change data, because
* RE_Database_Free will also loop over blender data */
char name[32];
Render *re;
if (free_database) {
char name[32];
Render *re;
sprintf(name, "View3dPreview %p", (void *)ar);
re = RE_GetRender(name);
sprintf(name, "View3dPreview %p", (void *)ar);
re = RE_GetRender(name);
if (re)
RE_Database_Free(re);
if (re)
RE_Database_Free(re);
/* tag render engine to update entire database */
rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_DATABASE;
/* tag render engine to update entire database */
rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_DATABASE;
}
else {
/* quick shader update */
rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_MA;
}
}
}
}

View File

@@ -1180,5 +1180,7 @@ void ED_preview_kill_jobs(const struct bContext *C)
wmWindowManager *wm = CTX_wm_manager(C);
if (wm)
WM_jobs_kill(wm, NULL, common_preview_startjob);
ED_viewport_render_kill_jobs(C, false);
}

View File

@@ -143,7 +143,7 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
if ((obact && (obact->mode & OB_MODE_TEXTURE_PAINT)) || (sima->mode == SI_MODE_PAINT)) {
if (!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname) {
if (U.uiflag & USER_GLOBALUNDO) {
ED_viewport_render_kill_jobs(C);
ED_viewport_render_kill_jobs(C, true);
BKE_undo_name(C, undoname);
}
}
@@ -196,7 +196,7 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
/* for example, texface stores image pointers */
undo_editmode_clear();
ED_viewport_render_kill_jobs(C);
ED_viewport_render_kill_jobs(C, true);
if (undoname)
BKE_undo_name(C, undoname);
@@ -369,7 +369,7 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
{
int retval;
ED_viewport_render_kill_jobs(C);
ED_viewport_render_kill_jobs(C, true);
if (G.debug & G_DEBUG)
printf("redo_cb: operator redo %s\n", op->type->name);
@@ -537,7 +537,7 @@ static int undo_history_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL);
}
else {
ED_viewport_render_kill_jobs(C);
ED_viewport_render_kill_jobs(C, true);
BKE_undo_number(C, item);
WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, CTX_data_scene(C));
}