[Bf-blender-cvs] [03cc35013c2] tmp-overlay-engine: Overlay Engine: Only alloc extra depth texture if really needed

Clément Foucault noreply at git.blender.org
Sun Nov 24 02:03:14 CET 2019


Commit: 03cc35013c2ef5f238552891ef84805aadbcf1ce
Author: Clément Foucault
Date:   Sun Nov 24 01:09:40 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB03cc35013c2ef5f238552891ef84805aadbcf1ce

Overlay Engine: Only alloc extra depth texture if really needed

However this is a bit hacky as both workbench deferred and overlay engine
are responsible to ensure the texture is correctly allocated and framebuffers
are settuped.

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

M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index a3cb4d2f809..3c4c75e9973 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -324,6 +324,22 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
 
 static void OVERLAY_cache_finish(void *vedata)
 {
+  /* TODO(fclem) Only do this when really needed. */
+  {
+    /* HACK we allocate the infront depth here to avoid the overhead when if is not needed. */
+    DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+    DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
+
+    GPU_framebuffer_ensure_config(
+        &dfbl->default_fb,
+        {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+    GPU_framebuffer_ensure_config(
+        &dfbl->in_front_fb,
+        {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+  }
+
   OVERLAY_armature_cache_finish(vedata);
   OVERLAY_image_cache_finish(vedata);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 0505ff37f49..9a7e1a5a782 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -507,13 +507,6 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
                                       GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
                                       GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
                                   });
-    GPU_framebuffer_ensure_config(&fbl->ghost_prepass_fb,
-                                  {
-                                      GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
-                                      GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
-                                      GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
-                                      GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
-                                  });
     GPU_framebuffer_ensure_config(&fbl->cavity_fb,
                                   {
                                       GPU_ATTACHMENT_NONE,
@@ -1206,8 +1199,33 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
   }
 }
 
-void workbench_deferred_cache_finish(WORKBENCH_Data *UNUSED(vedata))
+void workbench_deferred_cache_finish(WORKBENCH_Data *vedata)
 {
+  WORKBENCH_PassList *psl = vedata->psl;
+  WORKBENCH_FramebufferList *fbl = vedata->fbl;
+
+  if (GHOST_ENABLED(psl)) {
+    /* HACK we allocate the infront depth here to avoid the overhead when if is not needed. */
+    DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+    DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
+
+    GPU_framebuffer_ensure_config(
+        &dfbl->default_fb,
+        {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+    GPU_framebuffer_ensure_config(
+        &dfbl->in_front_fb,
+        {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+
+    GPU_framebuffer_ensure_config(&fbl->ghost_prepass_fb,
+                                  {
+                                      GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
+                                  });
+  }
 }
 
 void workbench_deferred_draw_background(WORKBENCH_Data *vedata)
@@ -1241,6 +1259,7 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
   WORKBENCH_FramebufferList *fbl = vedata->fbl;
   WORKBENCH_PrivateData *wpd = stl->g_data;
   DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
   if (workbench_is_taa_enabled(wpd)) {
     workbench_taa_draw_scene_start(vedata);
@@ -1251,9 +1270,15 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
   DRW_draw_pass(psl->prepass_pass);
   DRW_draw_pass(psl->prepass_hair_pass);
 
-  /* TODO(fclem) This clear should be done in a global place. */
-  GPU_framebuffer_bind(fbl->ghost_prepass_fb);
-  GPU_framebuffer_clear_depth(fbl->ghost_prepass_fb, 1.0f);
+  if (fbl->ghost_prepass_fb) {
+    GPU_framebuffer_bind(fbl->ghost_prepass_fb);
+    GPU_framebuffer_clear_depth(fbl->ghost_prepass_fb, 1.0f);
+  }
+  else if (dtxl->depth_in_front) {
+    /* TODO(fclem) This clear should be done in a global place. */
+    GPU_framebuffer_bind(dfbl->in_front_fb);
+    GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
+  }
 
   if (GHOST_ENABLED(psl)) {
     DRW_draw_pass(psl->ghost_prepass_pass);
@@ -1324,7 +1349,6 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
   DRW_draw_pass(psl->background_pass);
 
   if (OIT_ENABLED(wpd) && !DRW_pass_is_empty(psl->transparent_accum_pass)) {
-    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
     /* meh, late init to not request buffers we won't use. */
     workbench_init_oit_framebuffer(fbl, dtxl);
 
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 142cf375137..1a7b999514c 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -395,7 +395,6 @@ static void gpu_viewport_default_fb_create(GPUViewport *viewport, const bool hig
   dtxl->color = GPU_texture_create_2d(
       size[0], size[1], high_bitdepth ? GPU_RGBA16F : GPU_RGBA8, NULL, NULL);
   dtxl->depth = GPU_texture_create_2d(size[0], size[1], GPU_DEPTH24_STENCIL8, NULL, NULL);
-  dtxl->depth_in_front = GPU_texture_create_2d(size[0], size[1], GPU_DEPTH24_STENCIL8, NULL, NULL);
 
   if (!(dtxl->depth && dtxl->color)) {
     ok = false;
@@ -406,10 +405,6 @@ static void gpu_viewport_default_fb_create(GPUViewport *viewport, const bool hig
       &dfbl->default_fb,
       {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
 
-  GPU_framebuffer_ensure_config(
-      &dfbl->in_front_fb,
-      {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
-
   GPU_framebuffer_ensure_config(&dfbl->depth_only_fb,
                                 {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_NONE});
 
@@ -417,7 +412,6 @@ static void gpu_viewport_default_fb_create(GPUViewport *viewport, const bool hig
                                 {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(dtxl->color)});
 
   ok = ok && GPU_framebuffer_check_valid(dfbl->default_fb, NULL);
-  ok = ok && GPU_framebuffer_check_valid(dfbl->in_front_fb, NULL);
   ok = ok && GPU_framebuffer_check_valid(dfbl->color_only_fb, NULL);
   ok = ok && GPU_framebuffer_check_valid(dfbl->depth_only_fb, NULL);



More information about the Bf-blender-cvs mailing list