121 switch (
type.category()) {
126 signature.vector_input(socket->name(),
type.vector_base_type());
135 switch (
type.category()) {
140 signature.vector_output(socket->name(),
type.vector_base_type());
151 if (
mask.size() == 0) {
155 const MFNetwork &network = outputs_[0]->node().network();
160 this->copy_inputs_to_storage(
params, storage);
161 this->copy_outputs_to_storage(
params, storage, outputs_to_initialize_in_the_end);
162 this->evaluate_network_to_compute_outputs(
context, storage);
163 this->initialize_remaining_outputs(
params, storage, outputs_to_initialize_in_the_end);
167 Storage &storage)
const
169 for (
int input_index : inputs_.index_range()) {
170 int param_index = input_index + 0;
174 const GVArray &input_list =
params.readonly_single_input(param_index);
175 storage.add_single_input_from_caller(socket, input_list);
179 const GVVectorArray &input_list_list =
params.readonly_vector_input(param_index);
180 storage.add_vector_input_from_caller(socket, input_list_list);
187 BLI_NOINLINE void MFNetworkEvaluator::copy_outputs_to_storage(
190 Vector<const MFInputSocket *> &outputs_to_initialize_in_the_end)
const
192 for (
int output_index : outputs_.index_range()) {
193 int param_index = output_index + inputs_.size();
194 const MFInputSocket &socket = *outputs_[output_index];
195 const MFOutputSocket &origin = *socket.origin();
197 if (origin.node().is_dummy()) {
200 outputs_to_initialize_in_the_end.append(&socket);
204 if (storage.socket_has_buffer_for_output(origin)) {
206 outputs_to_initialize_in_the_end.append(&socket);
210 switch (socket.data_type().category()) {
212 GMutableSpan span =
params.uninitialized_single_output(param_index);
213 storage.add_single_output_from_caller(origin, span);
217 GVectorArray &vector_array =
params.vector_output(param_index);
218 storage.add_vector_output_from_caller(origin, vector_array);
225 BLI_NOINLINE void MFNetworkEvaluator::evaluate_network_to_compute_outputs(
226 MFContext &global_context, Storage &storage)
const
228 Stack<const MFOutputSocket *, 32> sockets_to_compute;
229 for (
const MFInputSocket *socket : outputs_) {
230 sockets_to_compute.push(socket->origin());
234 while (!sockets_to_compute.is_empty()) {
235 const MFOutputSocket &socket = *sockets_to_compute.peek();
236 const MFNode &
node = socket.node();
238 if (storage.socket_is_computed(socket)) {
239 sockets_to_compute.pop();
245 const MFFunctionNode &function_node =
node.as_function();
247 bool all_origins_are_computed =
true;
248 for (
const MFInputSocket *input_socket : function_node.inputs()) {
249 const MFOutputSocket *origin = input_socket->origin();
250 if (origin !=
nullptr) {
251 if (!storage.socket_is_computed(*origin)) {
252 sockets_to_compute.push(origin);
253 all_origins_are_computed =
false;
258 if (all_origins_are_computed) {
259 this->evaluate_function(global_context, function_node, storage);
260 sockets_to_compute.pop();
265 BLI_NOINLINE void MFNetworkEvaluator::evaluate_function(MFContext &global_context,
266 const MFFunctionNode &function_node,
267 Storage &storage)
const
270 const MultiFunction &
function = function_node.function();
273 if (this->can_do_single_value_evaluation(function_node, storage)) {
276 MFParamsBuilder
params{
function, 1};
277 ResourceScope &scope =
params.resource_scope();
280 MFParamType
param_type =
function.param_type(param_index);
283 const MFInputSocket &socket = function_node.input_for_param(param_index);
284 const GVArray &values = storage.get_single_input__single(socket, scope);
285 params.add_readonly_single_input(values);
289 const MFInputSocket &socket = function_node.input_for_param(param_index);
290 const GVVectorArray &values = storage.get_vector_input__single(socket, scope);
291 params.add_readonly_vector_input(values);
295 const MFOutputSocket &socket = function_node.output_for_param(param_index);
296 GMutableSpan values = storage.get_single_output__single(socket);
297 params.add_uninitialized_single_output(values);
301 const MFOutputSocket &socket = function_node.output_for_param(param_index);
302 GVectorArray &values = storage.get_vector_output__single(socket);
303 params.add_vector_output(values);
307 const MFInputSocket &input = function_node.input_for_param(param_index);
308 const MFOutputSocket &
output = function_node.output_for_param(param_index);
309 GMutableSpan values = storage.get_mutable_single__single(input,
output, scope);
310 params.add_single_mutable(values);
314 const MFInputSocket &input = function_node.input_for_param(param_index);
315 const MFOutputSocket &
output = function_node.output_for_param(param_index);
316 GVectorArray &values = storage.get_mutable_vector__single(input,
output, scope);
317 params.add_vector_mutable(values);
323 function.call(IndexRange(1),
params, global_context);
326 MFParamsBuilder
params{
function, storage.mask().min_array_size()};
327 ResourceScope &scope =
params.resource_scope();
330 MFParamType
param_type =
function.param_type(param_index);
333 const MFInputSocket &socket = function_node.input_for_param(param_index);
334 const GVArray &values = storage.get_single_input__full(socket, scope);
335 params.add_readonly_single_input(values);
339 const MFInputSocket &socket = function_node.input_for_param(param_index);
340 const GVVectorArray &values = storage.get_vector_input__full(socket, scope);
341 params.add_readonly_vector_input(values);
345 const MFOutputSocket &socket = function_node.output_for_param(param_index);
346 GMutableSpan values = storage.get_single_output__full(socket);
347 params.add_uninitialized_single_output(values);
351 const MFOutputSocket &socket = function_node.output_for_param(param_index);
352 GVectorArray &values = storage.get_vector_output__full(socket);
353 params.add_vector_output(values);
357 const MFInputSocket &input = function_node.input_for_param(param_index);
358 const MFOutputSocket &
output = function_node.output_for_param(param_index);
359 GMutableSpan values = storage.get_mutable_single__full(input,
output, scope);
360 params.add_single_mutable(values);
364 const MFInputSocket &input = function_node.input_for_param(param_index);
365 const MFOutputSocket &
output = function_node.output_for_param(param_index);
366 GVectorArray &values = storage.get_mutable_vector__full(input,
output, scope);
367 params.add_vector_mutable(values);
373 function.call(storage.mask(),
params, global_context);
376 storage.finish_node(function_node);
379 bool MFNetworkEvaluator::can_do_single_value_evaluation(
const MFFunctionNode &function_node,
380 Storage &storage)
const
382 for (
const MFInputSocket *socket : function_node.inputs()) {
383 if (!storage.is_same_value_for_every_index(*socket->origin())) {
387 if (storage.mask().min_array_size() >= 1) {
388 for (
const MFOutputSocket *socket : function_node.outputs()) {
389 if (storage.socket_has_buffer_for_output(*socket)) {
397 BLI_NOINLINE void MFNetworkEvaluator::initialize_remaining_outputs(
398 MFParams
params, Storage &storage, Span<const MFInputSocket *> remaining_outputs)
const
401 for (
const MFInputSocket *socket : remaining_outputs) {
402 int param_index = inputs_.size() + outputs_.first_index_of(socket);
404 switch (socket->data_type().category()) {
406 const GVArray &values = storage.get_single_input__full(*socket, scope);
407 GMutableSpan output_values =
params.uninitialized_single_output(param_index);
408 values.materialize_to_uninitialized(storage.mask(), output_values.data());
412 const GVVectorArray &values = storage.get_vector_input__full(*socket, scope);
413 GVectorArray &output_values =
params.vector_output(param_index);
414 output_values.extend(storage.mask(), values);
527 value_per_output_id_(socket_id_amount, nullptr),
528 min_array_size_(
mask.min_array_size())
534 for (
Value *any_value : value_per_output_id_) {
535 if (any_value ==
nullptr) {
546 type.destruct_indices(span.
data(), mask_);
564 Value *any_value = value_per_output_id_[socket.
id()];
565 if (any_value ==
nullptr) {
569 return static_cast<OutputValue *
>(any_value)->is_computed;
576 Value *any_value = value_per_output_id_[socket.
id()];
577 switch (any_value->
type) {
579 return static_cast<OwnSingleValue *
>(any_value)->span.size() == 1;
581 return static_cast<OwnVectorValue *
>(any_value)->vector_array->size() == 1;
583 return static_cast<InputSingleValue *
>(any_value)->virtual_array.is_single();
585 return static_cast<InputVectorValue *
>(any_value)->virtual_vector_array.is_single_vector();
597 Value *any_value = value_per_output_id_[socket.
id()];
598 if (any_value ==
nullptr) {
618 Value *any_value = value_per_output_id_[socket.
id()];
619 if (any_value ==
nullptr) {
624 static_cast<OutputValue *
>(any_value)->is_computed =
true;
632 Value *any_value = value_per_output_id_[origin.
id()];
633 if (any_value ==
nullptr) {
638 switch (any_value->
type) {
656 type.destruct_indices(span.
data(), mask_);
659 value_per_output_id_[origin.
id()] =
nullptr;
669 value_per_output_id_[origin.
id()] =
nullptr;
679 BLI_assert(value_per_output_id_[socket.
id()] ==
nullptr);
683 value_per_output_id_[socket.
id()] = value;
689 BLI_assert(value_per_output_id_[socket.
id()] ==
nullptr);
693 value_per_output_id_[socket.
id()] = value;
699 BLI_assert(value_per_output_id_[socket.
id()] ==
nullptr);
703 value_per_output_id_[socket.
id()] = value;
709 BLI_assert(value_per_output_id_[socket.
id()] ==
nullptr);
713 value_per_output_id_[socket.
id()] = value;
718 Value *any_value = value_per_output_id_[socket.
id()];
719 if (any_value ==
nullptr) {
726 value_per_output_id_[socket.
id()] = value;
737 Value *any_value = value_per_output_id_[socket.
id()];
738 if (any_value ==
nullptr) {
745 value_per_output_id_[socket.
id()] = value;
758 Value *any_value = value_per_output_id_[socket.
id()];
759 if (any_value ==
nullptr) {
765 value_per_output_id_[socket.
id()] = value;
767 return *value->vector_array;
776 Value *any_value = value_per_output_id_[socket.
id()];
777 if (any_value ==
nullptr) {
783 value_per_output_id_[socket.
id()] = value;
785 return *value->vector_array;
802 Value *from_any_value = value_per_output_id_[
from.id()];
803 Value *to_any_value = value_per_output_id_[to.
id()];
807 if (to_any_value !=
nullptr) {
818 value_per_output_id_[to.
id()] = value;
819 value_per_output_id_[
from.id()] =
nullptr;
832 value_per_output_id_[to.
id()] = new_value;
833 return new_array_ref;
844 Value *from_any_value = value_per_output_id_[
from.id()];
845 Value *to_any_value = value_per_output_id_[to.
id()];
849 if (to_any_value !=
nullptr) {
861 value_per_output_id_[to.
id()] = value;
862 value_per_output_id_[
from.id()] =
nullptr;
877 value_per_output_id_[to.
id()] = new_value;
878 return new_array_ref;
887 const CPPType &base_type =
from.data_type().vector_base_type();
889 Value *from_any_value = value_per_output_id_[
from.id()];
890 Value *to_any_value = value_per_output_id_[to.
id()];
894 if (to_any_value !=
nullptr) {
898 vector_array.
extend(mask_, virtual_vector_array);
905 value_per_output_id_[to.
id()] = value;
906 value_per_output_id_[
from.id()] =
nullptr;
915 new_vector_array->
extend(mask_, virtual_vector_array);
919 value_per_output_id_[to.
id()] = new_value;
921 return *new_vector_array;
930 const CPPType &base_type =
from.data_type().vector_base_type();
932 Value *from_any_value = value_per_output_id_[
from.id()];
933 Value *to_any_value = value_per_output_id_[to.
id()];
937 if (to_any_value !=
nullptr) {
942 vector_array.
extend({0}, virtual_vector_array);
949 value_per_output_id_[to.
id()] = value;
950 value_per_output_id_[
from.id()] =
nullptr;
959 new_vector_array->
extend({0}, virtual_vector_array);
963 value_per_output_id_[to.
id()] = new_value;
964 return *new_vector_array;
971 Value *any_value = value_per_output_id_[origin.
id()];
1001 Value *any_value = value_per_output_id_[origin.
id()];
1029 Value *any_value = value_per_output_id_[origin.
id()];
1058 Value *any_value = value_per_output_id_[origin.
id()];
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White Value
void * allocate(const int64_t size, const int64_t alignment)
destruct_ptr< T > construct(Args &&... args)
T & construct(const char *name, Args &&... args)
const CPPType & type() const
void materialize_to_uninitialized(const IndexMask mask, void *dst) const
void get_single_to_uninitialized(void *r_value) const
bool is_single_vector() const
void extend(int64_t index, const GVArray &values)
const CPPType & vector_base_type() const
const CPPType & single_type() const
Category category() const
GMutableSpan get_single_output__full(const MFOutputSocket &socket)
const GVVectorArray & get_vector_input__single(const MFInputSocket &socket, ResourceScope &scope)
void finish_node(const MFFunctionNode &node)
GVectorArray & get_mutable_vector__full(const MFInputSocket &input, const MFOutputSocket &output, ResourceScope &scope)
void add_single_input_from_caller(const MFOutputSocket &socket, const GVArray &virtual_array)
const GVArray & get_single_input__full(const MFInputSocket &socket, ResourceScope &scope)
bool socket_is_computed(const MFOutputSocket &socket)
bool is_same_value_for_every_index(const MFOutputSocket &socket)
const GVArray & get_single_input__single(const MFInputSocket &socket, ResourceScope &scope)
GVectorArray & get_vector_output__single(const MFOutputSocket &socket)
MFNetworkEvaluationStorage(IndexMask mask, int socket_id_amount)
GVectorArray & get_mutable_vector__single(const MFInputSocket &input, const MFOutputSocket &output, ResourceScope &scope)
void finish_input_socket(const MFInputSocket &socket)
bool socket_has_buffer_for_output(const MFOutputSocket &socket)
GMutableSpan get_mutable_single__full(const MFInputSocket &input, const MFOutputSocket &output, ResourceScope &scope)
void add_single_output_from_caller(const MFOutputSocket &socket, GMutableSpan span)
GVectorArray & get_vector_output__full(const MFOutputSocket &socket)
const GVVectorArray & get_vector_input__full(const MFInputSocket &socket, ResourceScope &scope)
~MFNetworkEvaluationStorage()
GMutableSpan get_single_output__single(const MFOutputSocket &socket)
void add_vector_output_from_caller(const MFOutputSocket &socket, GVectorArray &vector_array)
GMutableSpan get_mutable_single__single(const MFInputSocket &input, const MFOutputSocket &output, ResourceScope &scope)
void finish_output_socket(const MFOutputSocket &socket)
void add_vector_input_from_caller(const MFOutputSocket &socket, const GVVectorArray &virtual_vector_array)
MFNetworkEvaluator(Vector< const MFOutputSocket * > inputs, Vector< const MFInputSocket * > outputs)
void call(IndexMask mask, MFParams params, MFContext context) const override
int socket_id_amount() const
Span< MFInputSocket * > targets()
Category category() const
const MFDataType & data_type() const
MFParamType param_type(int param_index) const
IndexRange param_indices() const
void set_signature(const MFSignature *signature)
const MFSignature & signature() const
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN_aligned)(size_t len, size_t alignment, const char *str)
static bNodeSocketTemplate outputs[]
static bNodeSocketTemplate inputs[]
struct SELECTID_Context context
OutputSingleValue(GMutableSpan span)
OutputValue(ValueType type)
GVectorArray * vector_array
OutputVectorValue(GVectorArray &vector_array)
OwnSingleValue(GMutableSpan span, int max_remaining_users, bool is_single_allocated)
OwnVectorValue(GVectorArray &vector_array, int max_remaining_users)
GVectorArray * vector_array
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)