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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-07-10 05:05:56 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-07-10 05:05:56 +0400
commit3f34a88fc821281079712effdc1608169cc37980 (patch)
tree188faff26cc1819f24d32031d3e08f6663e70006 /source/blender
parenta3643ee3d67a823b328b60a0cf08b335be0e147c (diff)
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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/ED_render.h2
-rw-r--r--source/blender/editors/render/render_internal.c30
-rw-r--r--source/blender/editors/render/render_preview.c2
-rw-r--r--source/blender/editors/util/undo.c8
4 files changed, 25 insertions, 17 deletions
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index e8e7643164f..bdfbbbb9c74 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -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 */
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 7a2ece66ba4..350422c3e83 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -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;
-
- sprintf(name, "View3dPreview %p", (void *)ar);
- re = RE_GetRender(name);
-
- if (re)
- RE_Database_Free(re);
-
- /* tag render engine to update entire database */
- rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_DATABASE;
+ if (free_database) {
+ char name[32];
+ Render *re;
+
+ sprintf(name, "View3dPreview %p", (void *)ar);
+ re = RE_GetRender(name);
+
+ if (re)
+ RE_Database_Free(re);
+
+ /* 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;
+ }
}
}
}
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 76fa79029fd..8da66c114d5 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -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);
}
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 52f87c19dc8..e285fd8bea4 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -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));
}