[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