[Bf-blender-cvs] [adf98e6360d] draw-colormanagement: DRW: Move color management to the GPUViewport

Clément Foucault noreply at git.blender.org
Sun Jan 26 21:08:47 CET 2020


Commit: adf98e6360d9865b2c086178f5e2fa051d212f2e
Author: Clément Foucault
Date:   Sun Jan 26 17:09:27 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rBadf98e6360d9865b2c086178f5e2fa051d212f2e

DRW: Move color management to the GPUViewport

This moves the colormanagement step at the blitting step of the viewport.
This means the overlay (including gizmos) must all be rendered in a
separate buffer (meaning they are more or less properly color managed).

The draw manager sets the display transform to apply to the GPUViewport.

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

M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/overlay/overlay_antialiasing.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_color_management.c
M	source/blender/draw/intern/draw_color_management.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/screen/glutil.c
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/intern/gpu_viewport.c
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/colormanagement.c

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

diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index a3cf9048d37..647d8a0841f 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -52,15 +52,16 @@ 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 *overlay_fb;
   struct GPUFrameBuffer *in_front_fb;
   struct GPUFrameBuffer *color_only_fb;
   struct GPUFrameBuffer *depth_only_fb;
+  struct GPUFrameBuffer *overlay_only_fb;
 } DefaultFramebufferList;
 
 typedef struct DefaultTextureList {
   struct GPUTexture *color;
-  struct GPUTexture *color_display_space;
+  struct GPUTexture *color_overlay;
   struct GPUTexture *depth;
   struct GPUTexture *depth_in_front;
 } DefaultTextureList;
diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c
index 69837a6c22a..c5dfe829ec9 100644
--- a/source/blender/draw/engines/overlay/overlay_antialiasing.c
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -112,7 +112,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_STATE_BLEND_ALPHA_PREMUL);
+    DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR);
 
     sh = OVERLAY_shader_antialiasing();
     grp = DRW_shgroup_create(sh, psl->antialiasing_ps);
@@ -180,9 +180,7 @@ void OVERLAY_antialiasing_end(OVERLAY_Data *vedata)
   DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
   if (pd->antialiasing.enabled) {
-    GPU_framebuffer_bind(dfbl->color_only_fb);
+    GPU_framebuffer_bind(dfbl->overlay_only_fb);
     DRW_draw_pass(psl->antialiasing_ps);
-
-    GPU_framebuffer_bind(dfbl->default_fb);
   }
 }
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 4921132e83b..b83bb7c2c32 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -137,15 +137,16 @@ 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 *overlay_fb;
   struct GPUFrameBuffer *in_front_fb;
   struct GPUFrameBuffer *color_only_fb;
   struct GPUFrameBuffer *depth_only_fb;
+  struct GPUFrameBuffer *overlay_only_fb;
 } DefaultFramebufferList;
 
 typedef struct DefaultTextureList {
   struct GPUTexture *color;
-  struct GPUTexture *color_display_space;
+  struct GPUTexture *color_overlay;
   struct GPUTexture *depth;
   struct GPUTexture *depth_in_front;
 } DefaultTextureList;
diff --git a/source/blender/draw/intern/draw_color_management.c b/source/blender/draw/intern/draw_color_management.c
index 933fca95190..33000d1ecd0 100644
--- a/source/blender/draw/intern/draw_color_management.c
+++ b/source/blender/draw/intern/draw_color_management.c
@@ -60,102 +60,4 @@ void DRW_transform_none(GPUTexture *tex)
   GPU_texture_unbind(tex);
 }
 
-/* Use color management profile to draw texture to framebuffer */
-static void drw_colorspace_transform(GPUTexture *tex,
-                                     ColorManagedViewSettings *view_settings,
-                                     ColorManagedDisplaySettings *display_settings,
-                                     float dither)
-{
-  drw_state_set(DRW_STATE_WRITE_COLOR);
-
-  GPUBatch *geom = DRW_cache_fullscreen_quad_get();
-
-  bool use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
-      view_settings, display_settings, NULL, dither, false);
-
-  GPU_matrix_identity_set();
-  GPU_matrix_identity_projection_set();
-
-  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);
-}
-
-void DRW_transform_to_display_linear(void)
-{
-  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-  Scene *scene = DST.draw_ctx.scene;
-  View3D *v3d = DST.draw_ctx.v3d;
-  ColorManagedDisplaySettings *display_settings = &scene->display_settings;
-  ColorManagedViewSettings view_settings;
-  float dither = 0.0f;
-
-  /* TODO make it match old behavior. */
-  bool use_render_settings = v3d && (v3d->shading.type == OB_RENDER);
-  bool use_view_transform = v3d && (v3d->shading.type >= OB_MATERIAL);
-
-  /* TODO What ocio settings do we need here? */
-  if (use_render_settings) {
-    /* Use full render settings, for renders with scene lighting. */
-    view_settings = scene->view_settings;
-    dither = scene->r.dither_intensity;
-  }
-  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);
-    dither = scene->r.dither_intensity;
-  }
-  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);
-  }
-
-  if (DRW_state_do_color_management()) {
-    GPU_framebuffer_bind(dfbl->default_display_fb);
-    drw_colorspace_transform(dtxl->color, &view_settings, display_settings, dither);
-
-    /* Copy back to default framebuffer. */
-    /* TODO get rid of this hack. */
-    GPU_framebuffer_bind(dfbl->default_fb);
-    DRW_transform_none(dtxl->color_display_space);
-  }
-}
-
-void DRW_transform_to_display_encoded(void)
-{
-  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-
-#if 1 /* TODO Placeholder code. */
-  GPU_framebuffer_bind(dfbl->default_display_fb);
-  DRW_transform_none(dtxl->color);
-#else
-  /* TODO What ocio settings do we need here? */
-  GPU_framebuffer_bind(dfbl->default_display_fb);
-  drw_colorspace_transform(dtxl->color, &view_settings, display_settings, dither);
-#endif
-}
-
 /** \} */
diff --git a/source/blender/draw/intern/draw_color_management.h b/source/blender/draw/intern/draw_color_management.h
index 55c4b27e403..9d83eccdce9 100644
--- a/source/blender/draw/intern/draw_color_management.h
+++ b/source/blender/draw/intern/draw_color_management.h
@@ -24,7 +24,5 @@
 #define __DRAW_COLOR_MANAGEMENT_H__
 
 void DRW_transform_none(struct GPUTexture *tex);
-void DRW_transform_to_display_linear(void);
-void DRW_transform_to_display_encoded(void);
 
 #endif /* __DRAW_COLOR_MANAGEMENT_H__ */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index e88d4f70311..3750a1d7627 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -236,6 +236,48 @@ struct DupliObject *DRW_object_get_dupli(const Object *UNUSED(ob))
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Color Management
+ * \{ */
+
+static void drw_viewport_colormanagement_set(void)
+{
+  Scene *scene = DST.draw_ctx.scene;
+  View3D *v3d = DST.draw_ctx.v3d;
+
+  ColorManagedDisplaySettings *display_settings = &scene->display_settings;
+  ColorManagedViewSettings view_settings;
+  float dither = 0.0f;
+
+  /* TODO make it match old behavior. */
+  bool use_render_settings = v3d && (v3d->shading.type == OB_RENDER);
+  bool use_view_transform = v3d && (v3d->shading.type >= OB_MATERIAL);
+
+  /* TODO What ocio settings do we need here? */
+  if (use_render_settings) {
+    /* Use full render settings, for renders with scene lighting. */
+    view_settings = scene->view_settings;
+    dither = scene->r.dither_intensity;
+  }
+  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);
+    dither = scene->r.dither_intensity;
+  }
+  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);
+  }
+
+  GPU_viewport_colorspace_set(DST.viewport, &view_settings, display_settings, dither);
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Viewport (DRW_viewport)
  * \{ */
@@ -1254,8 +1296,15 @@ void DRW_draw_callbacks_post_scene(void)
                                ((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0));
 
   if (DST.draw_ctx.evil_C) {
+    DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+
     DRW_state_reset();
 
+    GPU_framebuffer_bind(dfbl->overlay_fb);
+    /* Disable sRGB encoding from the fixed function pipeline since all the drawing in this
+     * function is done with sRGB color. Avoid double transform. */
+    glDisable(GL_FRAMEBUFFER_SRGB);
+
     /* annotations - temporary drawing buffer (3d space) */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list