[Bf-blender-cvs] [65272b80e4d] viewport-compositor: Viewport Compositor: Add a UBO for the compositor

Omar Emara noreply at git.blender.org
Thu Jan 6 17:29:42 CET 2022


Commit: 65272b80e4d9bbea62031e319726bf8405f80b51
Author: Omar Emara
Date:   Mon Jan 3 22:40:34 2022 +0200
Branches: viewport-compositor
https://developer.blender.org/rB65272b80e4d9bbea62031e319726bf8405f80b51

Viewport Compositor: Add a UBO for the compositor

This patch adds a new dedicated UBO for compositor shaders. The
FrameNumber UBO member was moved to the new UBO. Additionally, the OCIO
luminance coefficients were added to the UBO for utilization by various
compositor operations.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/compositor/compositor_engine.cc
M	source/blender/draw/engines/compositor/compositor_shader.cc
M	source/blender/draw/engines/compositor/shaders/compositor_frag.glsl
A	source/blender/draw/engines/compositor/shaders/compositor_lib.glsl
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/shaders/common_view_lib.glsl
M	source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
M	source/blender/gpu/shaders/composite/gpu_shader_composite_color_correction.glsl
M	source/blender/gpu/shaders/composite/gpu_shader_composite_color_to_luminance.glsl
M	source/blender/gpu/shaders/composite/gpu_shader_composite_luminance_matte.glsl
M	source/blender/nodes/composite/nodes/node_composite_colorcorrection.cc
M	source/blender/nodes/composite/nodes/node_composite_lummaMatte.cc
M	source/blender/nodes/composite/nodes/node_composite_valToRgb.cc

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1121a747847..b64022d54a9 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -240,6 +240,7 @@ set(LIB
 )
 
 data_to_c_simple(engines/compositor/shaders/compositor_frag.glsl SRC)
+data_to_c_simple(engines/compositor/shaders/compositor_lib.glsl SRC)
 data_to_c_simple(engines/compositor/shaders/compositor_nodetree_eval_lib.glsl SRC)
 
 data_to_c_simple(engines/eevee/shaders/eevee_bsdf_lib.glsl SRC)
diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc
index 2d77316ca68..bca0fc98a25 100644
--- a/source/blender/draw/engines/compositor/compositor_engine.cc
+++ b/source/blender/draw/engines/compositor/compositor_engine.cc
@@ -24,10 +24,22 @@
 
 #include "DRW_render.h"
 
+#include "BLI_assert.h"
+
+#include "IMB_colormanagement.h"
+
 #include "compositor_shader.hh"
 
 namespace blender::compositor {
 
+/* Keep in sync with CompositorData in compositor_lib.glsl. */
+typedef struct CompositorData {
+  float luminance_coefficients[3];
+  float frame_number;
+} CompositorData;
+
+BLI_STATIC_ASSERT_ALIGN(CompositorData, 16)
+
 static ShaderModule *g_shader_module = nullptr;
 
 class Instance {
@@ -37,6 +49,8 @@ class Instance {
  private:
   /** TODO(fclem) multipass. */
   DRWPass *pass_;
+  /** A UBO storing CompositorData. */
+  GPUUniformBuf *ubo_;
   GPUMaterial *gpumat_;
   /** Temp buffers to hold intermediate results or the input color. */
   GPUTexture *tmp_buffer_ = nullptr;
@@ -45,9 +59,14 @@ class Instance {
   bool enabled_;
 
  public:
-  Instance(ShaderModule &shader_module) : shaders(shader_module){};
+  Instance(ShaderModule &shader_module) : shaders(shader_module)
+  {
+    ubo_ = GPU_uniformbuf_create_ex(sizeof(CompositorData), &ubo_, "CompositorData");
+  };
+
   ~Instance()
   {
+    GPU_uniformbuf_free(ubo_);
     GPU_FRAMEBUFFER_FREE_SAFE(tmp_fb_);
   }
 
@@ -90,6 +109,8 @@ class Instance {
     pass_ = DRW_pass_create("Compositing", DRW_STATE_WRITE_COLOR);
     DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat_, pass_);
 
+    sync_compositor_ubo(grp);
+
     ListBase rpasses = GPU_material_render_passes(gpumat_);
     LISTBASE_FOREACH (GPUMaterialRenderPass *, gpu_rp, &rpasses) {
       DRWRenderPass *drw_rp = DRW_render_pass_find(
@@ -121,6 +142,17 @@ class Instance {
      * This is because dtxl->color can also be an input to the compositor. */
     GPU_texture_copy(dtxl->color, tmp_buffer_);
   }
+
+ private:
+  void sync_compositor_ubo(DRWShadingGroup *shading_group)
+  {
+    CompositorData compositor_data;
+    IMB_colormanagement_get_luminance_coefficients(compositor_data.luminance_coefficients);
+    compositor_data.frame_number = (float)DRW_context_state_get()->scene->r.cfra;
+
+    GPU_uniformbuf_update(ubo_, &compositor_data);
+    DRW_shgroup_uniform_block(shading_group, "compositor_block", ubo_);
+  }
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/draw/engines/compositor/compositor_shader.cc b/source/blender/draw/engines/compositor/compositor_shader.cc
index 9c1a8601062..3db6bdee6e8 100644
--- a/source/blender/draw/engines/compositor/compositor_shader.cc
+++ b/source/blender/draw/engines/compositor/compositor_shader.cc
@@ -28,6 +28,7 @@ extern char datatoc_common_fullscreen_vert_glsl[];
 extern char datatoc_common_math_lib_glsl[];
 extern char datatoc_common_view_lib_glsl[];
 extern char datatoc_compositor_frag_glsl[];
+extern char datatoc_compositor_lib_glsl[];
 extern char datatoc_compositor_nodetree_eval_lib_glsl[];
 extern char datatoc_gpu_shader_codegen_lib_glsl[];
 }
@@ -38,6 +39,7 @@ ShaderModule::ShaderModule()
 {
   shader_lib_ = DRW_shader_library_create();
   /* NOTE: These need to be ordered by dependencies. */
+  DRW_SHADER_LIB_ADD(shader_lib_, compositor_lib);
   DRW_SHADER_LIB_ADD(shader_lib_, common_math_lib);
   DRW_SHADER_LIB_ADD(shader_lib_, common_view_lib);
   DRW_SHADER_LIB_ADD(shader_lib_, gpu_shader_codegen_lib);
@@ -102,4 +104,4 @@ GPUMaterial *ShaderModule::material_get(Scene *scene)
   return DRW_shader_from_compositor(scene, shader_id, true, codegen_callback, this);
 }
 
-}  // namespace blender::compositor
\ No newline at end of file
+}  // namespace blender::compositor
diff --git a/source/blender/draw/engines/compositor/shaders/compositor_frag.glsl b/source/blender/draw/engines/compositor/shaders/compositor_frag.glsl
index 49719c72282..a260d81304a 100644
--- a/source/blender/draw/engines/compositor/shaders/compositor_frag.glsl
+++ b/source/blender/draw/engines/compositor/shaders/compositor_frag.glsl
@@ -1,4 +1,5 @@
 
+#pragma BLENDER_REQUIRE(compositor_lib.glsl)
 #pragma BLENDER_REQUIRE(common_view_lib.glsl)
 #pragma BLENDER_REQUIRE(compositor_nodetree_eval_lib.glsl)
 
@@ -12,4 +13,4 @@ void main()
   g_data.uv_texco = uvcoordsvar.xy * CameraTexCoFactors.xy + CameraTexCoFactors.zw;
 
   out_color = nodetree_composite();
-}
\ No newline at end of file
+}
diff --git a/source/blender/draw/engines/compositor/shaders/compositor_lib.glsl b/source/blender/draw/engines/compositor/shaders/compositor_lib.glsl
new file mode 100644
index 00000000000..9cc75079368
--- /dev/null
+++ b/source/blender/draw/engines/compositor/shaders/compositor_lib.glsl
@@ -0,0 +1,10 @@
+/* Keep in sync with CompositorData in compositor_engine.cc. */
+struct CompositorData {
+  vec3 luminance_coefficients;
+  float frame_number;
+};
+
+layout(std140) uniform compositor_block
+{
+  CompositorData compositor_data;
+};
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 4718064b9fe..de7c39e762d 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -413,10 +413,6 @@ typedef struct DRWViewUboStorage {
   float viewcamtexcofac[4];
   float viewport_size[2];
   float viewport_size_inv[2];
-
-  float frame_number;
-
-  float _pad[3];
 } DRWViewUboStorage;
 
 BLI_STATIC_ASSERT_ALIGN(DRWViewUboStorage, 16)
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index d121adf226b..53ac49ac54b 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1084,8 +1084,6 @@ static void drw_update_view(const float viewport_size[2])
   copy_v2_v2(storage->viewport_size_inv, viewport_size);
   invert_v2(storage->viewport_size_inv);
 
-  storage->frame_number = (float)DST.draw_ctx.scene->r.cfra;
-
   /* TODO(fclem): update a big UBO and only bind ranges here. */
   GPU_uniformbuf_update(G_draw.view_ubo, &DST.view_active->storage);
 
diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl
index 25ee02a1a60..1e64a43349b 100644
--- a/source/blender/draw/intern/shaders/common_view_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_view_lib.glsl
@@ -22,10 +22,6 @@ layout(std140) uniform viewBlock
   vec4 CameraTexCoFactors;
   vec2 ViewportSize;
   vec2 ViewportSizeInverse;
-
-  float FrameNumber;
-
-  float ViewBlockPad1, ViewBlockPad2, ViewBlockPad3;
 };
 
 #define ViewNear (ViewVecs[0].w)
diff --git a/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
index 80074b440a9..69b0ba1a0f7 100644
--- a/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
+++ b/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
@@ -214,7 +214,7 @@ void curves_time(sampler1DArray curve_map,
                  float end_frame,
                  out float result)
 {
-  float normalized_time = (FrameNumber - start_frame) / (end_frame - start_frame);
+  float normalized_time = (compositor_data.frame_number - start_frame) / (end_frame - start_frame);
 
   /* Evaluate the normalized time on the first curve map. */
   float parameter = NORMALIZE_PARAMETER(normalized_time, range_minimum, range_divider);
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_color_correction.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_correction.glsl
index 00beddf6e1b..aece8642aff 100644
--- a/source/blender/gpu/shaders/composite/gpu_shader_composite_color_correction.glsl
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_correction.glsl
@@ -1,7 +1,6 @@
 void node_composite_color_correction(vec4 color,
                                      float mask,
                                      const vec3 enabled_channels,
-                                     const vec3 luminance_coefficients,
                                      float start_midtones,
                                      float end_midtones,
                                      float master_saturation,
@@ -72,7 +71,7 @@ void node_composite_color_correction(vec4 color,
   lift += master_lift;
 
   float inverse_gamma = 1.0 / gamma;
-  float luma = get_luminance(color.rgb, luminance_coefficients);
+  float luma = get_luminance(color.rgb, compositor_data.luminance_coefficients);
 
   vec3 corrected = luma + saturation * (color.rgb - luma);
   corrected = 0.5 + (corrected - 0.5) * contrast;
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_color_to_luminance.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_to_luminance.glsl
index d51d09db1e5..5c402d86dfd 100644
--- a/source/blender/gpu/shaders/composite/gpu_shader_composite_color_to_luminance.glsl
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_to_luminance.glsl
@@ -1,4 +1,4 @@
-void color_to_luminance(vec4 color, const vec3 luminance_coefficients, out float result)
+void color_to_luminance(vec4 color, out float result)
 {
-  result = get_luminance(color.rgb, luminance_coefficients);
+  result = get_luminance(color.rgb, compositor_data.luminance_coefficients);
 }
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_luminance_matte.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_luminance_matte.glsl
index 1e5ed0f064d..c594b0234cb 100644
--- a/source/blender/gpu/shaders/composite/gpu_shader_composite_lumin

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list