From dc856be8399242f4ee3a2ce0450b7ac5a20b35f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 14 Jun 2018 16:20:23 +0200 Subject: Preview: Add own opengl context to render preview images. --- source/blender/render/extern/include/RE_pipeline.h | 2 ++ source/blender/render/intern/include/render_types.h | 1 + source/blender/render/intern/source/pipeline.c | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) (limited to 'source/blender/render') diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 55638471883..5cb14df8308 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -311,8 +311,10 @@ void RE_draw_lock_cb (struct Render *re, void *handle, void (*f)(void *handle, void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle)); void RE_current_scene_update_cb(struct Render *re, void *handle, void (*f)(void *handle, struct Scene *scene)); +/* TODO replace by a simple set and get draw manager. */ void RE_gl_context_create(Render *re); void RE_gl_context_destroy(Render *re); +void RE_gl_context_set(Render *re, void *gl_context); void *RE_gl_context_get(Render *re); void *RE_gwn_context_get(Render *re); diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 34535fba1e0..134fa56f01c 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -161,6 +161,7 @@ struct Render { /* TODO replace by a whole draw manager. */ void *gl_context; void *gwn_context; + bool gl_context_ownership; }; /* **************** defines ********************* */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 809faeb87a4..62257caa43b 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1021,10 +1021,13 @@ void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle)) /* ********* GL Context ******** */ +/* Create the gl context of the Render. + * It will be free by the render itself. */ void RE_gl_context_create(Render *re) { /* Needs to be created in the main ogl thread. */ re->gl_context = WM_opengl_context_create(); + re->gl_context_ownership = true; } void RE_gl_context_destroy(Render *re) @@ -1036,11 +1039,22 @@ void RE_gl_context_destroy(Render *re) re->gwn_context = NULL; } if (re->gl_context) { - WM_opengl_context_dispose(re->gl_context); + if (re->gl_context_ownership) { + WM_opengl_context_dispose(re->gl_context); + } re->gl_context = NULL; } } +/* Manually set the gl context of the Render. + * It won't be free by the render itself. */ +void RE_gl_context_set(Render *re, void *gl_context) +{ + BLI_assert(gl_context); /* Cannot set NULL */ + re->gl_context = gl_context; + re->gl_context_ownership = false; +} + void *RE_gl_context_get(Render *re) { return re->gl_context; @@ -2622,6 +2636,9 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce) RE_SetCamera(re, camera); do_render_3d(re); + + /* Destroy the opengl context in the correct thread. */ + RE_gl_context_destroy(re); } /* note; repeated win/disprect calc... solve that nicer, also in compo */ -- cgit v1.2.3