[Bf-blender-cvs] [b0ae0e95597] temp-viewport-compositor-compiler: Viewport Compositor: Move GPU material operation to its own file
Omar Emara
noreply at git.blender.org
Mon Apr 11 11:16:09 CEST 2022
Commit: b0ae0e95597e0df721540d1d2729bb35af0d0393
Author: Omar Emara
Date: Mon Apr 11 10:20:04 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rBb0ae0e95597e0df721540d1d2729bb35af0d0393
Viewport Compositor: Move GPU material operation 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_operation.hh
M source/blender/viewport_compositor/intern/compositor_execute.cc
A source/blender/viewport_compositor/intern/gpu_material_operation.cc
===================================================================
diff --git a/source/blender/viewport_compositor/CMakeLists.txt b/source/blender/viewport_compositor/CMakeLists.txt
index 19ddb3e2141..ace74bf9116 100644
--- a/source/blender/viewport_compositor/CMakeLists.txt
+++ b/source/blender/viewport_compositor/CMakeLists.txt
@@ -21,6 +21,7 @@ set(SRC
intern/conversion_processor_operation.cc
intern/domain.cc
intern/gpu_material_node.cc
+ intern/gpu_material_operation.cc
intern/node_operation.cc
intern/operation.cc
intern/processor_operation.cc
@@ -36,6 +37,7 @@ set(SRC
VPC_conversion_processor_operation.hh
VPC_domain.hh
VPC_gpu_material_node.hh
+ VPC_gpu_material_operation.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 76748ccf67d..ef78ed52eae 100644
--- a/source/blender/viewport_compositor/VPC_compositor_execute.hh
+++ b/source/blender/viewport_compositor/VPC_compositor_execute.hh
@@ -24,6 +24,7 @@
#include "VPC_context.hh"
#include "VPC_domain.hh"
#include "VPC_gpu_material_node.hh"
+#include "VPC_gpu_material_operation.hh"
#include "VPC_node_operation.hh"
#include "VPC_operation.hh"
#include "VPC_result.hh"
@@ -34,203 +35,6 @@ namespace blender::viewport_compositor {
using namespace nodes::derived_node_tree_types;
-/* --------------------------------------------------------------------
- * GPU Material Operation.
- */
-
-/* A type representing a map that associates the identifier of each input of the operation with the
- * output socket it is linked to. */
-using InputIdentifierToOutputSocketMap = Map<StringRef, DOutputSocket>;
-
-/* An operation that compiles a contiguous subset of the node execution schedule into a single
- * GPU shader using the GPU material compiler.
- *
- * Consider the following node graph with a node execution schedule denoted by the number at each
- * node. Suppose that the compiler decided that nodes 2 to 5 are pixel-wise operations that can be
- * computed together in a single GPU shader. Then the compiler can construct a GPU Material
- * Operation from the sub-schedule containing nodes 2 to 5, compiling them into a GPU shader using
- * the GPU material compiler. Links that are internal to the sub-schedule are mapped internally in
- * the GPU material, for instance, the links going from node 2 to node 3. However, links that cross
- * the boundary of the sub-schedule and link to nodes outside of it are handled separately.
- *
- * Any link between an input of a node that is part of the sub-schedule and an output of a node
- * that is not part of the sub-schedule is declared as an input to the operation and GPU material,
- * for instance, the links going from node 1 to node 2. The inputs and outputs involved in such
- * links are recorded in the class to allow the compiler to link the inputs of the operation to
- * their respective output results.
- *
- * Any link between an output of a node that is part of the sub-schedule and an input of a node
- * that is not part of the sub-schedule is declared as an output to the operation and GPU material,
- * for instance, the links going from node 3 to node 6. The inputs and outputs involved in such
- * links are recorded in the class to allow the compiler to link the inputs of the operation to
- * their respective output results.
- *
- * +--------+ +--------+ +--------+ +--------+
- * | Node 1 |---| Node 2 |---| Node 3 |----| Node 6 |
- * +--------+\ +--------+ +--------+ / +--------+
- * \ +--------+ +--------+ /
- * \| Node 4 |---| Node 5 |/
- * +--------+ +--------+
- */
-class GPUMaterialOperation : public Operation {
- private:
- /* The execution sub-schedule that will be compiled into this GPU material operation. */
- Schedule sub_schedule_;
- /* The GPU material backing the operation. */
- GPUMaterial *material_;
- /* A map that associates each node in the execution sub-schedule with an instance of its GPU
- * material node. Those instances should be freed when no longer needed. */
- Map<DNode, GPUMaterialNode *> gpu_material_nodes_;
- /* A map that associates the identifier of each input of the operation with the output socket it
- * is linked to. If a node that is part of this GPU material has an input that is linked to an
- * output whose node is not part of this GPU material, then that input is considered to be an
- * input of the compiled GPU material operation. The identifiers of such inputs are then
- * associated with the output sockets they are connected to in this map to allow the compiler to
- * map the inputs to the results of the outputs they are linked to. The compiler can call the
- * get_input_identifier_to_output_socket_map method to get a reference to this map and map the
- * results as needed. */
- InputIdentifierToOutputSocketMap input_identifier_to_output_socket_map_;
- /* A map that associates the output socket that provides the result of an output of the operation
- * with the identifier of that output. If a node that is part of this GPU material has an output
- * that is linked to an input whose node is not part of this GPU material, then that output is
- * considered to be an output of the compiled GPU material operation. Such outputs are mapped to
- * the identifiers of their corresponding operation outputs in this map to allow the compiler to
- * map the results of the operation to the inputs they are linked to. The compiler can call the
- * get_output_identifier_from_output_socket to get the operation output identifier corresponding
- * to the given output socket. */
- Map<DOutputSocket, StringRef> output_socket_to_output_identifier_map_;
- /* A map that associates the output socket of a node that is not part of the GPU material to the
- * GPU node link of the input texture that was created for it. This is used to share the same
- * input texture with all inputs that are linked to the same output socket. */
- Map<DOutputSocket, GPUNodeLink *> output_socket_to_input_link_map_;
-
- public:
- /* Construct and compile a GPU material from the give execution sub-schedule by calling
- * GPU_material_from_callbacks with the appropriate callbacks. */
- GPUMaterialOperation(Context &context, Schedule &sub_schedule);
-
- /* Free the GPU material and the GPU material nodes. */
- ~GPUMaterialOperation();
-
- /* - Allocate the output results.
- * - Bind the shader and any GPU material resources.
- * - Bind the input results.
- * - Bind the output results.
- * - Dispatch the shader. */
- void execute() override;
-
- /* Get the identifier of the operation output corresponding to the given output socket. See
- * output_socket_to_output_identifier_map_ for more information. */
- StringRef get_output_identifier_from_output_socket(DOutputSocket output);
-
- /* Get a reference to the input identifier to output socket map of the operation. See
- * input_identifier_to_output_socket_map_ for more information. */
- InputIdentifierToOutputSocketMap &get_input_identifier_to_output_socket_map();
-
- private:
- /* Bind the uniform buffer of the GPU material as well as any color band textures needed by the
- * GPU material. Other resources like attributes and textures that reference images are not bound
- * because the GPU material is guaranteed not to have any of them. Textures that reference the
- * inputs of the operation and images that reference the outputs of the operation are bound in
- * the bind_inputs and bind_outputs methods respectively. The compiled shader of the material is
- * given as an argument and assumed to be bound. */
- void bind_material_resources(GPUShader *shader);
-
- /* Bind the input results of the operation to the appropriate textures in the GPU materials. Any
- * texture in the GPU material that does not reference an image or a color band is a textures
- * that references an input of the operation, the input whose identifier is the name of the
- * texture sampler in the GPU material shader. The compiled shader of the material is given as an
- * argument and assumed to be bound. */
- void bind_inputs(GPUShader *shader);
-
- /* Bind the output results of the operation to the appropriate images in the GPU materials. Every
- * image in the GPU material corresponds to one of the outputs of the operation, the output whose
- * identifier is the name of the image in the GPU material shader. The compiled shader of the
- * material is given as an argument and assumed to be bound. */
- void bind_outputs(GPUShader *shader);
-
- /* A static callback method of interface GPUMaterialSetupFn that is passed to
- * GPU_material_from_callbacks to setup the GPU material. The thunk parameter will be a pointer
- * to the instance of GPUMaterialOperation that is being compiled. This methods setup the GPU
- * material as a compute one. */
- static void setup_material(void *thunk, GPUMaterial *material);
-
- /* A static callback method of interface GPUMaterialCompileFn that is passed to
- * GPU_material_from_callbacks to compile the GPU material. The thunk parameter will be a pointer
- * to the instance of GPUMaterialOperation that is being compiled. The method goes over the
- * execution sub-schedule and does the following for each node:
- *
- * - Instantiate a GPUMaterialNode from the node and add it to gpu_material_nodes_.
- * - Link the inputs of the node if needed. The inputs are either linked to other nodes in the
- * GPU material graph or they are exposed as inputs to the GPU material operation itself if
- * they are linked to nodes that are not part of the GPU material.
- * - Call the compile method of the GPU material node to actually add and link the GPU material
- * graph nodes.
- * - If any of the outputs of the node are linked to nodes that are not part of the GPU
- * material, they are exposed as outputs to the GPU material operation itself. */
- static void compile_material(void *thunk, GPUMaterial *material);
-
- /* Link the inputs of the node if needed. Unlinked inputs are ignored as they will be linked by
- * th
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list