[Bf-blender-cvs] [45dc1139e84] draw-colormanagement: DRW: Move Color-Management handling to draw manager
Clément Foucault
noreply at git.blender.org
Wed Jan 22 19:39:54 CET 2020
Commit: 45dc1139e84bd235256e8e13bb841643bbcc5008
Author: Clément Foucault
Date: Wed Jan 22 19:34:09 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rB45dc1139e84bd235256e8e13bb841643bbcc5008
DRW: Move Color-Management handling to draw manager
This is first part of the color managmeent refactor.
The drawing of the overlays is done in a sRGB texture to retain some bits
of accuracy.
The transform is applied after the overlays blending for now.
There is much left to be done.
===================================================================
M source/blender/draw/DRW_engine.h
M source/blender/draw/engines/eevee/eevee_engine.c
M source/blender/draw/engines/overlay/overlay_antialiasing.c
M source/blender/draw/engines/workbench/workbench_effect_aa.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_common.c
M source/blender/draw/intern/draw_manager.c
M source/blender/gpu/intern/gpu_viewport.c
===================================================================
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index b9e7908b3ef..a3cf9048d37 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -52,18 +52,17 @@ struct rcti;
/* Buffer and textures used by the viewport by default */
typedef struct DefaultFramebufferList {
struct GPUFrameBuffer *default_fb;
+ struct GPUFrameBuffer *default_display_fb;
struct GPUFrameBuffer *in_front_fb;
struct GPUFrameBuffer *color_only_fb;
struct GPUFrameBuffer *depth_only_fb;
- struct GPUFrameBuffer *multisample_fb;
} DefaultFramebufferList;
typedef struct DefaultTextureList {
struct GPUTexture *color;
+ struct GPUTexture *color_display_space;
struct GPUTexture *depth;
struct GPUTexture *depth_in_front;
- struct GPUTexture *multisample_color;
- struct GPUTexture *multisample_depth;
} DefaultTextureList;
void DRW_engines_register(void);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index fcfe63069ca..4ad9409a02a 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -335,14 +335,9 @@ static void eevee_draw_background(void *vedata)
}
if ((stl->g_data->render_passes & SCE_PASS_COMBINED) > 0) {
- /* Tonemapping and transfer result to default framebuffer. */
- bool use_render_settings = stl->g_data->use_color_render_settings;
-
+ /* Transfer result to default framebuffer. */
GPU_framebuffer_bind(dfbl->default_fb);
- DRW_transform_to_display(stl->effects->final_tx, true, use_render_settings);
-
- /* Draw checkerboard with alpha under. */
- EEVEE_draw_alpha_checker(vedata);
+ DRW_transform_none(stl->effects->final_tx);
}
else {
EEVEE_renderpasses_draw(sldata, vedata);
diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c
index 751c6dc7016..69837a6c22a 100644
--- a/source/blender/draw/engines/overlay/overlay_antialiasing.c
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -75,40 +75,26 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
return;
}
- 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);
+ pd->antialiasing.enabled = true;
- GPUTexture *color_tex = NULL;
- GPUTexture *line_tex = NULL;
-
- if (pd->antialiasing.enabled) {
- DRW_texture_ensure_fullscreen_2d(&txl->overlay_color_tx, GPU_RGBA8, 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;
- }
+ 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);
GPU_framebuffer_ensure_config(&fbl->overlay_color_only_fb,
{
GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(color_tex),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
});
GPU_framebuffer_ensure_config(&fbl->overlay_default_fb,
{
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(color_tex),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
});
GPU_framebuffer_ensure_config(&fbl->overlay_line_fb,
{
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(color_tex),
- GPU_ATTACHMENT_TEXTURE(line_tex),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_line_tx),
});
}
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index ed311db0626..b42d4b14bd9 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -53,16 +53,9 @@ void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx)
}
}
-static void workspace_aa_draw_transform(GPUTexture *tx, WORKBENCH_PrivateData *wpd)
+static void workspace_aa_draw_transform(GPUTexture *tx, WORKBENCH_PrivateData *UNUSED(wpd))
{
- if (DRW_state_do_color_management()) {
- /* Display space result for viewport. */
- DRW_transform_to_display(tx, wpd->use_color_render_settings, wpd->use_color_render_settings);
- }
- else {
- /* Linear result for render. */
- DRW_transform_none(tx);
- }
+ DRW_transform_none(tx);
}
void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index e100f6e875c..bb515bdc083 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -438,7 +438,7 @@ BLI_INLINE eGPUTextureFormat workbench_color_texture_format(const WORKBENCH_Priv
result = GPU_RGBA16;
}
else {
- result = GPU_RGBA8;
+ result = GPU_RGBA16;
}
return result;
}
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 8037bd03383..63087760966 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -138,6 +138,7 @@ typedef struct DrawEngineType {
/* Buffer and textures used by the viewport by default */
typedef struct DefaultFramebufferList {
struct GPUFrameBuffer *default_fb;
+ struct GPUFrameBuffer *default_display_fb;
struct GPUFrameBuffer *in_front_fb;
struct GPUFrameBuffer *color_only_fb;
struct GPUFrameBuffer *depth_only_fb;
@@ -145,6 +146,7 @@ typedef struct DefaultFramebufferList {
typedef struct DefaultTextureList {
struct GPUTexture *color;
+ struct GPUTexture *color_display_space;
struct GPUTexture *depth;
struct GPUTexture *depth_in_front;
} DefaultTextureList;
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 65365ef7119..e82c010d906 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -173,7 +173,7 @@ void DRW_globals_update(void)
invert_v2(gb->sizeViewportInv);
/* Color management. */
- if (!DRW_state_do_color_management()) {
+ {
float *color = gb->UBO_FIRST_COLOR;
do {
/* TODO more accurate transform. */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 99dc640158a..7f122e0f8d1 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1591,6 +1591,13 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
drw_debug_draw();
+ {
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ GPU_framebuffer_bind(dfbl->default_display_fb);
+ DRW_transform_to_display(dtxl->color, true, true);
+ }
+
/* Fix 3D view being "laggy" on macos and win+nvidia. (See T56996, T61474) */
GPU_flush();
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 786ea6c4cae..590da0c3c0c 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -366,6 +366,10 @@ static void gpu_viewport_default_fb_create(GPUViewport *viewport)
dtxl->color = GPU_texture_create_2d(size[0], size[1], GPU_RGBA16F, NULL, NULL);
dtxl->depth = GPU_texture_create_2d(size[0], size[1], GPU_DEPTH24_STENCIL8, NULL, NULL);
+ /* TODO(fclem) make it optional if using imageLoad/Store. */
+ dtxl->color_display_space = GPU_texture_create_2d(
+ size[0], size[1], GPU_R11F_G11F_B10F, NULL, NULL);
+
if (!dtxl->depth || !dtxl->color) {
ok = false;
goto cleanup;
@@ -377,6 +381,13 @@ static void gpu_viewport_default_fb_create(GPUViewport *viewport)
GPU_ATTACHMENT_TEXTURE(dtxl->color),
});
+ /* TODO(fclem) make it optional if using imageLoad/Store. */
+ GPU_framebuffer_ensure_config(&dfbl->default_display_fb,
+ {
+ GPU_ATTACHMENT_TEXTURE(dtxl->depth),
+ GPU_ATTACHMENT_TEXTURE(dtxl->color_display_space),
+ });
+
GPU_framebuffer_ensure_config(&dfbl->depth_only_fb,
{
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
@@ -451,7 +462,7 @@ void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect)
DefaultTextureList *dtxl = viewport->txl;
- GPUTexture *color = dtxl->color;
+ GPUTexture *color = dtxl->color_display_space;
const float w = (float)GPU_texture_width(color);
const float h = (float)GPU_texture_height(color);
More information about the Bf-blender-cvs
mailing list