Commit: e9ce424492b0c09cfe203457a3dc70e4bcd8961b Author: Omar Emara Date: Fri May 6 10:12:41 2022 +0200 Branches: temp-viewport-compositor-merge https://developer.blender.org/rBe9ce424492b0c09cfe203457a3dc70e4bcd8961b
Viewport Compositor: Fix and refactor reference counting After using eager evaluation and retaining results, reference counting no longer worked. This patch refactors the reference counting system to make it work again. =================================================================== M source/blender/nodes/composite/nodes/node_composite_image.cc M source/blender/nodes/composite/nodes/node_composite_movieclip.cc M source/blender/viewport_compositor/VPC_compile_state.hh M source/blender/viewport_compositor/VPC_gpu_material_operation.hh M source/blender/viewport_compositor/VPC_node_operation.hh M source/blender/viewport_compositor/VPC_operation.hh M source/blender/viewport_compositor/VPC_processor_operation.hh M source/blender/viewport_compositor/VPC_result.hh M source/blender/viewport_compositor/VPC_utilities.hh M source/blender/viewport_compositor/intern/compile_state.cc M source/blender/viewport_compositor/intern/evaluator.cc M source/blender/viewport_compositor/intern/gpu_material_operation.cc M source/blender/viewport_compositor/intern/input_single_value_operation.cc M source/blender/viewport_compositor/intern/node_operation.cc M source/blender/viewport_compositor/intern/operation.cc M source/blender/viewport_compositor/intern/processor_operation.cc M source/blender/viewport_compositor/intern/result.cc M source/blender/viewport_compositor/intern/unsupported_node_operation.cc M source/blender/viewport_compositor/intern/utilities.cc =================================================================== diff --git a/source/blender/nodes/composite/nodes/node_composite_image.cc b/source/blender/nodes/composite/nodes/node_composite_image.cc index 7d358cc9096..ce38dfe25ad 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.cc +++ b/source/blender/nodes/composite/nodes/node_composite_image.cc @@ -490,7 +490,7 @@ class ImageOperation : public NodeOperation { void allocate_invalid() { for (const OutputSocketRef *output : node()->outputs()) { - if (!is_output_needed(output->identifier())) { + if (!should_compute_output(output->identifier())) { continue; } @@ -508,7 +508,7 @@ class ImageOperation : public NodeOperation { void compute_output(StringRef identifier) { - if (!is_output_needed(identifier)) { + if (!should_compute_output(identifier)) { return; } diff --git a/source/blender/nodes/composite/nodes/node_composite_movieclip.cc b/source/blender/nodes/composite/nodes/node_composite_movieclip.cc index eb171f5829c..b31a7e49b8e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_movieclip.cc +++ b/source/blender/nodes/composite/nodes/node_composite_movieclip.cc @@ -108,7 +108,7 @@ class MovieClipOperation : public NodeOperation { void compute_image(GPUTexture *movie_clip_texture) { - if (!is_output_needed("Image")) { + if (!should_compute_output("Image")) { return; } @@ -141,7 +141,7 @@ class MovieClipOperation : public NodeOperation { void compute_alpha(GPUTexture *movie_clip_texture) { - if (!is_output_needed("Alpha")) { + if (!should_compute_output("Alpha")) { return; } @@ -177,22 +177,22 @@ class MovieClipOperation : public NodeOperation { { /* The movie clip texture is invalid or missing, set appropriate fallback values. */ if (!movie_clip_texture) { - if (is_output_needed("Offset X")) { + if (should_compute_output("Offset X")) { Result &result = get_result("Offset X"); result.allocate_single_value(); result.set_float_value(0.0f); } - if (is_output_needed("Offset Y")) { + if (should_compute_output("Offset Y")) { Result &result = get_result("Offset Y"); result.allocate_single_value(); result.set_float_value(0.0f); } - if (is_output_needed("Scale")) { + if (should_compute_output("Scale")) { Result &result = get_result("Scale"); result.allocate_single_value(); result.set_float_value(1.0f); } - if (is_output_needed("Angle")) { + if (should_compute_output("Angle")) { Result &result = get_result("Angle"); result.allocate_single_value(); result.set_float_value(0.0f); @@ -213,22 +213,22 @@ class MovieClipOperation : public NodeOperation { BKE_tracking_stabilization_data_get( movie_clip, frame_number, width, height, offset, &scale, &angle); - if (is_output_needed("Offset X")) { + if (should_compute_output("Offset X")) { Result &result = get_result("Offset X"); result.allocate_single_value(); result.set_float_value(offset.x); } - if (is_output_needed("Offset Y")) { + if (should_compute_output("Offset Y")) { Result &result = get_result("Offset Y"); result.allocate_single_value(); result.set_float_value(offset.y); } - if (is_output_needed("Scale")) { + if (should_compute_output("Scale")) { Result &result = get_result("Scale"); result.allocate_single_value(); result.set_float_value(scale); } - if (is_output_needed("Angle")) { + if (should_compute_output("Angle")) { Result &result = get_result("Angle"); result.allocate_single_value(); result.set_float_value(angle); diff --git a/source/blender/viewport_compositor/VPC_compile_state.hh b/source/blender/viewport_compositor/VPC_compile_state.hh index b5ad0a6710e..25bcb01e0f8 100644 --- a/source/blender/viewport_compositor/VPC_compile_state.hh +++ b/source/blender/viewport_compositor/VPC_compile_state.hh @@ -9,6 +9,7 @@ #include "VPC_domain.hh" #include "VPC_gpu_material_operation.hh" #include "VPC_node_operation.hh" +#include "VPC_scheduler.hh" namespace blender::viewport_compositor { @@ -96,19 +97,15 @@ using namespace nodes::derived_node_tree_types; * the domain of the compile group is assumed to be the domain of the first node whose computed * domain is not an identity domain. Identity domains corresponds to single value results, so those * are always compatible with any domain. The domain of the compile group is computed and set in - * the add_node_to_gpu_material_compile_group method. WHen processing a node, the computed domain + * the add_node_to_gpu_material_compile_group method. When processing a node, the computed domain * of node is compared to compile group domain in the should_compile_gpu_material_compile_group * method, noting that identity domains are always compatible. Node domains are computed in the * compute_gpu_material_node_domain method, which is analogous to Operation::compute_domain for * nodes that are not yet compiled. */ class CompileState { private: - /* A contiguous subset of the node execution schedule that contains the group of nodes that will - * be compiled together into a GPU Material Operation. See the discussion in VPC_evaluator.hh for - * more information. */ - SubSchedule gpu_material_compile_group_; - /* The domain of the GPU material compile group. */ - Domain gpu_material_compile_group_domain_ = Domain::identity(); + /* A reference to the node execution schedule that is being compiled. */ + const Schedule &schedule_; /* Those two maps associate each node with the operation it was compiled into. Each node is * either compiled into a node operation and added to node_operations, or compiled into a GPU * material operation and added to gpu_material_operations. Those maps are used to retrieve the @@ -116,8 +113,32 @@ class CompileState { * method for more information. */ Map<DNode, NodeOperation *> node_operations_; Map<DNode, GPUMaterialOperation *> gpu_material_operations_; + /* A contiguous subset of the node execution schedule that contains the group of nodes that will + * be compiled together into a GPU Material Operation. See the discussion in VPC_evaluator.hh for + * more information. */ + SubSchedule gpu_material_compile_group_; + /* The domain of the GPU material compile group. */ + Domain gpu_material_compile_group_domain_ = Domain::identity(); public: + /* Construct a compile state from the node execution schedule being compiled. */ + CompileState(const Schedule &schedule); + + /* Get a reference to the node execution schedule being compiled. */ + const Schedule &get_schedule(); + + /* Add an association between the given node and the give node operation that the node was + * compiled into in the node_operations_ map. */ + void map_node_to_node_operation(DNode node, NodeOperation *operation); + + /* Add an association between the given node and the give GPU material operation that the node + * was compiled into in the gpu_material_operations_ map. */ + void map_node_to_gpu_material_operation(DNode node, GPUMaterialOperation *operation); + + /* Returns a reference to the result of the operation corresponding to the given output that the + * given output's node was compiled to. */ + Result &get_result_from_output_socket(DOutputSocket output); + /* Add the given node to the GPU material compile group. And if the domain of the GPU material * compile group is not yet determined or was determined to be an identity domain, update it to * the computed domain for the give node. */ @@ -140,18 +161,6 @@ class CompileState { * be compiled. */ bool should_compile_gpu_material_compile_group(DNode node); - /* Add an association between the given node and the give node operation that the node was - * compiled into in the node_operations_ map. */ - void map_node_to_node_operation(DNode node, NodeOperation *operation); - - /* Add an association between the given node and the give GPU material operation that the node - * was compiled into in the gpu_material_operations_ map. */ - void map_node_to_gpu_material_operation(DNode node, GPUMaterialOperation *operation); - - /* Returns a reference to the result of the operation corresponding to the given output that the - * given output's node was compiled to. */ - Result &get_result_from_output_socket(DOutputSocket output); - private: /* Compute the node domain of the given GPU material node. This is analogous to the * Operation::compute_domain method, except it is computed from the node itself as opposed to a diff --git a/source/blender/viewport_compositor/VPC_gpu_material_operation.hh b/source/blender/viewport_compositor/VPC_gpu_material_operation.hh index 58dc6899bb4..fc3404a444b 100644 --- a/source/blender/viewport_compositor/VPC_gpu_material_operation.hh +++ b/source/blender/viewport_compositor/VPC_gpu_material_operation.hh @@ -15,6 +15,7 @@ #include "VPC_context.hh" #include "VPC_operation.hh" +#include "VPC_scheduler.hh" namespace blender::viewport_compositor { @@ -25,6 +26,9 @@ using SubSchedule = VectorSet<DNode>; /* A type representing a map that associates the identifier of each input of the operation with the * output socket it is linked to. */ using InputsToLinkedOutputsMap = Map<StringRef, DOutputSocket>; +/* A type representing a map that associates the output socket that provides the result of an + * output of the operation with the identifier of that output. */ +using OutputSocketsToOutputIdentifiersMap = Map<DOutputSocket, StringRef>; /* ------------------------------------------------------------------------------------------------ * GPU Material Operation @@ -102,7 +106,7 @@ class GPUMaterialOperation : public Operation { InputsToLinkedOutputsMap inputs_to_linked_outputs_map_; /* A map that associates the output socket that provides the result of an output of the operation * with the identifier of that output. See the above discussion for more information. */ - Map<DOutputSocket, StringRef> output_sockets_ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs