diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-03-05 18:42:18 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-03-05 19:24:39 +0300 |
commit | 81283b1c81e30623a2c7d97763bfe264c93a0d28 (patch) | |
tree | 864f3da33d63fec638b9f1667f99354c9dc3d8a2 /source/blender/draw | |
parent | 4bc97db121a71b2577c73115d2adae8e09b8570a (diff) |
DRW: Fix rasterizer discard messing with clear commands
Fixes T62179 Viewport Ghosting on rigs
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 17 |
2 files changed, 11 insertions, 8 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index d79b7caf5e7..dee686e270e 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -306,6 +306,8 @@ typedef enum { DRW_STATE_STENCIL_NEQUAL = (1 << 31), } DRWState; #define DRW_STATE_DEFAULT (DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL) +#define DRW_STATE_RASTERIZER_ENABLED (DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_STENCIL | \ + DRW_STATE_WRITE_STENCIL_SHADOW_PASS | DRW_STATE_WRITE_STENCIL_SHADOW_FAIL) typedef enum { DRW_ATTR_INT, diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 352ce913fb7..56b0fb1faf2 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -97,15 +97,9 @@ void drw_state_set(DRWState state) /* Raster Discard */ { - if (CHANGED_ANY(DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | - DRW_STATE_WRITE_STENCIL | - DRW_STATE_WRITE_STENCIL_SHADOW_PASS | - DRW_STATE_WRITE_STENCIL_SHADOW_FAIL)) + if (CHANGED_ANY(DRW_STATE_RASTERIZER_ENABLED)) { - if ((state & (DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | - DRW_STATE_WRITE_STENCIL | DRW_STATE_WRITE_STENCIL_SHADOW_PASS | - DRW_STATE_WRITE_STENCIL_SHADOW_FAIL)) != 0) - { + if ((state & DRW_STATE_RASTERIZER_ENABLED) != 0) { glDisable(GL_RASTERIZER_DISCARD); } else { @@ -1355,6 +1349,13 @@ static void drw_draw_pass_ex(DRWPass *pass, DRWShadingGroup *start_group, DRWSha DST.shader = NULL; } + /* HACK: Rasterized discard can affect clear commands which are not + * part of a DRWPass (as of now). So disable rasterized discard here + * if it has been enabled. */ + if ((DST.state & DRW_STATE_RASTERIZER_ENABLED) == 0) { + drw_state_set((DST.state & ~DRW_STATE_RASTERIZER_ENABLED) | DRW_STATE_DEFAULT); + } + DRW_stats_query_end(); } |