Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2019-05-21 13:00:48 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2019-05-31 13:44:18 +0300
commit23064248d7a08d01061e108972985a11997f046c (patch)
treee64356ca66a809b64b716bca535fb09e86dbaaa4 /source/blender
parentd0fb602e2c365025131c782c1bc9b7d60013a678 (diff)
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
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.c5
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_aa.c10
-rw-r--r--source/blender/draw/intern/DRW_render.h1
-rw-r--r--source/blender/draw/intern/draw_common.c2
-rw-r--r--source/blender/draw/intern/draw_manager.c18
-rw-r--r--source/blender/draw/intern/draw_manager.h1
6 files changed, 24 insertions, 13 deletions
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);
@@ -2987,6 +2987,14 @@ bool DRW_state_is_image_render(void)
}
/**
+ * 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;