[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