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:
authorClément Foucault <foucault.clem@gmail.com>2018-06-11 14:54:31 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-06-11 14:55:02 +0300
commitb7bf8b375767cec527b5659613dbff1903963f3c (patch)
tree604a2955651dd9ab6524916b8ef201115e856785 /source/blender/render
parent128926a41b368e166af63515370d9c9367e3dda2 (diff)
Render: Create a separate gl context for rendering.
This should take care of all the threading stability issues some people are reporting.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h5
-rw-r--r--source/blender/render/intern/include/render_types.h4
-rw-r--r--source/blender/render/intern/source/pipeline.c43
3 files changed, 52 insertions, 0 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 660e81eb022..55638471883 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -311,6 +311,11 @@ 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));
+void RE_gl_context_create(Render *re);
+void RE_gl_context_destroy(Render *re);
+void *RE_gl_context_get(Render *re);
+void *RE_gwn_context_get(Render *re);
+
/* should move to kernel once... still unsure on how/where */
float RE_filter_value(int type, float x);
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index fd24f4eb053..34535fba1e0 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -157,6 +157,10 @@ struct Render {
void **movie_ctx_arr;
char viewname[MAX_NAME];
+
+ /* TODO replace by a whole draw manager. */
+ void *gl_context;
+ void *gwn_context;
};
/* **************** defines ********************* */
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index c9f13004836..0ca9aa41056 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -94,6 +94,9 @@
#include "RE_pipeline.h"
#include "RE_render_ext.h"
+#include "../../../windowmanager/WM_api.h" /* XXX */
+#include "../../../intern/gawain/gawain/gwn_context.h"
+
#ifdef WITH_FREESTYLE
# include "FRS_freestyle.h"
#endif
@@ -1020,6 +1023,40 @@ void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
re->tbh = handle;
}
+/* ********* GL Context ******** */
+
+void RE_gl_context_create(Render *re)
+{
+ /* Needs to be created in the main ogl thread. */
+ re->gl_context = WM_opengl_context_create();
+}
+
+void RE_gl_context_destroy(Render *re)
+{
+ /* Needs to be called from the thread which used the ogl context for rendering. */
+ if (re->gwn_context) {
+ GWN_context_active_set(re->gwn_context);
+ GWN_context_discard(re->gwn_context);
+ re->gwn_context = NULL;
+ }
+ if (re->gl_context) {
+ WM_opengl_context_dispose(re->gl_context);
+ re->gl_context = NULL;
+ }
+}
+
+void *RE_gl_context_get(Render *re)
+{
+ return re->gl_context;
+}
+
+void *RE_gwn_context_get(Render *re)
+{
+ if (re->gwn_context == NULL) {
+ re->gwn_context = GWN_context_create();
+ }
+ return re->gwn_context;
+}
/* ********* add object data (later) ******** */
@@ -2224,6 +2261,9 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_la
BLI_callback_exec(re->main, (ID *)scene, G.is_break ? BLI_CB_EVT_RENDER_CANCEL : BLI_CB_EVT_RENDER_COMPLETE);
+ /* Destroy the opengl context in the correct thread. */
+ RE_gl_context_destroy(re);
+
/* UGLY WARNING */
G.is_rendering = false;
}
@@ -2779,6 +2819,9 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
BLI_callback_exec(re->main, (ID *)scene, G.is_break ? BLI_CB_EVT_RENDER_CANCEL : BLI_CB_EVT_RENDER_COMPLETE);
BKE_sound_reset_scene_specs(scene);
+ /* Destroy the opengl context in the correct thread. */
+ RE_gl_context_destroy(re);
+
/* UGLY WARNING */
G.is_rendering = false;
}