Fix T44021: Crash switching Rendering Engines while viewport rendering + animating

Make sure preview render job is cancelled before freeing the render engine
associated to the viewport.
This commit is contained in:
Sergey Sharybin 2015-03-17 12:02:10 +05:00
parent f138666f68
commit 1724513fc6
Notes: blender-bot 2023-02-14 09:22:31 +01:00
Referenced by issue #44021, Crash switching Rendering Engines while viewport rendering + animating
4 changed files with 11 additions and 15 deletions

View File

@ -50,7 +50,7 @@ void ED_operatortypes_render(void);
void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
void ED_render_engine_changed(struct Main *bmain);
void ED_render_engine_area_exit(struct ScrArea *sa);
void ED_render_engine_area_exit(struct Main *bmain, struct ScrArea *sa);
void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
void ED_viewport_render_kill_jobs(struct wmWindowManager *wm, struct Main *bmain, bool free_database);

View File

@ -61,6 +61,7 @@ struct rcti;
struct wmOperator;
struct wmOperatorType;
struct wmWindow;
struct wmWindowManager;
struct GPUFX;
struct GPUOffScreen;
struct GPUFXSettings;
@ -377,6 +378,7 @@ void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx,
#endif
/* render */
void ED_view3d_stop_render_preview(struct wmWindowManager *wm, struct ARegion *ar);
void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct View3D *v3d, struct ScrArea *sa);
#endif /* __ED_VIEW3D_H__ */

View File

@ -61,6 +61,7 @@
#include "ED_node.h"
#include "ED_render.h"
#include "ED_view3d.h"
#include "render_intern.h" // own include
@ -141,26 +142,19 @@ void ED_render_scene_update(Main *bmain, Scene *scene, int updated)
recursive_check = false;
}
void ED_render_engine_area_exit(ScrArea *sa)
void ED_render_engine_area_exit(Main *bmain, ScrArea *sa)
{
/* clear all render engines in this area */
ARegion *ar;
wmWindowManager *wm = bmain->wm.first;
if (sa->spacetype != SPACE_VIEW3D)
return;
for (ar = sa->regionbase.first; ar; ar = ar->next) {
RegionView3D *rv3d;
if (ar->regiontype != RGN_TYPE_WINDOW || !(ar->regiondata))
continue;
rv3d = ar->regiondata;
if (rv3d->render_engine) {
RE_engine_free(rv3d->render_engine);
rv3d->render_engine = NULL;
}
ED_view3d_stop_render_preview(wm, ar);
}
}
@ -173,7 +167,7 @@ void ED_render_engine_changed(Main *bmain)
for (sc = bmain->screen.first; sc; sc = sc->id.next)
for (sa = sc->areabase.first; sa; sa = sa->next)
ED_render_engine_area_exit(sa);
ED_render_engine_area_exit(bmain, sa);
RE_FreePersistentData();

View File

@ -266,7 +266,7 @@ void ED_view3d_check_mats_rv3d(struct RegionView3D *rv3d)
}
#endif
static void view3d_stop_render_preview(wmWindowManager *wm, ARegion *ar)
void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *ar)
{
RegionView3D *rv3d = ar->regiondata;
@ -297,7 +297,7 @@ void ED_view3d_shade_update(Main *bmain, Scene *scene, View3D *v3d, ScrArea *sa)
for (ar = sa->regionbase.first; ar; ar = ar->next) {
if (ar->regiondata)
view3d_stop_render_preview(wm, ar);
ED_view3d_stop_render_preview(wm, ar);
}
}
else if (scene->obedit != NULL && scene->obedit->type == OB_MESH) {
@ -563,7 +563,7 @@ static void view3d_main_area_exit(wmWindowManager *wm, ARegion *ar)
{
RegionView3D *rv3d = ar->regiondata;
view3d_stop_render_preview(wm, ar);
ED_view3d_stop_render_preview(wm, ar);
if (rv3d->gpuoffscreen) {
GPU_offscreen_free(rv3d->gpuoffscreen);