chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
30 / 30
100.0%
Branches:
90 / 99
90.9%
Functions:
1 / 1, 5 excl
100.0%

stage/structure/prims.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #pragma once
3
4 #include <cstdint>
5 #include <map>
6 #include <span>
7 #include <unordered_map>
8 #include <vector>
9
10 #include "chrono_batch_render/stage/columns/column_store.h"
11 #include "chrono_batch_render/stage/schema/ids.h"
12 #include "chrono_batch_render/stage/schema/schema.h"
13
14 namespace chrono::batch_render {
15
16 24826 struct PrimRecord {
17 SchemaId schema = SchemaId::None;
18 uint32_t parent = kNoPrim;
19 uint32_t world = kGlobalWorld;
20 uint32_t flags = 0;
21 uint32_t slots = kNoRow;
22 uint32_t generation = 0;
23 uint64_t apis = 0;
24 };
25
26 struct ApiInstance {
27 uint32_t instance = 0;
28 uint32_t row = kNoRow;
29 };
30
31 struct BlockShape {
32 std::vector<SchemaId> schemas;
33 std::vector<uint32_t> parents;
34 std::vector<uint64_t> apis;
35 };
36
37 struct BlockTable {
38 SchemaId table = SchemaId::None;
39 uint32_t first = 0;
40 uint32_t perCopy = 0;
41 uint32_t count = kNoRow;
42 };
43
44
13/16
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 42 taken 1 time.
✓ Branch 49 taken 1 time.
✓ Branch 62 taken 1 time.
✓ Branch 69 taken 1 time.
✓ Branch 73 taken 1 time.
5645 struct PrimBlock {
45 uint32_t firstPrim = kNoPrim;
46 uint32_t count = 0;
47 uint32_t copies = 0;
48 uint32_t firstWorld = kGlobalWorld;
49 uint32_t worldsPerCopy = 0;
50 uint32_t firstSlot = kNoRow;
51 uint32_t slotsPerCopy = 0;
52 std::vector<BlockTable> tables;
53
54 52203 uint32_t Prim(uint32_t copy, uint32_t index) const {
55
34/36
<unknown function 16>:
✓ Branch 1 taken 24156 times.
<unknown function 44>:
✓ Branch 1 taken 250 times.
✓ Branch 1 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 1 taken 1 time.
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 3 times.
✓ Branch 4 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 2 times.
✓ Branch 7 taken 24988 times.
✓ Branch 7 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 3 times.
✓ Branch 10 taken 2 times.
✓ Branch 10 taken 1 time.
✓ Branch 13 taken 3 times.
✓ Branch 13 taken 1 time.
✓ Branch 13 taken 1 time.
✓ Branch 16 taken 4 times.
✓ Branch 16 taken 1 time.
✓ Branch 16 taken 169 times.
✓ Branch 19 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✗ Branch 22 not taken.
✓ Branch 25 taken 1 time.
✓ Branch 25 taken 1 time.
✓ Branch 28 taken 2 times.
✓ Branch 31 taken 3 times.
✓ Branch 34 taken 2 times.
✓ Branch 37 taken 3 times.
✓ Branch 40 taken 900 times.
<unknown function 54>:
✓ Branch 1 taken 1419 times.
52199 return firstPrim + copy * count + index;
56 }
57
58 388 uint32_t PrimCount() const {
59
3/3
✓ Branch 0 taken 169 times.
✓ Branch 1 taken 50 times.
✓ Branch 3 taken 169 times.
388 return count * copies;
60 }
61 };
62
63 class Prims {
64 public:
65 501 explicit Prims(ColumnStore& store) : m_store(store) {}
66
67 134708 uint32_t Size() const {
68
24/26
<unknown function 16>:
✓ Branch 1 taken 2718 times.
<unknown function 44>:
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
<unknown function 67>:
✓ Branch 0 taken 61666 times.
✓ Branch 1 taken 4363 times.
✓ Branch 2 taken 43505 times.
✓ Branch 3 taken 2558 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 283 times.
✓ Branch 5 taken 1620 times.
✓ Branch 6 taken 26 times.
✓ Branch 6 taken 2167 times.
✓ Branch 7 taken 1872 times.
✓ Branch 7 taken 7935 times.
✓ Branch 8 taken 283 times.
✓ Branch 8 taken 331 times.
✓ Branch 9 taken 2167 times.
✓ Branch 10 taken 193 times.
✓ Branch 10 taken 311 times.
✓ Branch 12 taken 311 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 311 times.
✓ Branch 16 taken 2167 times.
✓ Branch 17 taken 311 times.
chrono::batch_render::Prims::Prims(chrono::batch_render::ColumnStore&):
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 6 times.
134708 return uint32_t(m_records.size());
69 }
70
71 115 uint32_t LiveCount() const {
72
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
115 return m_live;
73 }
74
75 13860 uint32_t WorldCount() const {
76
14/16
<unknown function 44>:
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
<unknown function 67>:
✓ Branch 0 taken 431 times.
✓ Branch 0 taken 5 times.
✓ Branch 0 taken 181 times.
✓ Branch 1 taken 444 times.
✓ Branch 1 taken 186 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 311 times.
✓ Branch 3 taken 331 times.
<unknown function 75>:
✓ Branch 1 taken 1167 times.
chrono::batch_render::Prims::Prims(chrono::batch_render::ColumnStore&):
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
13860 return m_worldCount;
77 }
78
79 bool Alive(uint32_t prim) const;
80 uint32_t Generation(uint32_t prim) const;
81 const PrimRecord& Record(uint32_t prim) const;
82 uint32_t Row(uint32_t prim, SchemaId table) const;
83 uint32_t FindRow(uint32_t prim, SchemaId table) const;
84 std::vector<uint32_t> Rows(std::span<const uint32_t> prims, SchemaId table) const;
85 bool HasApi(uint32_t prim, SchemaId api) const;
86 std::span<const ApiInstance> Instances(uint32_t prim, SchemaId api) const;
87 uint32_t InstanceRow(uint32_t prim, SchemaId api, uint32_t instance) const;
88
89 PrimBlock Add(const BlockShape& shape, std::span<const uint32_t> parents,
90 uint32_t reuseWorld = kGlobalWorld, bool pageAligned = false);
91 void CheckRemovable(uint32_t prim) const;
92 void Remove(uint32_t prim);
93 BlockTable Apply(std::span<const uint32_t> prims, SchemaId api);
94 void Unapply(std::span<const uint32_t> prims, SchemaId api);
95 BlockTable ApplyInstance(std::span<const uint32_t> prims, SchemaId api, uint32_t instance);
96 void UnapplyInstance(std::span<const uint32_t> prims, SchemaId api, uint32_t instance);
97 void StageLinks(std::span<const uint32_t> prims, SchemaId api);
98 std::vector<BlockTable> Retype(uint32_t prim, SchemaId schema, uint64_t apis);
99 void Reparent(uint32_t prim, uint32_t parent);
100 void Renew(uint32_t prim);
101 void MarkSession(uint32_t prim);
102 bool Session(uint32_t prim) const;
103
104 private:
105 void Check(const BlockShape& shape, std::span<const uint32_t> parents) const;
106 PrimBlock AllocateOne(SchemaId schema, uint64_t apis);
107 PrimBlock AllocateBlock(const BlockShape& shape, uint32_t copies, bool pageAligned);
108 void Write(uint32_t prim, const PrimRecord& record, std::span<const uint32_t> rows);
109 void StageRecord(uint32_t prim);
110 uint32_t AcquireSlots(uint32_t count);
111 void Regroup(uint32_t prim, uint64_t apis, SchemaId api, uint32_t row);
112 void ReleaseRow(SchemaId table, uint32_t row);
113 void SetHead(uint32_t prim, SchemaId api, uint32_t row);
114
115 ColumnStore& m_store;
116 std::vector<PrimRecord> m_records;
117 std::vector<uint32_t> m_slotRows;
118 std::vector<uint32_t> m_freePrims;
119 std::map<uint32_t, std::vector<uint32_t>> m_freeSlots;
120 std::unordered_map<uint64_t, std::vector<ApiInstance>> m_instances;
121 uint32_t m_live = 0;
122 uint32_t m_worldCount = 0;
123 };
124
125 }
126