[Bf-blender-cvs] [90e1a5fd27c] blender2.8: Draw manager: Use utility functions for dealing with state memset

Sergey Sharybin noreply at git.blender.org
Thu Mar 29 11:44:30 CEST 2018


Commit: 90e1a5fd27c6b05d6192f31e1063ff0abf203770
Author: Sergey Sharybin
Date:   Thu Mar 29 11:43:42 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB90e1a5fd27c6b05d6192f31e1063ff0abf203770

Draw manager: Use utility functions for dealing with state memset

===================================================================

M	source/blender/draw/intern/draw_manager.c

===================================================================

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. */



More information about the Bf-blender-cvs mailing list