[Bf-blender-cvs] [23064248d7a] master: DrawManager: Color Management

Jeroen Bakker noreply at git.blender.org
Fri May 31 12:45:26 CEST 2019


Commit: 23064248d7a08d01061e108972985a11997f046c
Author: Jeroen Bakker
Date:   Tue May 21 12:00:48 2019 +0200
Branches: master
https://developer.blender.org/rB23064248d7a08d01061e108972985a11997f046c

DrawManager: Color Management

The draw manager used to determine if the view transform should be
applied by checking if the scene was not rendered to an offscreen image.

As the sequencer and texture painting needs to render to an offscreen
image with the view transform applied we need to separate the
`do_color_management` from the `is_image_render`.

Reviewed By: fclem

Maniphest Tasks: T64849

Differential Revision: https://developer.blender.org/D4909

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

M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
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/draw/intern/draw_manager.h

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f78f7295d24..07588467ae2 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -976,7 +976,7 @@ void GPENCIL_draw_scene(void *ved)
               stl->storage->blend_mode = array_elm->mode;
               stl->storage->clamp_layer = (int)array_elm->clamp_layer;
               stl->storage->blend_opacity = array_elm->blend_opacity;
-              stl->storage->tonemapping = stl->storage->is_render ? 1 : 0;
+              stl->storage->tonemapping = DRW_state_do_color_management() ? 0 : 1;
               DRW_draw_pass(psl->blend_pass);
               stl->storage->tonemapping = 0;
 
@@ -1018,7 +1018,8 @@ void GPENCIL_draw_scene(void *ved)
           GPU_framebuffer_bind(fbl->main);
         }
         /* tonemapping */
-        stl->storage->tonemapping = is_render ? 1 : 0;
+        stl->storage->tonemapping = DRW_state_do_color_management() ? 0 : 1;
+
         /* active select flag and selection color */
         if (!is_render) {
           UI_GetThemeColorShadeAlpha4fv(
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index 965f5a5ca4f..ed311db0626 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -55,14 +55,14 @@ void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx)
 
 static void workspace_aa_draw_transform(GPUTexture *tx, WORKBENCH_PrivateData *wpd)
 {
-  if (DRW_state_is_image_render()) {
-    /* Linear result for render. */
-    DRW_transform_none(tx);
-  }
-  else {
+  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);
+  }
 }
 
 void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 4115038ee42..315b3ee8b30 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -663,6 +663,7 @@ bool DRW_state_is_fbo(void);
 bool DRW_state_is_select(void);
 bool DRW_state_is_depth(void);
 bool DRW_state_is_image_render(void);
+bool DRW_state_do_color_management(void);
 bool DRW_state_is_scene_render(void);
 bool DRW_state_is_opengl_render(void);
 bool DRW_state_is_playback(void);
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 866fd57b9a8..9e494cdad88 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -156,7 +156,7 @@ void DRW_globals_update(void)
   gb->sizeEdgeFix = U.pixelsize * (0.5f + 2.0f * (2.0f * (gb->sizeEdge * (float)M_SQRT1_2)));
 
   /* Color management. */
-  if (DRW_state_is_image_render()) {
+  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 10e9b8fbdf0..6428eb77ddb 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -298,8 +298,8 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_transform, bool use
 
   bool use_ocio = false;
 
-  /* View transform is already applied for offscreen, don't apply again, see: T52046 */
-  if (!(DST.options.is_image_render && !DST.options.is_scene_render)) {
+  /* Should we apply the view transform */
+  if (DRW_state_do_color_management()) {
     Scene *scene = DST.draw_ctx.scene;
     ColorManagedDisplaySettings *display_settings = &scene->display_settings;
     ColorManagedViewSettings view_settings;
@@ -1558,6 +1558,7 @@ void DRW_draw_view(const bContext *C)
                            (v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) != 0);
   DST.options.draw_background = (scene->r.alphamode == R_ADDSKY) ||
                                 (v3d->shading.type != OB_RENDER);
+  DST.options.do_color_management = true;
   DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, viewport, C);
 }
 
@@ -1819,9 +1820,8 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
 
   /* Reset before using it. */
   drw_state_prepare_clean_for_draw(&DST);
-  /* WATCH: Force color management to output CManaged byte buffer by
-   * forcing is_image_render to false. */
-  DST.options.is_image_render = !do_color_management;
+  DST.options.is_image_render = true;
+  DST.options.do_color_management = do_color_management;
   DST.options.draw_background = draw_background;
   DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, render_viewport, NULL);
 
@@ -2986,6 +2986,14 @@ bool DRW_state_is_image_render(void)
   return DST.options.is_image_render;
 }
 
+/**
+ * Whether the view transform should be applied.
+ */
+bool DRW_state_do_color_management(void)
+{
+  return DST.options.do_color_management;
+}
+
 /**
  * Whether we are rendering only the render engine,
  * or if we should also render the mode engines.
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 867d7132c20..ddbfa81985d 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -315,6 +315,7 @@ typedef struct DRWManager {
     uint is_depth : 1;
     uint is_image_render : 1;
     uint is_scene_render : 1;
+    uint do_color_management : 1;
     uint draw_background : 1;
     uint draw_text : 1;
   } options;



More information about the Bf-blender-cvs mailing list