diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index b76f2c0bece..bd890e8c562 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -31,6 +31,7 @@ struct GPUViewport; struct ID; struct Main; struct Object; +struct RegionView3D; struct Render; struct RenderEngine; struct RenderEngineType; @@ -47,6 +48,8 @@ void DRW_engines_free(void); bool DRW_engine_render_support(struct DrawEngineType *draw_engine_type); void DRW_engine_register(struct DrawEngineType *draw_engine_type); +void DRW_engine_external_free(struct RegionView3D *rv3d); + typedef struct DRWUpdateContext { struct Main *bmain; struct Depsgraph *depsgraph; diff --git a/source/blender/draw/engines/external/external_engine.cc b/source/blender/draw/engines/external/external_engine.cc index e6bb74d8ed1..178c97791e1 100644 --- a/source/blender/draw/engines/external/external_engine.cc +++ b/source/blender/draw/engines/external/external_engine.cc @@ -9,6 +9,7 @@ * We use it for depth and non-mesh objects. */ +#include "DRW_engine.h" #include "DRW_render.h" #include "DNA_modifier_types.h" @@ -518,4 +519,16 @@ bool DRW_engine_external_acquire_for_image_editor() return RE_engine_draw_acquire(re); } +void DRW_engine_external_free(RegionView3D *rv3d) +{ + if (rv3d->view_render) { + /* Free engine with DRW context enabled, as this may clean up per-context + * resources like VAOs. */ + DRW_gpu_context_enable_ex(true); + RE_FreeViewRender(rv3d->view_render); + rv3d->view_render = nullptr; + DRW_gpu_context_disable_ex(true); + } +} + #undef EXTERNAL_ENGINE diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index b99e8dc3a81..ccbe66060fe 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -230,8 +230,7 @@ void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *region) BPy_END_ALLOW_THREADS; #endif - RE_FreeViewRender(rv3d->view_render); - rv3d->view_render = nullptr; + DRW_engine_external_free(rv3d); } /* A bit overkill but this make sure the viewport is reset completely. (fclem) */ @@ -1105,7 +1104,7 @@ static void view3d_main_region_free(ARegion *region) } if (rv3d->view_render) { - RE_FreeViewRender(rv3d->view_render); + DRW_engine_external_free(rv3d); } if (rv3d->sms) {