Fix #112991: crash switching from Hydra Storm viewport to other renderer
The viewport render engine was freed outside the DRW OpenGL context, which resulted in Storm deleting a VAO from another OpenGL context.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user