[Bf-blender-cvs] [05dda64cf29] draw-colormanagement: DRW: Color Management: Do some rearangement of the draw code

Clément Foucault noreply at git.blender.org
Fri Jan 24 19:24:18 CET 2020


Commit: 05dda64cf29ad63a9bc488f7e2165d14eaf96dde
Author: Clément Foucault
Date:   Fri Jan 24 16:23:51 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rB05dda64cf29ad63a9bc488f7e2165d14eaf96dde

DRW: Color Management: Do some rearangement of the draw code

This puts the color management functions inside one file.

We group all post transform drawing into DRW_draw_callbacks_post_scene.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_renderpasses.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
M	source/blender/draw/intern/DRW_render.h
A	source/blender/draw/intern/draw_color_management.c
A	source/blender/draw/intern/draw_color_management.h
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 544ca85880b..a7aedbc7192 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -56,6 +56,7 @@ set(SRC
   intern/draw_cache_impl_mesh.c
   intern/draw_cache_impl_metaball.c
   intern/draw_cache_impl_particles.c
+  intern/draw_color_management.c
   intern/draw_common.c
   intern/draw_debug.c
   intern/draw_hair.c
@@ -147,6 +148,7 @@ set(SRC
   intern/draw_cache_extract.h
   intern/draw_cache_impl.h
   intern/draw_cache_inline.h
+  intern/draw_color_management.h
   intern/draw_common.h
   intern/draw_debug.h
   intern/draw_hair_private.h
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c3537eec96a..8f17afdc1fe 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -22,6 +22,8 @@
 
 #include "DRW_render.h"
 
+#include "draw_color_management.h" /* TODO remove dependency */
+
 #include "BLI_rand.h"
 
 #include "BKE_object.h"
diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c
index 8dd4fd84020..e3cdf98925c 100644
--- a/source/blender/draw/engines/eevee/eevee_renderpasses.c
+++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c
@@ -23,6 +23,8 @@
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
+#include "draw_color_management.h" /* TODO remove dependency. */
+
 #include "BKE_global.h" /* for G.debug_value */
 
 #include "BLI_string_utils.h"
@@ -241,6 +243,7 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
   bool is_valid = (render_pass & EEVEE_RENDERPASSES_ALL) > 0;
   bool needs_color_transfer = (render_pass & EEVEE_RENDERPASSES_COLOR_PASS) > 0 &&
                               DRW_state_is_opengl_render();
+  UNUSED_VARS(needs_color_transfer);
 
   /* When SSS isn't available, but the pass is requested, we mark it as invalid */
   if ((render_pass & EEVEE_RENDERPASSES_SUBSURFACE) != 0 &&
@@ -263,7 +266,7 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
   if (is_valid) {
     EEVEE_renderpasses_postprocess(sldata, vedata, render_pass);
     GPU_framebuffer_bind(dfbl->default_fb);
-    DRW_transform_to_display(txl->renderpass, needs_color_transfer, false);
+    DRW_transform_none(txl->renderpass);
   }
   else {
     /* Draw state is not valid for this pass, clear the buffer */
@@ -326,6 +329,6 @@ void EEVEE_renderpasses_draw_debug(EEVEE_Data *vedata)
   }
 
   if (tx) {
-    DRW_transform_to_display(tx, false, false);
+    DRW_transform_none(tx);
   }
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index b5e7349fb88..9d5b9d5f7c1 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -524,7 +524,6 @@ void DRW_gpencil_free_runtime_data(void *ved);
     if ((lvl > 0) && (fbl->multisample_fb != NULL) && (DRW_state_is_fbo())) { \
       DRW_stats_query_start("GP Multisample Resolve"); \
       GPU_framebuffer_bind(fb); \
-      DRW_multisamples_resolve(txl->multisample_depth, txl->multisample_color, true); \
       DRW_stats_query_end(); \
     } \
   } \
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index b42d4b14bd9..c03fe5cd5c8 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -22,6 +22,8 @@
 
 #include "ED_screen.h"
 
+#include "draw_color_management.h"
+
 #include "workbench_private.h"
 
 void workbench_aa_create_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 31ee6f1f504..5a71c7fd4e7 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -210,14 +210,6 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
     } \
   } while (0)
 
-void DRW_transform_to_display(struct GPUTexture *tex,
-                              bool use_view_transform,
-                              bool use_render_settings);
-void DRW_transform_none(struct GPUTexture *tex);
-void DRW_multisamples_resolve(struct GPUTexture *src_depth,
-                              struct GPUTexture *src_color,
-                              bool use_depth);
-
 /* Shaders */
 struct GPUShader *DRW_shader_create(const char *vert,
                                     const char *geom,
diff --git a/source/blender/draw/intern/draw_color_management.c b/source/blender/draw/intern/draw_color_management.c
new file mode 100644
index 00000000000..1313a033146
--- /dev/null
+++ b/source/blender/draw/intern/draw_color_management.c
@@ -0,0 +1,146 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2020, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw
+ */
+
+#include <stdio.h>
+
+#include "draw_manager.h"
+
+#include "DRW_render.h"
+
+#include "GPU_batch.h"
+#include "GPU_framebuffer.h"
+#include "GPU_matrix.h"
+#include "GPU_texture.h"
+
+#include "BKE_colortools.h"
+
+#include "IMB_colormanagement.h"
+
+#include "draw_color_management.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Color Management
+ * \{ */
+
+/* Use color management profile to draw texture to framebuffer */
+void DRW_transform_to_display(GPUTexture *tex, bool use_view_transform, bool use_render_settings)
+{
+  drw_state_set(DRW_STATE_WRITE_COLOR);
+
+  GPUBatch *geom = DRW_cache_fullscreen_quad_get();
+
+  const float dither = 1.0f;
+
+  bool use_ocio = false;
+
+  GPU_matrix_identity_set();
+  GPU_matrix_identity_projection_set();
+
+  /* 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;
+    if (use_render_settings) {
+      /* Use full render settings, for renders with scene lighting. */
+      view_settings = scene->view_settings;
+    }
+    else if (use_view_transform) {
+      /* Use only view transform + look and nothing else for lookdev without
+       * scene lighting, as exposure depends on scene light intensity. */
+      BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
+      STRNCPY(view_settings.view_transform, scene->view_settings.view_transform);
+      STRNCPY(view_settings.look, scene->view_settings.look);
+    }
+    else {
+      /* For workbench use only default view transform in configuration,
+       * using no scene settings. */
+      BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
+    }
+
+    use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
+        &view_settings, display_settings, NULL, dither, false);
+  }
+
+  if (use_ocio) {
+    GPU_batch_program_set_imm_shader(geom);
+    /* End IMM session. */
+    IMB_colormanagement_finish_glsl_draw();
+  }
+  else {
+    /* View transform is already applied for offscreen, don't apply again, see: T52046 */
+    if (DST.options.is_image_render && !DST.options.is_scene_render) {
+      GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_IMAGE_COLOR);
+      GPU_batch_uniform_4f(geom, "color", 1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    else {
+      GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB);
+    }
+    GPU_batch_uniform_1i(geom, "image", 0);
+  }
+
+  GPU_texture_bind(tex, 0); /* OCIO texture bind point is 0 */
+  GPU_batch_draw(geom);
+  GPU_texture_unbind(tex);
+}
+
+/* Draw texture to framebuffer without any color transforms */
+void DRW_transform_none(GPUTexture *tex)
+{
+  drw_state_set(DRW_STATE_WRITE_COLOR);
+
+  /* Draw as texture for final render (without immediate mode). */
+  GPUBatch *geom = DRW_cache_fullscreen_quad_get();
+  GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_IMAGE_COLOR);
+
+  GPU_texture_bind(tex, 0);
+
+  const float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  GPU_batch_uniform_4fv(geom, "color", white);
+
+  float mat[4][4];
+  unit_m4(mat);
+  GPU_batch_uniform_mat4(geom, "ModelViewProjectionMatrix", mat);
+
+  GPU_batch_program_use_begin(geom);
+  GPU_batch_bind(geom);
+  GPU_batch_draw_advanced(geom, 0, 0, 0, 0);
+  GPU_batch_program_use_end(geom);
+
+  GPU_texture_unbind(tex);
+}
+
+void DRW_transform_to_display_linear(void)
+{
+  /* TODO */
+}
+
+void DRW_transform_to_display_encoded(void)
+{
+  /* TODO */
+  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);
+}
+
+/** \} */
diff --git a/source/blender/draw/intern/draw_color_management.h b/source/blender/draw/intern/draw_color_management.h
new file mode 100644
index 00000000000..efbe4bdc1df
--- /dev/null
+++ b/source/blender/draw/intern/draw_color_management.h
@@ -0,0 +1,33 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distribu

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list