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:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-03-29 12:43:42 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-03-29 12:43:42 +0300
commit90e1a5fd27c6b05d6192f31e1063ff0abf203770 (patch)
treeac593688a98045e279fd9807719b24f5b2e1fb24 /source/blender/draw/intern
parentf42c6960d2065a31526d448774cb43a345966813 (diff)
Draw manager: Use utility functions for dealing with state memset
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/draw_manager.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 2b64eabe332..79fe3facc5e 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -92,6 +92,20 @@ ListBase DRW_engines = {NULL, NULL};
extern struct GPUUniformBuffer *view_ubo; /* draw_manager_exec.c */
+static void drw_state_prepare_clean_for_draw(DRWManager *dst)
+{
+ memset(dst, 0x0, offsetof(DRWManager, ogl_context));
+}
+
+/* This function is used to reset draw manager to a state
+ * where we don't re-use data by accident across different
+ * draw calls.
+ */
+static void drw_state_ensure_not_reused(DRWManager *dst)
+{
+ memset(dst, 0xff, offsetof(DRWManager, ogl_context));
+}
+
/* -------------------------------------------------------------------- */
void DRW_draw_callbacks_pre_scene(void)
@@ -1002,7 +1016,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
BLI_mutex_lock(&DST.ogl_context_mutex);
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
DST.viewport = rv3d->viewport;
DST.draw_ctx = (DRWContextState){
@@ -1052,7 +1066,7 @@ void DRW_notify_id_update(const DRWUpdateContext *update_ctx, ID *id)
return;
}
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
DST.viewport = rv3d->viewport;
DST.draw_ctx = (DRWContextState){
ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine_type, depsgraph, OB_MODE_OBJECT, NULL,
@@ -1088,7 +1102,7 @@ void DRW_draw_view(const bContext *C)
View3D *v3d = CTX_wm_view3d(C);
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
DRW_draw_render_loop_ex(eval_ctx.depsgraph, engine_type, ar, v3d, eval_ctx.object_mode, C);
}
@@ -1235,7 +1249,7 @@ void DRW_draw_render_loop_ex(
#ifdef DEBUG
/* Avoid accidental reuse. */
- memset(&DST, 0xFF, offsetof(DRWManager, ogl_context));
+ drw_state_ensure_not_reused(&DST);
#endif
}
@@ -1244,7 +1258,7 @@ void DRW_draw_render_loop(
ARegion *ar, View3D *v3d, const eObjectMode object_mode)
{
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
Scene *scene = DEG_get_evaluated_scene(depsgraph);
RenderEngineType *engine_type = RE_engines_find(scene->view_render.engine_id);
@@ -1276,7 +1290,7 @@ void DRW_draw_render_loop_offscreen(
GPU_framebuffer_restore();
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
DST.options.is_image_render = true;
DST.options.draw_background = draw_background;
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, object_mode, NULL);
@@ -1311,7 +1325,7 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
* multiple threads. */
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
DST.options.is_image_render = true;
DST.options.is_scene_render = true;
DST.options.draw_background = scene->r.alphamode == R_ADDSKY;
@@ -1375,7 +1389,7 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
#ifdef DEBUG
/* Avoid accidental reuse. */
- memset(&DST, 0xFF, offsetof(DRWManager, ogl_context));
+ drw_state_ensure_not_reused(&DST);
#endif
}
@@ -1449,7 +1463,7 @@ void DRW_draw_select_loop(
RegionView3D *rv3d = ar->regiondata;
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
/* backup (_never_ use rv3d->viewport) */
void *backup_viewport = rv3d->viewport;
@@ -1566,7 +1580,7 @@ void DRW_draw_select_loop(
#ifdef DEBUG
/* Avoid accidental reuse. */
- memset(&DST, 0xFF, offsetof(DRWManager, ogl_context));
+ drw_state_ensure_not_reused(&DST);
#endif
GPU_framebuffer_restore();
@@ -1633,7 +1647,7 @@ void DRW_draw_depth_loop(
rv3d->viewport = NULL;
/* Reset before using it. */
- memset(&DST, 0x0, offsetof(DRWManager, ogl_context));
+ drw_state_prepare_clean_for_draw(&DST);
struct GPUViewport *viewport = GPU_viewport_create();
GPU_viewport_size_set(viewport, (const int[2]){ar->winx, ar->winy});
@@ -1700,7 +1714,7 @@ void DRW_draw_depth_loop(
#ifdef DEBUG
/* Avoid accidental reuse. */
- memset(&DST, 0xFF, offsetof(DRWManager, ogl_context));
+ drw_state_ensure_not_reused(&DST);
#endif
/* TODO: Reading depth for operators should be done here. */