[Bf-blender-cvs] [9717f4fabd6] temp-viewport-compositor-compiler: Viewport Compositor: Add execute function interface
Omar Emara
noreply at git.blender.org
Fri Feb 4 18:10:13 CET 2022
Commit: 9717f4fabd68c94a945bbcf79210a3d6138e6d14
Author: Omar Emara
Date: Fri Feb 4 18:40:50 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rB9717f4fabd68c94a945bbcf79210a3d6138e6d14
Viewport Compositor: Add execute function interface
This patch proposes an initial interface for the compositor execute
function of nodes, as well as an engine implementation for the needed
context functionalities.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/draw/engines/compositor/compositor_engine.cc
M source/blender/nodes/CMakeLists.txt
A source/blender/nodes/NOD_compositor_execute.hh
M source/blender/nodes/composite/node_composite_util.hh
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 16d8ba2e6dd..87e204e1c27 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -116,6 +116,7 @@ typedef struct bNodeSocketTemplate {
#ifdef __cplusplus
namespace blender {
namespace nodes {
+class CompositorContext;
class NodeMultiFunctionBuilder;
class GeoNodeExecParams;
class NodeDeclarationBuilder;
@@ -128,6 +129,7 @@ class MFDataType;
} // namespace blender
using CPPTypeHandle = blender::fn::CPPType;
+using NodeCompositorExecuteFunction = void (*)(blender::nodes::CompositorContext &context);
using NodeMultiFunctionBuildFunction = void (*)(blender::nodes::NodeMultiFunctionBuilder &builder);
using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params);
using NodeDeclareFunction = void (*)(blender::nodes::NodeDeclarationBuilder &builder);
@@ -140,6 +142,7 @@ using NodeGatherSocketLinkOperationsFunction =
void (*)(blender::nodes::GatherLinkSearchOpParams ¶ms);
#else
+typedef void *NodeCompositorExecuteFunction;
typedef void *NodeMultiFunctionBuildFunction;
typedef void *NodeGeometryExecFunction;
typedef void *NodeDeclareFunction;
@@ -322,6 +325,9 @@ typedef struct bNodeType {
/* gpu */
NodeGPUExecFunction gpu_fn;
+ /* Execute a compositor node. */
+ NodeCompositorExecuteFunction compositor_execute;
+
/* Build a multi-function for this node. */
NodeMultiFunctionBuildFunction build_multi_function;
diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc
index c2f5dd62de1..4892204c84b 100644
--- a/source/blender/draw/engines/compositor/compositor_engine.cc
+++ b/source/blender/draw/engines/compositor/compositor_engine.cc
@@ -25,22 +25,76 @@
#include "DRW_render.h"
#include "BLI_map.hh"
+#include "BLI_string_ref.hh"
#include "BLI_utildefines.h"
#include "BLI_vector.hh"
#include "BLI_vector_set.hh"
#include "DNA_node_types.h"
+#include "DNA_scene_types.h"
+
+#include "GPU_texture.h"
#include "IMB_colormanagement.h"
+#include "NOD_compositor_execute.hh"
#include "NOD_derived_node_tree.hh"
#include "compositor_shader.hh"
namespace blender::compositor {
+using nodes::CompositorContext;
using namespace nodes::derived_node_tree_types;
+class DRWCompositorContext : public CompositorContext {
+ private:
+ /* The node currently being executed. */
+ DNode node_;
+ /* A map associating output sockets with the textures storing their contents. The map only stores
+ * the textures that were already computed by a dependency node and are still needed by one or
+ * more dependent nodes, so the node currently executing can get its inputs and outputs from this
+ * member. See get_input_texture and get_output_texture. */
+ const Map<DSocket, GPUTexture *> &allocated_textures_;
+
+ public:
+ DRWCompositorContext(DNode node, const Map<DSocket, GPUTexture *> &allocated_textures)
+ : node_(node), allocated_textures_(allocated_textures)
+ {
+ }
+
+ const GPUTexture *get_input_texture(StringRef identifier) override
+ {
+ /* Find the output socket connected to the input with the given input identifier and return its
+ * allocated texture. If the input is not linked, return nullptr. */
+ GPUTexture *texture = nullptr;
+ node_.input_by_identifier(identifier).foreach_origin_socket([&](const DSocket origin) {
+ texture = allocated_textures_.lookup(origin);
+ });
+ return texture;
+ }
+
+ const GPUTexture *get_output_texture(StringRef identifier) override
+ {
+ return allocated_textures_.lookup(node_.output_by_identifier(identifier));
+ }
+
+ const GPUTexture *get_viewport_texture() override
+ {
+ return DRW_viewport_texture_list_get()->color;
+ }
+
+ const GPUTexture *get_pass_texture(int view_layer, eScenePassType pass_type) override
+ {
+ return DRW_render_pass_find(DRW_context_state_get()->scene, view_layer, pass_type)->pass_tx;
+ }
+
+ const bNode &node() override
+ {
+ return *node_->bnode();
+ }
+};
+
class Compiler {
public:
private:
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index c3a41a1650b..ad47ddd0106 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -72,6 +72,7 @@ set(SRC
NOD_common.h
NOD_composite.h
+ NOD_compositor_execute.hh
NOD_derived_node_tree.hh
NOD_function.h
NOD_geometry.h
diff --git a/source/blender/nodes/NOD_compositor_execute.hh b/source/blender/nodes/NOD_compositor_execute.hh
new file mode 100644
index 00000000000..c76c6aa5772
--- /dev/null
+++ b/source/blender/nodes/NOD_compositor_execute.hh
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "BLI_string_ref.hh"
+
+#include "DNA_node_types.h"
+#include "DNA_scene_types.h"
+
+#include "GPU_texture.h"
+
+namespace blender::nodes {
+
+/* This abstract class is passed to the execution function of the compositor. The compositor engine
+ * should implement it to provide the necessary functionality needed by the currently execuing
+ * node. */
+class CompositorContext {
+ public:
+ /* Get the input texture for the input socket with the given identifier. Returns nullptr if the
+ * socket is not linked. */
+ virtual const GPUTexture *get_input_texture(StringRef identifier) = 0;
+
+ /* Get the output texture for the output socket with the given identifier. */
+ virtual const GPUTexture *get_output_texture(StringRef identifier) = 0;
+
+ /* Get the texture representing the viewport where the result of the compositor should be
+ * written. This should be called by output nodes to get their target texture. */
+ virtual const GPUTexture *get_viewport_texture() = 0;
+
+ /* Get the texture where the given render pass is stored. This should be called by the Render
+ * Layer node to populate its outputs. */
+ virtual const GPUTexture *get_pass_texture(int view_layer, eScenePassType pass_type) = 0;
+
+ /* Get the node currently being executed. */
+ virtual const bNode &node() = 0;
+};
+
+} // namespace blender::nodes
diff --git a/source/blender/nodes/composite/node_composite_util.hh b/source/blender/nodes/composite/node_composite_util.hh
index 2a479034263..27a18592ebb 100644
--- a/source/blender/nodes/composite/node_composite_util.hh
+++ b/source/blender/nodes/composite/node_composite_util.hh
@@ -45,6 +45,7 @@
#include "RE_pipeline.h"
#include "NOD_composite.h"
+#include "NOD_compositor_execute.hh"
#include "NOD_socket.h"
#include "NOD_socket_declarations.hh"
More information about the Bf-blender-cvs
mailing list