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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs