Draw manager: Use utility functions for dealing with state memset
This commit is contained in:
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user