18 : operations_builder_(operations_builder)
21 const int max_size = 65536;
22 BLI_rcti_init(&max_area_, -max_size, max_size, -max_size, max_size);
31 if (!input->get_flags().is_constant_operation ||
78ConstantOperation *ConstantFolder::fold_operation(NodeOperation *operation)
80 const DataType data_type = operation->get_output_socket()->get_data_type();
81 MemoryBuffer fold_buf(data_type, first_elem_area_);
83 operation->init_data();
84 operation->render(&fold_buf, {first_elem_area_}, input_bufs);
86 MemoryBuffer *constant_buf = create_constant_buffer(data_type);
87 constant_buf->copy_from(&fold_buf, first_elem_area_);
89 constant_buf->get_buffer());
91 constant_buffers_.add_new(constant_op, constant_buf);
95MemoryBuffer *ConstantFolder::create_constant_buffer(
const DataType data_type)
99 return new MemoryBuffer(data_type, max_area_,
true);
102Vector<MemoryBuffer *> ConstantFolder::get_constant_input_buffers(NodeOperation *operation)
104 const int num_inputs = operation->get_number_of_input_sockets();
105 Vector<MemoryBuffer *> inputs_bufs(num_inputs);
106 for (
int i = 0; i < num_inputs; i++) {
107 BLI_assert(operation->get_input_operation(i)->get_flags().is_constant_operation);
108 ConstantOperation *constant_op =
static_cast<ConstantOperation *
>(
109 operation->get_input_operation(i));
110 MemoryBuffer *constant_buf = constant_buffers_.lookup_or_add_cb(constant_op, [=] {
111 MemoryBuffer *buf = create_constant_buffer(
112 constant_op->get_output_socket()->get_data_type());
113 constant_op->render(buf, {first_elem_area_}, {});
116 inputs_bufs[i] = constant_buf;
121Vector<ConstantOperation *> ConstantFolder::try_fold_operations(Span<NodeOperation *> operations)
124 if (foldable_ops.is_empty()) {
128 Vector<ConstantOperation *> new_folds;
129 for (NodeOperation *op : foldable_ops) {
130 ConstantOperation *constant_op = fold_operation(op);
131 new_folds.append(constant_op);
141 int folds_count = last_folds.
size();
142 while (last_folds.
size() > 0) {
145 get_operation_output_operations(fold, ops_to_fold);
147 last_folds = try_fold_operations(ops_to_fold);
148 folds_count += last_folds.
size();
152 delete_constant_buffers();
157void ConstantFolder::delete_constant_buffers()
162 constant_buffers_.clear();
165void ConstantFolder::get_operation_output_operations(NodeOperation *operation,
166 Vector<NodeOperation *> &r_outputs)
168 const Vector<NodeOperationBuilder::Link> &links = operations_builder_.
get_links();
169 for (
const NodeOperationBuilder::Link &link : links) {
170 if (&link.from()->get_operation() == operation) {
171 r_outputs.append(&link.to()->get_operation());
#define BLI_assert_msg(a, msg)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
ConstantFolder(NodeOperationBuilder &operations_builder)
bool can_get_constant_elem() const
a MemoryBuffer contains access to the data
Span< Link > get_links() const
Span< NodeOperation * > get_operations() const
void replace_operation_with_constant(NodeOperation *operation, ConstantOperation *constant_operation)
NodeOperation contains calculation logic.
const NodeOperationFlags get_flags() const
unsigned int get_number_of_input_sockets() const
NodeOperation * get_input_operation(int index)
void set_channels(const float value[4])
void set_value(float value)
void set_vector(const float vector[3])
DataType
possible data types for sockets
@ Vector
Vector data type.
static Set< NodeOperation * > find_constant_foldable_operations(Span< NodeOperation * > operations)
static bool is_constant_foldable(NodeOperation *operation)
static ConstantOperation * create_constant_operation(DataType data_type, const float *constant_elem)
bool is_constant_operation
static void start()
Start the execution this methods will start the WorkScheduler. Inside this method all threads are ini...
static void stop()
stop the execution All created thread by the start method are destroyed.