Blender V4.3
COM_SharedOperationBuffers.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6#include "COM_NodeOperation.h"
7
8namespace blender::compositor {
9
10SharedOperationBuffers::BufferData::BufferData()
11 : buffer(nullptr), registered_reads(0), received_reads(0), is_rendered(false)
12{
13}
14
15SharedOperationBuffers::BufferData &SharedOperationBuffers::get_buffer_data(NodeOperation *op)
16{
17 return buffers_.lookup_or_add_cb(op, []() { return BufferData(); });
18}
19
20bool SharedOperationBuffers::is_area_registered(NodeOperation *op, const rcti &area_to_render)
21{
22 /* TODO: Possibly refactor to "request_area". Current implementation is incomplete:
23 * partial overlapping, etc. Leading to more rendering than necessary. */
24
25 BufferData &buf_data = get_buffer_data(op);
26 for (rcti &reg_rect : buf_data.render_areas) {
27 if (BLI_rcti_inside_rcti(&reg_rect, &area_to_render)) {
28 return true;
29 }
30 }
31 return false;
32}
33
34void SharedOperationBuffers::register_area(NodeOperation *op, const rcti &area_to_render)
35{
36 get_buffer_data(op).render_areas.append(area_to_render);
37}
38
39bool SharedOperationBuffers::has_registered_reads(NodeOperation *op)
40{
41 return get_buffer_data(op).registered_reads > 0;
42}
43
44void SharedOperationBuffers::register_read(NodeOperation *read_op)
45{
46 get_buffer_data(read_op).registered_reads++;
47}
48
49Vector<rcti> SharedOperationBuffers::get_areas_to_render(NodeOperation *op,
50 const int offset_x,
51 const int offset_y)
52{
53 Span<rcti> render_areas = get_buffer_data(op).render_areas.as_span();
54 Vector<rcti> dst_areas;
55 for (rcti dst : render_areas) {
56 BLI_rcti_translate(&dst, offset_x, offset_y);
57 dst_areas.append(std::move(dst));
58 }
59 return dst_areas;
60}
61
62bool SharedOperationBuffers::is_operation_rendered(NodeOperation *op)
63{
64 return get_buffer_data(op).is_rendered;
65}
66
67void SharedOperationBuffers::set_rendered_buffer(NodeOperation *op,
68 std::unique_ptr<MemoryBuffer> buffer)
69{
70 BufferData &buf_data = get_buffer_data(op);
71 BLI_assert(buf_data.received_reads == 0);
72 BLI_assert(buf_data.buffer == nullptr);
73 buf_data.buffer = std::move(buffer);
74 buf_data.is_rendered = true;
75}
76
77MemoryBuffer *SharedOperationBuffers::get_rendered_buffer(NodeOperation *op)
78{
79 BLI_assert(is_operation_rendered(op));
80 return get_buffer_data(op).buffer.get();
81}
82
83void SharedOperationBuffers::read_finished(NodeOperation *read_op)
84{
85 BufferData &buf_data = get_buffer_data(read_op);
86 buf_data.received_reads++;
87 BLI_assert(buf_data.received_reads > 0 && buf_data.received_reads <= buf_data.registered_reads);
88 if (buf_data.received_reads == buf_data.registered_reads) {
89 /* Dispose buffer. */
90 buf_data.buffer = nullptr;
91 }
92}
93
94} // namespace blender::compositor
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_rcti_translate(struct rcti *rect, int x, int y)
Definition rct.c:560
bool BLI_rcti_inside_rcti(const rcti *rct_a, const rcti *rct_b)
Definition rct.c:198
void append(const T &value)
a MemoryBuffer contains access to the data
NodeOperation contains calculation logic.