[Bf-blender-cvs] [babd96b6776] temp-viewport-compositor-compiler: Viewport Compositor: Add type implicit conversion
Omar Emara
noreply at git.blender.org
Fri Feb 18 21:16:37 CET 2022
Commit: babd96b67768cc775ceca8868e02bae82ad8b419
Author: Omar Emara
Date: Fri Feb 18 22:11:23 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rBbabd96b67768cc775ceca8868e02bae82ad8b419
Viewport Compositor: Add type implicit conversion
This patch adds support for implicit conversion between types. This is
done by emitting a meta operation that performs the conversion
transparently before the node operation gets its input results.
===================================================================
M source/blender/gpu/CMakeLists.txt
A source/blender/gpu/shaders/compositor/compositor_convert_color_to_float.glsl
A source/blender/gpu/shaders/compositor/compositor_convert_float_to_color.glsl
A source/blender/gpu/shaders/compositor/compositor_convert_vector_to_color.glsl
A source/blender/gpu/shaders/compositor/infos/compositor_convert_color_to_float_info.hh
A source/blender/gpu/shaders/compositor/infos/compositor_convert_float_to_color_info.hh
A source/blender/gpu/shaders/compositor/infos/compositor_convert_vector_to_color_info.hh
M source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
M source/blender/nodes/NOD_compositor_execute.hh
M source/blender/nodes/intern/node_compositor_execute.cc
===================================================================
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 669657c3b9e..48845ecbd77 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -308,6 +308,9 @@ set(GLSL_SRC
shaders/compositor/material/gpu_shader_compositor_set_alpha.glsl
shaders/compositor/material/gpu_shader_compositor_split_viewer.glsl
+ shaders/compositor/compositor_convert_color_to_float.glsl
+ shaders/compositor/compositor_convert_float_to_color.glsl
+ shaders/compositor/compositor_convert_vector_to_color.glsl
shaders/compositor/sampler2D_to_RGBA16F_2D_image.glsl
shaders/material/gpu_shader_material_add_shader.glsl
@@ -490,6 +493,9 @@ set(SHADER_CREATE_INFOS
shaders/infos/gpu_shader_text_info.hh
shaders/infos/gpu_srgb_to_framebuffer_space_info.hh
+ shaders/compositor/infos/compositor_convert_color_to_float_info.hh
+ shaders/compositor/infos/compositor_convert_float_to_color_info.hh
+ shaders/compositor/infos/compositor_convert_vector_to_color_info.hh
shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
)
diff --git a/source/blender/gpu/shaders/compositor/compositor_convert_color_to_float.glsl b/source/blender/gpu/shaders/compositor/compositor_convert_color_to_float.glsl
new file mode 100644
index 00000000000..27b0b9a231c
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/compositor_convert_color_to_float.glsl
@@ -0,0 +1,9 @@
+/* Store the average of the input's three color channels in the output, the alpha channel is
+ * ignored. */
+
+void main()
+{
+ ivec2 xy = ivec2(gl_GlobalInvocationID.xy);
+ vec4 color = texelFetch(input_sampler, xy, 0);
+ imageStore(output_image, xy, vec4((color.r + color.g + color.b) / 3.0));
+}
diff --git a/source/blender/gpu/shaders/compositor/compositor_convert_float_to_color.glsl b/source/blender/gpu/shaders/compositor/compositor_convert_float_to_color.glsl
new file mode 100644
index 00000000000..2983a8abadd
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/compositor_convert_float_to_color.glsl
@@ -0,0 +1,7 @@
+/* Fill all three color channels of the output with the input and set the alpha channel to 1. */
+
+void main()
+{
+ ivec2 xy = ivec2(gl_GlobalInvocationID.xy);
+ imageStore(output_image, xy, vec4(texelFetch(input_sampler, xy, 0).xxx, 1.0));
+}
diff --git a/source/blender/gpu/shaders/compositor/compositor_convert_vector_to_color.glsl b/source/blender/gpu/shaders/compositor/compositor_convert_vector_to_color.glsl
new file mode 100644
index 00000000000..bcfad9f3e67
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/compositor_convert_vector_to_color.glsl
@@ -0,0 +1,8 @@
+/* Copy the three vector components of the input to the three color channels of the output and set
+ * the alpha channel to 1. */
+
+void main()
+{
+ ivec2 xy = ivec2(gl_GlobalInvocationID.xy);
+ imageStore(output_image, xy, vec4(texelFetch(input_sampler, xy, 0).xyz, 1.0));
+}
diff --git a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh b/source/blender/gpu/shaders/compositor/infos/compositor_convert_color_to_float_info.hh
similarity index 75%
copy from source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
copy to source/blender/gpu/shaders/compositor/infos/compositor_convert_color_to_float_info.hh
index b1ef8432801..89c921896bb 100644
--- a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
+++ b/source/blender/gpu/shaders/compositor/infos/compositor_convert_color_to_float_info.hh
@@ -17,15 +17,11 @@
* All rights reserved.
*/
-/** \file
- * \ingroup gpu
- */
-
#include "gpu_shader_create_info.hh"
-GPU_SHADER_CREATE_INFO(sampler2D_to_RGBA16F_2D_image)
+GPU_SHADER_CREATE_INFO(compositor_convert_color_to_float)
.local_group_size(16, 16)
- .sampler(0, ImageType::FLOAT_2D, "input_sampler", Frequency::PASS)
- .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image")
- .compute_source("sampler2D_to_RGBA16F_2D_image.glsl")
+ .sampler(0, ImageType::FLOAT_2D, "input_sampler")
+ .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image")
+ .compute_source("compositor_convert_color_to_float.glsl")
.do_static_compilation(true);
diff --git a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh b/source/blender/gpu/shaders/compositor/infos/compositor_convert_float_to_color_info.hh
similarity index 82%
copy from source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
copy to source/blender/gpu/shaders/compositor/infos/compositor_convert_float_to_color_info.hh
index b1ef8432801..62bf2be1493 100644
--- a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
+++ b/source/blender/gpu/shaders/compositor/infos/compositor_convert_float_to_color_info.hh
@@ -17,15 +17,11 @@
* All rights reserved.
*/
-/** \file
- * \ingroup gpu
- */
-
#include "gpu_shader_create_info.hh"
-GPU_SHADER_CREATE_INFO(sampler2D_to_RGBA16F_2D_image)
+GPU_SHADER_CREATE_INFO(compositor_convert_float_to_color)
.local_group_size(16, 16)
- .sampler(0, ImageType::FLOAT_2D, "input_sampler", Frequency::PASS)
+ .sampler(0, ImageType::FLOAT_2D, "input_sampler")
.image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image")
- .compute_source("sampler2D_to_RGBA16F_2D_image.glsl")
+ .compute_source("compositor_convert_float_to_color.glsl")
.do_static_compilation(true);
diff --git a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh b/source/blender/gpu/shaders/compositor/infos/compositor_convert_vector_to_color_info.hh
similarity index 82%
copy from source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
copy to source/blender/gpu/shaders/compositor/infos/compositor_convert_vector_to_color_info.hh
index b1ef8432801..25b53b4cc64 100644
--- a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
+++ b/source/blender/gpu/shaders/compositor/infos/compositor_convert_vector_to_color_info.hh
@@ -17,15 +17,11 @@
* All rights reserved.
*/
-/** \file
- * \ingroup gpu
- */
-
#include "gpu_shader_create_info.hh"
-GPU_SHADER_CREATE_INFO(sampler2D_to_RGBA16F_2D_image)
+GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_color)
.local_group_size(16, 16)
- .sampler(0, ImageType::FLOAT_2D, "input_sampler", Frequency::PASS)
+ .sampler(0, ImageType::FLOAT_2D, "input_sampler")
.image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image")
- .compute_source("sampler2D_to_RGBA16F_2D_image.glsl")
+ .compute_source("compositor_convert_vector_to_color.glsl")
.do_static_compilation(true);
diff --git a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh b/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
index b1ef8432801..e5a188b2e1b 100644
--- a/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
+++ b/source/blender/gpu/shaders/compositor/infos/sampler2D_to_RGBA16F_2D_image_info.hh
@@ -17,15 +17,11 @@
* All rights reserved.
*/
-/** \file
- * \ingroup gpu
- */
-
#include "gpu_shader_create_info.hh"
GPU_SHADER_CREATE_INFO(sampler2D_to_RGBA16F_2D_image)
.local_group_size(16, 16)
- .sampler(0, ImageType::FLOAT_2D, "input_sampler", Frequency::PASS)
+ .sampler(0, ImageType::FLOAT_2D, "input_sampler")
.image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_image")
.compute_source("sampler2D_to_RGBA16F_2D_image.glsl")
.do_static_compilation(true);
diff --git a/source/blender/nodes/NOD_compositor_execute.hh b/source/blender/nodes/NOD_compositor_execute.hh
index 0757a815e41..26508fe674d 100644
--- a/source/blender/nodes/NOD_compositor_execute.hh
+++ b/source/blender/nodes/NOD_compositor_execute.hh
@@ -25,12 +25,25 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
+#include "GPU_shader.h"
#include "GPU_texture.h"
#include "NOD_derived_node_tree.hh"
namespace blender::viewport_compositor {
+/* --------------------------------------------------------------------
+ * Result Type.
+ */
+
+/* Possible data types that operations can operate on. They either represent the base type of the
+ * result texture or a single value result. */
+enum class ResultType : uint8_t {
+ Float,
+ Vector,
+ Color,
+};
+
/* --------------------------------------------------------------------
* Texture Pool.
*/
@@ -68,12 +81,17 @@ class TexturePool {
/* Shorthand for acquire with GPU_RGBA16F format. */
GPUTexture *acquire_color(int width, int height);
- /* Shorthand for acquire with GPU_RGB16F format. */
+ /* Shorthand for acquire with GPU_RGBA16F format. Identical to acquire_color because vector
+ * textures are and should internally be stored in RGBA textures. */
GPUTexture *acquire_vector(int width, int height);
/* Shorthand for acquire with GPU_R16F format. */
GPUTexture *acquire_float(int width, int height);
+ /* Shorthand for acquire_[color|vector|float], whichever is appropriate for the given result
+ * type. */
+ GPUTexture *acquire(int width, int height, ResultType type);
+
/* Decrement the reference count of the texture and put it back into the pool if its reference
* count reaches one, potentially to be acquired later by another user. Notice that the texture
* is release when the texture reference count reaches one, not zero, because the texture pool is
@@ -118,14 +136,6 @@ class Context {
* Result.
*/
-/* Possible data types that operations can operate on. They either represent the base type of the
- * result texture or a single value result. */
-enum class ResultType : uint8_t {
- Float,
- Vector,
- Color,
-};
-
/* A class that describes the result of an operation. An operator can have multiple results
* corresponding to multiple outputs. A result either represents a single value or a texture. */
class Result {
@@ -260,7 +270,7 @@ class NodeOperation : public Operation {
* example. */
class MetaOperation : public Operation {
public:
- MetaOperation(Context &context);
+ using Operation::Operati
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list