From 90e1a5fd27c6b05d6192f31e1063ff0abf203770 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 29 Mar 2018 11:43:42 +0200 Subject: Draw manager: Use utility functions for dealing with state memset --- source/blender/draw/intern/draw_manager.c | 38 +++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'source/blender/draw/intern') 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. */ -- cgit v1.2.3