[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