[Bf-blender-cvs] [da240defef2] draw-colormanagement: Overlay: Don't always allocate the antialiasing buffer and draw background...

Clément Foucault noreply at git.blender.org
Sun Jan 26 21:36:51 CET 2020


Commit: da240defef2763c0af558128378fd988d1565710
Author: Clément Foucault
Date:   Sun Jan 26 21:36:25 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rBda240defef2763c0af558128378fd988d1565710

Overlay: Don't always allocate the antialiasing buffer and draw background...

...in the main overlay buffer.

This is required if we do caching in the future.

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

M	source/blender/draw/engines/overlay/overlay_antialiasing.c
M	source/blender/draw/engines/overlay/overlay_background.c
M	source/blender/draw/engines/overlay/overlay_engine.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c
index c5dfe829ec9..84a1fd346b4 100644
--- a/source/blender/draw/engines/overlay/overlay_antialiasing.c
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -75,26 +75,40 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
     return;
   }
 
-  pd->antialiasing.enabled = true;
+  bool need_wire_expansion = (G_draw.block.sizePixel > 1.0f);
+  pd->antialiasing.enabled = need_wire_expansion ||
+                             ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0);
 
-  DRW_texture_ensure_fullscreen_2d(&txl->overlay_color_tx, GPU_SRGB8_A8, 0);
-  DRW_texture_ensure_fullscreen_2d(&txl->overlay_line_tx, GPU_RGBA8, 0);
+  GPUTexture *color_tex = NULL;
+  GPUTexture *line_tex = NULL;
+
+  if (pd->antialiasing.enabled) {
+    DRW_texture_ensure_fullscreen_2d(&txl->overlay_color_tx, GPU_SRGB8_A8, DRW_TEX_FILTER);
+    DRW_texture_ensure_fullscreen_2d(&txl->overlay_line_tx, GPU_RGBA8, 0);
+
+    color_tex = txl->overlay_color_tx;
+    line_tex = txl->overlay_line_tx;
+  }
+  else {
+    /* Just a copy of the defaults framebuffers. */
+    color_tex = dtxl->color;
+  }
 
   GPU_framebuffer_ensure_config(&fbl->overlay_color_only_fb,
                                 {
                                     GPU_ATTACHMENT_NONE,
-                                    GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
+                                    GPU_ATTACHMENT_TEXTURE(color_tex),
                                 });
   GPU_framebuffer_ensure_config(&fbl->overlay_default_fb,
                                 {
                                     GPU_ATTACHMENT_TEXTURE(dtxl->depth),
-                                    GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
+                                    GPU_ATTACHMENT_TEXTURE(color_tex),
                                 });
   GPU_framebuffer_ensure_config(&fbl->overlay_line_fb,
                                 {
                                     GPU_ATTACHMENT_TEXTURE(dtxl->depth),
-                                    GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
-                                    GPU_ATTACHMENT_TEXTURE(txl->overlay_line_tx),
+                                    GPU_ATTACHMENT_TEXTURE(color_tex),
+                                    GPU_ATTACHMENT_TEXTURE(line_tex),
                                 });
 }
 
@@ -112,7 +126,7 @@ void OVERLAY_antialiasing_cache_init(OVERLAY_Data *vedata)
      * anti aliasing is needed. */
     const bool do_smooth_lines = (U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0;
 
-    DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR);
+    DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL);
 
     sh = OVERLAY_shader_antialiasing();
     grp = DRW_shgroup_create(sh, psl->antialiasing_ps);
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c
index 14e6c70d538..37767bb3b76 100644
--- a/source/blender/draw/engines/overlay/overlay_background.c
+++ b/source/blender/draw/engines/overlay/overlay_background.c
@@ -64,9 +64,6 @@ void OVERLAY_background_draw(OVERLAY_Data *vedata)
   OVERLAY_PassList *psl = vedata->psl;
 
   if (DRW_state_is_fbo()) {
-    /* TODO(fclem) Drawing the background inside the overlay buffer will become a problem
-     * once we cache the overlay result.
-     * Because the render can change / refine the alpha chanel. */
     DRW_draw_pass(psl->background_ps);
   }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index d0757ced053..2ce383a0d6d 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -390,6 +390,16 @@ static void OVERLAY_draw_scene(void *vedata)
   OVERLAY_Data *data = vedata;
   OVERLAY_PrivateData *pd = data->stl->pd;
   OVERLAY_FramebufferList *fbl = data->fbl;
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+
+  if (DRW_state_is_fbo()) {
+    float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+    GPU_framebuffer_bind(dfbl->overlay_only_fb);
+    GPU_framebuffer_clear_color(dfbl->overlay_only_fb, clear_col);
+  }
+
+  OVERLAY_image_background_draw(vedata);
+  OVERLAY_background_draw(vedata);
 
   OVERLAY_antialiasing_start(vedata);
 
@@ -399,9 +409,6 @@ static void OVERLAY_draw_scene(void *vedata)
     GPU_framebuffer_bind(fbl->overlay_color_only_fb);
   }
 
-  OVERLAY_image_background_draw(vedata);
-  OVERLAY_background_draw(vedata);
-
   OVERLAY_outline_draw(vedata);
 
   if (DRW_state_is_fbo()) {



More information about the Bf-blender-cvs mailing list