chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
66 / 66
100.0%
Branches:
79 / 88
89.8%
Functions:
4 / 4
100.0%

scene/tables/connections.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #include "chrono_batch_render/scene/tables/connections.h"
3
4 #include <algorithm>
5 #include <cstddef>
6
7 #include "chrono_batch_render/scene/schema/columns.h"
8 #include "chrono_batch_render/stage/publish/change_set.h"
9 #include "chrono_batch_render/stage/structure/structure.h"
10 #include "chrono_batch_render/util/profiler.h"
11 #include "chrono_batch_render/util/span.h"
12
13 namespace chrono::batch_render {
14
15 789 void ConnectionCache::Update(const ChangeSet& changes) {
16
4/5
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 784 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
789 CHRONO_BATCH_RENDER_ZONE("Connections/Update");
17
2/2
✓ Branch 0 taken 241 times.
✓ Branch 1 taken 548 times.
789 const Prims& prims = m_structure.GetPrims();
18 1627 const auto accepted = [&](uint32_t prim) {
19 838 return std::ranges::any_of(
20 1952 m_schemas, [&](SchemaId schema) { return IsA(prims.Record(prim).schema, schema); });
21 789 };
22
4/4
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 157 times.
✓ Branch 2 taken 40 times.
✓ Branch 3 taken 44 times.
241 if (!changes.resync && changes.added.empty() && changes.removed.empty() &&
23
5/6
✓ Branch 0 taken 241 times.
✓ Branch 1 taken 548 times.
✓ Branch 2 taken 29 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 29 times.
✗ Branch 5 not taken.
829 changes.apis.empty() && m_connections.size() == prims.Size()) {
24 29 std::vector<uint32_t> owners;
25 29 bool known = true;
26 87 for (const ColumnRef column :
27 {kConnectableConnectionsSources, kConnectableConnectionsInputs,
28
2/2
✓ Branch 0 taken 87 times.
✓ Branch 1 taken 29 times.
116 kConnectableConnectionsOutputs}) {
29
3/3
✓ Branch 1 taken 87 times.
✓ Branch 3 taken 72 times.
✓ Branch 4 taken 87 times.
159 for (const uint32_t row : changes.ArrayRows(column)) {
30
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 const uint32_t prim = row < m_rowPrims.size() ? m_rowPrims[row] : kNoPrim;
31
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
72 known = known && prim != kNoPrim;
32
6/7
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 72 times.
✓ Branch 5 taken 36 times.
✓ Branch 6 taken 36 times.
✓ Branch 7 taken 24 times.
✓ Branch 8 taken 12 times.
108 if (prim != kNoPrim && accepted(prim) &&
33
2/2
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 12 times.
72 std::ranges::find(owners, prim) == owners.end()) {
34
1/1
✓ Branch 1 taken 12 times.
12 owners.push_back(prim);
35 }
36 }
37 }
38
1/2
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
29 if (known) {
39
1/1
✓ Branch 1 taken 29 times.
29 Read(owners);
40 29 return;
41 }
42 29 }
43 760 std::vector<uint32_t> owners;
44 760 m_rowPrims.clear();
45
2/2
✓ Branch 0 taken 13326 times.
✓ Branch 1 taken 760 times.
14086 for (uint32_t prim = 0; prim < prims.Size(); ++prim) {
46
7/7
✓ Branch 1 taken 13326 times.
✓ Branch 3 taken 12512 times.
✓ Branch 4 taken 814 times.
✓ Branch 6 taken 12512 times.
✓ Branch 9 taken 12512 times.
✓ Branch 11 taken 766 times.
✓ Branch 12 taken 11746 times.
13326 if (!prims.Alive(prim) || !IsA(prims.Record(prim).schema, SchemaId::Connectable)) {
47 12560 continue;
48 }
49
1/1
✓ Branch 1 taken 766 times.
766 const uint32_t row = prims.Row(prim, SchemaId::Connectable);
50
1/2
✓ Branch 0 taken 766 times.
✗ Branch 1 not taken.
766 if (row >= m_rowPrims.size()) {
51
1/1
✓ Branch 1 taken 766 times.
766 m_rowPrims.resize(row + 1, kNoPrim);
52 }
53
1/1
✓ Branch 1 taken 766 times.
766 m_rowPrims[row] = prim;
54
3/3
✓ Branch 1 taken 766 times.
✓ Branch 3 taken 565 times.
✓ Branch 4 taken 201 times.
766 if (accepted(prim)) {
55
1/1
✓ Branch 1 taken 565 times.
565 owners.push_back(prim);
56 }
57 }
58
1/1
✓ Branch 1 taken 760 times.
760 m_connections.assign(prims.Size(), {});
59
1/1
✓ Branch 1 taken 760 times.
760 Read(owners);
60 789 }
61
62 789 void ConnectionCache::Read(std::span<const uint32_t> owners) {
63 789 const Prims& prims = m_structure.GetPrims();
64 789 ColumnStore& store = m_structure.GetColumnStore();
65 789 std::vector<ArrayRef> sources;
66 789 std::vector<ArrayRef> tokens;
67
2/2
✓ Branch 0 taken 577 times.
✓ Branch 1 taken 789 times.
1366 for (const uint32_t prim : owners) {
68
1/1
✓ Branch 1 taken 577 times.
577 const uint32_t row = prims.Row(prim, SchemaId::Connectable);
69
1/1
✓ Branch 1 taken 577 times.
577 sources.push_back(store.Array(kConnectableConnectionsSources, row));
70
1/1
✓ Branch 1 taken 577 times.
1154 tokens.push_back(store.Array(kConnectableConnectionsInputs, row));
71 }
72
2/2
✓ Branch 0 taken 577 times.
✓ Branch 1 taken 789 times.
1366 for (const uint32_t prim : owners) {
73 1154 tokens.push_back(
74
2/2
✓ Branch 1 taken 577 times.
✓ Branch 4 taken 577 times.
1154 store.Array(kConnectableConnectionsOutputs, prims.Row(prim, SchemaId::Connectable)));
75 }
76 789 const std::vector<std::vector<std::byte>> sourceBytes =
77
2/2
✓ Branch 1 taken 789 times.
✓ Branch 4 taken 789 times.
789 store.Arrays(ColumnType::PrimArray).Read(sources);
78 789 const std::vector<std::vector<std::byte>> tokenBytes =
79
2/2
✓ Branch 1 taken 789 times.
✓ Branch 4 taken 789 times.
789 store.Arrays(ColumnType::TokenArray).Read(tokens);
80 789 const Tokens& text = m_structure.GetTokens();
81
2/2
✓ Branch 0 taken 577 times.
✓ Branch 1 taken 789 times.
1366 for (size_t k = 0; k < owners.size(); ++k) {
82
1/1
✓ Branch 1 taken 577 times.
577 const std::vector<uint32_t> from = Items<uint32_t>(sourceBytes[k]);
83
1/1
✓ Branch 1 taken 577 times.
577 const std::vector<uint32_t> to = Items<uint32_t>(tokenBytes[k]);
84
1/1
✓ Branch 1 taken 577 times.
577 const std::vector<uint32_t> out = Items<uint32_t>(tokenBytes[owners.size() + k]);
85 577 std::vector<Connection>& connections = m_connections[owners[k]];
86 577 connections.clear();
87 577 const size_t count = std::min({from.size(), to.size(), out.size()});
88
2/2
✓ Branch 0 taken 419 times.
✓ Branch 1 taken 577 times.
996 for (size_t i = 0; i < count; ++i) {
89
4/5
✓ Branch 0 taken 418 times.
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 418 times.
✓ Branch 5 taken 418 times.
✗ Branch 6 not taken.
419 const uint32_t source = from[i] != kNoPrim && prims.Alive(from[i]) ? from[i] : kNoPrim;
90
2/2
✓ Branch 1 taken 419 times.
✓ Branch 4 taken 419 times.
838 connections.push_back({text.Text(Token{to[i]}), source, text.Text(Token{out[i]})});
91 }
92 577 }
93 789 }
94
95 }
96