[Bf-blender-cvs] [b96035aabdd] temp-viewport-compositor-compiler: Viewport Compositor: Move GPU material node to its own file
Omar Emara
noreply at git.blender.org
Mon Apr 11 11:16:09 CEST 2022
Commit: b96035aabdd46f6d1c99eee310a215a1fef8ac7d
Author: Omar Emara
Date: Mon Apr 11 09:44:27 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rBb96035aabdd46f6d1c99eee310a215a1fef8ac7d
Viewport Compositor: Move GPU material node to its own file
===================================================================
M source/blender/viewport_compositor/CMakeLists.txt
M source/blender/viewport_compositor/VPC_compositor_execute.hh
A source/blender/viewport_compositor/VPC_gpu_material_node.hh
M source/blender/viewport_compositor/intern/compositor_execute.cc
A source/blender/viewport_compositor/intern/gpu_material_node.cc
===================================================================
diff --git a/source/blender/viewport_compositor/CMakeLists.txt b/source/blender/viewport_compositor/CMakeLists.txt
index 58cf7567d83..19ddb3e2141 100644
--- a/source/blender/viewport_compositor/CMakeLists.txt
+++ b/source/blender/viewport_compositor/CMakeLists.txt
@@ -20,6 +20,7 @@ set(SRC
intern/context.cc
intern/conversion_processor_operation.cc
intern/domain.cc
+ intern/gpu_material_node.cc
intern/node_operation.cc
intern/operation.cc
intern/processor_operation.cc
@@ -34,6 +35,7 @@ set(SRC
VPC_context.hh
VPC_conversion_processor_operation.hh
VPC_domain.hh
+ VPC_gpu_material_node.hh
VPC_input_descriptor.hh
VPC_node_operation.hh
VPC_operation.hh
diff --git a/source/blender/viewport_compositor/VPC_compositor_execute.hh b/source/blender/viewport_compositor/VPC_compositor_execute.hh
index b0c37017db1..76748ccf67d 100644
--- a/source/blender/viewport_compositor/VPC_compositor_execute.hh
+++ b/source/blender/viewport_compositor/VPC_compositor_execute.hh
@@ -23,6 +23,7 @@
#include "VPC_context.hh"
#include "VPC_domain.hh"
+#include "VPC_gpu_material_node.hh"
#include "VPC_node_operation.hh"
#include "VPC_operation.hh"
#include "VPC_result.hh"
@@ -33,57 +34,6 @@ namespace blender::viewport_compositor {
using namespace nodes::derived_node_tree_types;
-/* --------------------------------------------------------------------
- * GPU Material Node.
- */
-
-/* A class that represents a node in a GPU material. The GPU node stacks for inputs and outputs are
- * stored and populated during construction. Derived class should implement the compile method to
- * implement the node and link it to the GPU material. The GPU material compiler is expected to
- * initialize the input links of node before invoking the compile method. */
-class GPUMaterialNode {
- private:
- /* The node that this operation represents. */
- DNode node_;
- /* The GPU node stacks of the inputs of the node. Those are populated during construction in the
- * populate_inputs method. The links of the inputs are initialized by the GPU material compiler
- * prior to calling the compile method. There is an extra stack at the end to mark the end of the
- * array, as this is what the GPU module functions expect. */
- Vector<GPUNodeStack> inputs_;
- /* The GPU node stacks of the outputs of the node. Those are populated during construction in the
- * populate_outputs method. There is an extra stack at the end to mark the end of the array, as
- * this is what the GPU module functions expect. */
- Vector<GPUNodeStack> outputs_;
-
- public:
- /* Construct the node by populating both its inputs and outputs. */
- GPUMaterialNode(DNode node);
-
- virtual ~GPUMaterialNode() = default;
-
- /* Compile the node by adding the appropriate GPU material graph nodes and linking the
- * appropriate resources. */
- virtual void compile(GPUMaterial *material) = 0;
-
- /* Returns a contiguous array containing the GPU node stacks of each input. */
- GPUNodeStack *get_inputs_array();
-
- /* Returns a contiguous array containing the GPU node stacks of each output. */
- GPUNodeStack *get_outputs_array();
-
- protected:
- /* Returns a reference to the node this operations represents. */
- bNode &node() const;
-
- private:
- /* Populate the inputs of the node. The input link is set to nullptr and is expected to be
- * initialized by the GPU material compiler before calling the compile method. */
- void populate_inputs();
- /* Populate the outputs of the node. The output link is set to nullptr and is expected to be
- * initialized by the compile method. */
- void populate_outputs();
-};
-
/* --------------------------------------------------------------------
* GPU Material Operation.
*/
diff --git a/source/blender/viewport_compositor/VPC_gpu_material_node.hh b/source/blender/viewport_compositor/VPC_gpu_material_node.hh
new file mode 100644
index 00000000000..3358c3f15db
--- /dev/null
+++ b/source/blender/viewport_compositor/VPC_gpu_material_node.hh
@@ -0,0 +1,65 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+#pragma once
+
+#include "BLI_vector.hh"
+
+#include "DNA_node_types.h"
+
+#include "GPU_material.h"
+
+#include "NOD_derived_node_tree.hh"
+
+namespace blender::viewport_compositor {
+
+using namespace nodes::derived_node_tree_types;
+
+/* A class that represents a node in a GPU material. The GPU node stacks for inputs and outputs are
+ * stored and populated during construction. Derived class should implement the compile method to
+ * implement the node and link it to the GPU material. The GPU material compiler is expected to
+ * initialize the input links of node before invoking the compile method. */
+class GPUMaterialNode {
+ private:
+ /* The node that this operation represents. */
+ DNode node_;
+ /* The GPU node stacks of the inputs of the node. Those are populated during construction in the
+ * populate_inputs method. The links of the inputs are initialized by the GPU material compiler
+ * prior to calling the compile method. There is an extra stack at the end to mark the end of the
+ * array, as this is what the GPU module functions expect. */
+ Vector<GPUNodeStack> inputs_;
+ /* The GPU node stacks of the outputs of the node. Those are populated during construction in the
+ * populate_outputs method. There is an extra stack at the end to mark the end of the array, as
+ * this is what the GPU module functions expect. */
+ Vector<GPUNodeStack> outputs_;
+
+ public:
+ /* Construct the node by populating both its inputs and outputs. */
+ GPUMaterialNode(DNode node);
+
+ virtual ~GPUMaterialNode() = default;
+
+ /* Compile the node by adding the appropriate GPU material graph nodes and linking the
+ * appropriate resources. */
+ virtual void compile(GPUMaterial *material) = 0;
+
+ /* Returns a contiguous array containing the GPU node stacks of each input. */
+ GPUNodeStack *get_inputs_array();
+
+ /* Returns a contiguous array containing the GPU node stacks of each output. */
+ GPUNodeStack *get_outputs_array();
+
+ protected:
+ /* Returns a reference to the node this operations represents. */
+ bNode &node() const;
+
+ private:
+ /* Populate the inputs of the node. The input link is set to nullptr and is expected to be
+ * initialized by the GPU material compiler before calling the compile method. */
+ void populate_inputs();
+ /* Populate the outputs of the node. The output link is set to nullptr and is expected to be
+ * initialized by the compile method. */
+ void populate_outputs();
+};
+
+} // namespace blender::viewport_compositor
diff --git a/source/blender/viewport_compositor/intern/compositor_execute.cc b/source/blender/viewport_compositor/intern/compositor_execute.cc
index 73545bbf8cc..2d966267d8a 100644
--- a/source/blender/viewport_compositor/intern/compositor_execute.cc
+++ b/source/blender/viewport_compositor/intern/compositor_execute.cc
@@ -40,6 +40,7 @@
#include "VPC_compositor_execute.hh"
#include "VPC_context.hh"
#include "VPC_domain.hh"
+#include "VPC_gpu_material_node.hh"
#include "VPC_input_descriptor.hh"
#include "VPC_node_operation.hh"
#include "VPC_operation.hh"
@@ -48,125 +49,10 @@
#include "VPC_texture_pool.hh"
#include "VPC_utilities.hh"
-/* --------------------------------------------------------------------
- * GPU Material Node.
- */
-
namespace blender::viewport_compositor {
using namespace nodes::derived_node_tree_types;
-GPUMaterialNode::GPUMaterialNode(DNode node) : node_(node)
-{
- populate_inputs();
- populate_outputs();
-}
-
-GPUNodeStack *GPUMaterialNode::get_inputs_array()
-{
- return inputs_.data();
-}
-
-GPUNodeStack *GPUMaterialNode::get_outputs_array()
-{
- return outputs_.data();
-}
-
-bNode &GPUMaterialNode::node() const
-{
- return *node_->bnode();
-}
-
-static eGPUType gpu_type_from_socket_type(eNodeSocketDatatype type)
-{
- switch (type) {
- case SOCK_FLOAT:
- return GPU_FLOAT;
- case SOCK_VECTOR:
- return GPU_VEC3;
- case SOCK_RGBA:
- return GPU_VEC4;
- default:
- BLI_assert_unreachable();
- return GPU_NONE;
- }
-}
-
-static void gpu_stack_vector_from_socket(float *vector, const SocketRef *socket)
-{
- switch (socket->bsocket()->type) {
- case SOCK_FLOAT:
- vector[0] = socket->default_value<bNodeSocketValueFloat>()->value;
- return;
- case SOCK_VECTOR:
- copy_v3_v3(vector, socket->default_value<bNodeSocketValueVector>()->value);
- return;
- case SOCK_RGBA:
- copy_v4_v4(vector, socket->default_value<bNodeSocketValueRGBA>()->value);
- return;
- default:
- BLI_assert_unreachable();
- }
-}
-
-static void populate_gpu_node_stack(DSocket socket, GPUNodeStack &stack)
-{
- /* Make sure this stack is not marked as the end of the stack array. */
- stack.end = false;
- /* This will be initialized later by the GPU material compiler or the compile method. */
- stack.link = nullptr;
- /* Socket type and its corresponding GPU type. */
- stack.sockettype = socket->bsocket()->type;
- stack.type = gpu_type_from_socket_type((eNodeSocketDatatype)socket->bsocket()->type);
-
- if (socket->is_input()) {
- /* Get the origin socket connected to the input if any. */
- const DInputSocket input{socket.context(), &socket->as_input()};
- DSocket origin = get_node_input_origin_socket(input);
- /* The input is linked if the origin socket is not null and is an output socket. Had it been an
- * input socket, then it is an unlinked input of a group input node. */
- stack.hasinput = origin->is_output();
- /* Get the socket value from the origin if it is an input, because then it would be an unlinked
- * input of a group input node, otherwise, get the value from the socket itself. */
- if (origin->is_input()) {
- gpu_stack_vector_from_socket(stack.vec, origin.socket_ref());
- }
- else {
- gpu_stack_vector_from_socket(stack.vec, socket.socket_ref());
- }
- }
- else {
- stack.hasoutput = socket->is_logically_linked();
- /* Populate the stack vector even for outputs because some nodes store their properties in the
- * default values of t
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list