17 : operations_builder_(operations_builder)
19 BLI_rcti_init(&max_area_, INT_MIN, INT_MAX, INT_MIN, INT_MAX);
28 if (!
input->get_flags().is_constant_operation ||
74 ConstantOperation *ConstantFolder::fold_operation(NodeOperation *operation)
76 const DataType data_type = operation->get_output_socket()->get_data_type();
77 MemoryBuffer fold_buf(data_type, first_elem_area_);
79 operation->init_data();
80 operation->render(&fold_buf, {first_elem_area_}, input_bufs);
82 MemoryBuffer *constant_buf = create_constant_buffer(data_type);
83 constant_buf->copy_from(&fold_buf, first_elem_area_);
85 constant_buf->get_buffer());
87 constant_buffers_.add_new(constant_op, constant_buf);
91 MemoryBuffer *ConstantFolder::create_constant_buffer(
const DataType data_type)
95 return new MemoryBuffer(data_type, max_area_,
true);
98 Vector<MemoryBuffer *> ConstantFolder::get_constant_input_buffers(NodeOperation *operation)
100 const int num_inputs = operation->get_number_of_input_sockets();
101 Vector<MemoryBuffer *> inputs_bufs(num_inputs);
102 for (
int i = 0; i < num_inputs; i++) {
103 BLI_assert(operation->get_input_operation(i)->get_flags().is_constant_operation);
104 ConstantOperation *constant_op =
static_cast<ConstantOperation *
>(
105 operation->get_input_operation(i));
106 MemoryBuffer *constant_buf = constant_buffers_.lookup_or_add_cb(constant_op, [=] {
107 MemoryBuffer *buf = create_constant_buffer(
108 constant_op->get_output_socket()->get_data_type());
109 constant_op->render(buf, {first_elem_area_}, {});
112 inputs_bufs[i] = constant_buf;
117 Vector<ConstantOperation *> ConstantFolder::try_fold_operations(Span<NodeOperation *> operations)
120 if (foldable_ops.size() == 0) {
121 return Vector<ConstantOperation *>();
124 Vector<ConstantOperation *> new_folds;
125 for (NodeOperation *op : foldable_ops) {
126 ConstantOperation *constant_op = fold_operation(op);
127 new_folds.append(constant_op);
137 int folds_count = last_folds.
size();
138 while (last_folds.
size() > 0) {
141 get_operation_output_operations(fold, ops_to_fold);
143 last_folds = try_fold_operations(ops_to_fold);
144 folds_count += last_folds.size();
148 delete_constant_buffers();
153 void ConstantFolder::delete_constant_buffers()
158 constant_buffers_.clear();
161 void ConstantFolder::get_operation_output_operations(NodeOperation *operation,
162 Vector<NodeOperation *> &r_outputs)
164 const Vector<NodeOperationBuilder::Link> &links = operations_builder_.
get_links();
166 if (&link.from()->get_operation() == operation) {
167 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 of a chunk
void replace_operation_with_constant(NodeOperation *operation, ConstantOperation *constant_operation)
const Vector< Link > & get_links() const
const Vector< NodeOperation * > & get_operations() const
const CompositorContext & context() const
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.
ccl_global KernelShaderEvalInput * input
static bool is_constant_foldable(NodeOperation *operation)
static ConstantOperation * create_constant_operation(DataType data_type, const float *constant_elem)
static Set< NodeOperation * > find_constant_foldable_operations(Span< NodeOperation * > operations)
bool is_constant_operation
static void start(const CompositorContext &context)
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.