[Bf-blender-cvs] [c5436883c66] blender-v2.82-release: Fix T69121 DRW: Missing depth buffer refresh with GPencil + Cycles
Clément Foucault
noreply at git.blender.org
Thu Jan 23 21:41:49 CET 2020
Commit: c5436883c66ff16288cb17e8b54ddad4c91cb5f9
Author: Clément Foucault
Date: Thu Jan 23 21:38:06 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rBc5436883c66ff16288cb17e8b54ddad4c91cb5f9
Fix T69121 DRW: Missing depth buffer refresh with GPencil + Cycles
I just cleaned up the logic and checked for GPencil objects in the scene.
===================================================================
M source/blender/draw/engines/external/external_engine.c
===================================================================
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index 704e16b2907..23fa30b5c13 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -82,13 +82,13 @@ typedef struct EXTERNAL_Data {
static struct {
/* Depth Pre Pass */
struct GPUShader *depth_sh;
- bool draw_depth;
} e_data = {NULL}; /* Engine data */
typedef struct EXTERNAL_PrivateData {
DRWShadingGroup *depth_shgrp;
/* Do we need to update the depth or can we reuse the last calculated texture. */
+ bool need_depth;
bool update_depth;
float last_persmat[4][4];
@@ -110,13 +110,15 @@ static void external_engine_init(void *vedata)
if (!stl->g_data) {
/* Alloc transient pointers */
stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
- stl->g_data->update_depth = true;
+ stl->g_data->need_depth = true;
}
+ stl->g_data->update_depth = true;
+
/* Progressive render samples are tagged with no rebuild, in that case we
* can skip updating the depth buffer */
- if (!(ar && (ar->do_draw & RGN_DRAW_NO_REBUILD))) {
- stl->g_data->update_depth = true;
+ if (ar && (ar->do_draw & RGN_DRAW_NO_REBUILD)) {
+ stl->g_data->update_depth = false;
}
}
@@ -126,6 +128,8 @@ static void external_cache_init(void *vedata)
EXTERNAL_StorageList *stl = ((EXTERNAL_Data *)vedata)->stl;
EXTERNAL_TextureList *txl = ((EXTERNAL_Data *)vedata)->txl;
EXTERNAL_FramebufferList *fbl = ((EXTERNAL_Data *)vedata)->fbl;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const View3D *v3d = draw_ctx->v3d;
{
DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0);
@@ -144,14 +148,7 @@ static void external_cache_init(void *vedata)
}
/* Do not draw depth pass when overlays are turned off. */
- e_data.draw_depth = false;
- const DRWContextState *draw_ctx = DRW_context_state_get();
- const View3D *v3d = draw_ctx->v3d;
- if (v3d->flag2 & V3D_HIDE_OVERLAYS) {
- /* mark `update_depth` for when overlays are turned on again. */
- stl->g_data->update_depth = true;
- return;
- }
+ stl->g_data->need_depth = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
}
static void external_cache_populate(void *vedata, Object *ob)
@@ -163,20 +160,16 @@ static void external_cache_populate(void *vedata, Object *ob)
return;
}
- /* Do not draw depth pass when overlays are turned off. */
- const DRWContextState *draw_ctx = DRW_context_state_get();
- const View3D *v3d = draw_ctx->v3d;
- if (v3d->flag2 & V3D_HIDE_OVERLAYS) {
+ if (ob->type == OB_GPENCIL) {
+ /* Grease Pencil objects need correct depth to do the blending. */
+ stl->g_data->need_depth = true;
return;
}
- if (stl->g_data->update_depth) {
- e_data.draw_depth = true;
- struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
- if (geom) {
- /* Depth Prepass */
- DRW_shgroup_call(stl->g_data->depth_shgrp, geom, ob);
- }
+ struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
+ if (geom) {
+ /* Depth Prepass */
+ DRW_shgroup_call(stl->g_data->depth_shgrp, geom, ob);
}
}
@@ -246,16 +239,14 @@ static void external_draw_scene(void *vedata)
external_draw_scene_do(vedata);
}
- if (e_data.draw_depth) {
+ if (stl->g_data->update_depth && stl->g_data->need_depth) {
DRW_draw_pass(psl->depth_pass);
- // copy result to tmp buffer
+ /* Copy main depth buffer to cached framebuffer. */
GPU_framebuffer_blit(dfbl->depth_only_fb, 0, fbl->depth_buffer_fb, 0, GPU_DEPTH_BIT);
- stl->g_data->update_depth = false;
- }
- else {
- // copy tmp buffer to default
- GPU_framebuffer_blit(fbl->depth_buffer_fb, 0, dfbl->depth_only_fb, 0, GPU_DEPTH_BIT);
}
+
+ /* Copy cached depth buffer to main framebuffer. */
+ GPU_framebuffer_blit(fbl->depth_buffer_fb, 0, dfbl->depth_only_fb, 0, GPU_DEPTH_BIT);
}
static void external_engine_free(void)
More information about the Bf-blender-cvs
mailing list