chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
190 / 192
99.0%
Branches:
244 / 281
86.8%
Functions:
12 / 12
100.0%

scene/tables/instances.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #include "chrono_batch_render/scene/tables/instances.h"
3
4 #include <algorithm>
5
6 #include "chrono_batch_render/device/commands.h"
7 #include "chrono_batch_render/device/queue.h"
8 #include "chrono_batch_render/scene/kernels.h"
9 #include "chrono_batch_render/scene/records/render_tables.h"
10 #include "chrono_batch_render/scene/schema/columns.h"
11 #include "chrono_batch_render/scene/tables/kernels/instances.h"
12 #include "chrono_batch_render/stage/publish/change_set.h"
13 #include "chrono_batch_render/util/profiler.h"
14
15 namespace chrono::batch_render {
16
17 namespace {
18
19 constexpr ColumnRef kActivation[] = {kSphereRadius,
20 kCubeSize,
21 kPlaneWidth,
22 kPlaneLength,
23 kPlaneAxis,
24 kCylinderRadius,
25 kCylinderHeight,
26 kCylinderAxis,
27 kConeRadius,
28 kConeHeight,
29 kConeAxis,
30 kCapsuleRadius,
31 kCapsuleHeight,
32 kCapsuleAxis,
33 kSphereLightRadius,
34 kSphereLightTreatAsPoint,
35 kRectLightWidth,
36 kRectLightHeight,
37 kDiskLightRadius,
38 kCylinderLightLength,
39 kCylinderLightRadius,
40 kCylinderLightTreatAsLine,
41 kLightAPIVisibleInPrimaryRay,
42 kPointInstancerProtoIndices,
43 kPointInstancerIds,
44 kPointInstancerInvisibleIds,
45 kGprimDoubleSided,
46 kGprimOrientation};
47
48 constexpr ColumnRef kPlacement[] = {kPointBasedPoints, kPointInstancerOrientations,
49 kPointInstancerScales, kRenderProductCamera};
50
51 constexpr ColumnRef kLayoutInputs[] = {kPointInstancerPrototypes, kPointInstancerPositions,
52 kPrototypeAPIPrototype};
53
54 2744 const std::vector<ColumnRef>& InputColumns() {
55 5 static const std::vector<ColumnRef> inputs = [] {
56 5 std::vector<ColumnRef> columns(std::begin(kPlacement), std::end(kPlacement));
57
1/1
✓ Branch 1 taken 5 times.
5 columns.insert(columns.end(), std::begin(kActivation), std::end(kActivation));
58
1/1
✓ Branch 1 taken 5 times.
5 columns.insert(columns.end(), std::begin(kLayoutInputs), std::end(kLayoutInputs));
59 5 return columns;
60
4/5
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2739 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
2744 }();
61 2744 return inputs;
62 }
63
64 }
65
66 379 InstanceTable::InstanceTable(Structure& structure, const RenderTables& tables,
67 379 bvh::Builder& builder, uint32_t maxRefits)
68
6/6
✓ Branch 1 taken 379 times.
✓ Branch 5 taken 379 times.
✓ Branch 9 taken 379 times.
✓ Branch 13 taken 379 times.
✓ Branch 17 taken 379 times.
✓ Branch 21 taken 379 times.
2274 : m_structure(structure), m_tables(tables), m_builder(builder), m_maxRefits(maxRefits) {
69
1/1
✓ Branch 1 taken 379 times.
379 device::Device& device = structure.GetColumnStore().GetDevice();
70 379 const BvhBox unit = {{-1, -1, -1}, {1, 1, 1}};
71
2/2
✓ Branch 1 taken 379 times.
✓ Branch 4 taken 379 times.
758 m_unitBoxes = device.CreateBuffer(
72
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 379 times.
379 {.usage = device::BufferUsage::AccelBuildInput, .label = "unit box"}, std::span(&unit, 1));
73
2/3
✓ Branch 1 taken 379 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 379 times.
379 m_unitBox = builder.CreateBlas(device::AccelBoxes{.boxes = m_unitBoxes->Slice(0), .count = 1});
74
1/1
✓ Branch 1 taken 379 times.
379 device::Queue& queue = device.GetQueue();
75
1/1
✓ Branch 1 taken 379 times.
379 device::CommandEncoder encoder = queue.CreateEncoder();
76
1/4
✓ Branch 1 taken 379 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
1137 const Ref<bvh::Blas> boxes[] = {m_unitBox};
77
1/1
✓ Branch 1 taken 379 times.
379 builder.Build(encoder, boxes);
78
2/2
✓ Branch 1 taken 379 times.
✓ Branch 4 taken 379 times.
379 queue.Submit(encoder.Finish());
79 1895 }
80
81 2744 std::span<const ColumnRef> InstanceTable::Inputs() const {
82 2744 return InputColumns();
83 }
84
85 790 void InstanceTable::Run(const ChangeSet& changes, TableVersions& versions) {
86
4/5
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 785 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
790 CHRONO_BATCH_RENDER_ZONE("Instances/Run");
87
2/2
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 300 times.
790 ColumnStore& store = m_structure.GetColumnStore();
88
2/2
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 300 times.
790 const uint64_t seen = store.WriteSequence();
89
4/6
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 300 times.
✓ Branch 2 taken 490 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 490 times.
✗ Branch 5 not taken.
790 bool relaid = changes.resync || !m_tlas || m_structure.CompositionVersion() != m_compositions;
90 490 bool restacked = false;
91
2/2
✓ Branch 0 taken 484 times.
✓ Branch 1 taken 6 times.
490 if (!relaid &&
92
1/1
✓ Branch 1 taken 490 times.
490 (std::ranges::any_of(kLayoutInputs,
93 1465 [&](ColumnRef column) { return store.LastWrite(column) > m_seen; }) ||
94
3/3
✓ Branch 1 taken 484 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 482 times.
484 store.LastWrite(kPointInstancerInvisibleIds) > m_seen)) {
95
1/1
✓ Branch 1 taken 8 times.
8 std::vector<Instancer> fresh = GatherInstancers();
96
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
8 if (fresh != m_instancers) {
97 5 const bool counts =
98 5 std::ranges::equal(fresh, m_instancers, [](const Instancer& a, const Instancer& b) {
99
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 return a.prim == b.prim && a.world == b.world && a.native == b.native &&
100
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 a.roots == b.roots;
101 });
102 5 m_instancers = std::move(fresh);
103
4/5
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
5 relaid = !counts || !Restack();
104 5 restacked = !relaid;
105
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 time.
3 } else if (store.LastWrite(kPointInstancerInvisibleIds) > m_seen) {
106
1/1
✓ Branch 1 taken 2 times.
2 relaid = !Restack();
107 2 restacked = !relaid;
108 }
109 8 }
110
2/2
✓ Branch 0 taken 489 times.
✓ Branch 1 taken 301 times.
790 std::set<uint32_t> structural;
111
6/6
✓ Branch 0 taken 489 times.
✓ Branch 1 taken 301 times.
✓ Branch 2 taken 308 times.
✓ Branch 3 taken 181 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 298 times.
790 if (!relaid && (changes.structure || !changes.apis.empty())) {
112
3/3
✓ Branch 1 taken 191 times.
✓ Branch 3 taken 181 times.
✓ Branch 4 taken 10 times.
191 if (std::optional<std::set<uint32_t>> touched = Apply(changes)) {
113 181 structural = std::move(*touched);
114 } else {
115 relaid = true;
116 191 }
117 }
118
2/2
✓ Branch 0 taken 311 times.
✓ Branch 1 taken 479 times.
790 if (relaid) {
119
1/1
✓ Branch 1 taken 311 times.
311 Relayout();
120 }
121
2/2
✓ Branch 0 taken 317 times.
✓ Branch 1 taken 473 times.
790 if (relaid || restacked) {
122
2/2
✓ Branch 1 taken 317 times.
✓ Branch 4 taken 317 times.
634 versions.Record(TableId::Instances, std::vector<uint32_t>{kGlobalWorld});
123 }
124
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 784 times.
790 const uint32_t tlases = m_regions.Size();
125
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 784 times.
790 if (restacked) {
126
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 for (uint32_t tlas = 0; tlas < tlases; ++tlas) {
127
1/1
✓ Branch 1 taken 6 times.
6 structural.insert(tlas);
128 }
129 }
130
1/1
✓ Branch 1 taken 790 times.
790 std::set<uint32_t> touched = structural;
131 790 const bool global =
132
8/8
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 311 times.
✓ Branch 3 taken 479 times.
✓ Branch 5 taken 475 times.
✓ Branch 6 taken 4 times.
✓ Branch 8 taken 475 times.
✓ Branch 10 taken 27 times.
✓ Branch 11 taken 448 times.
790 relaid || store.LastWrite(kRenderProductCamera) > m_seen || changes.Global();
133
4/4
✓ Branch 1 taken 27 times.
✓ Branch 4 taken 763 times.
✓ Branch 6 taken 792 times.
✓ Branch 7 taken 790 times.
1582 for (const uint32_t world : global ? std::vector<uint32_t>{kGlobalWorld} : changes.worlds) {
134
1/1
✓ Branch 1 taken 792 times.
1584 touched.merge(Tlases(world));
135 ✗ }
136
1/1
✓ Branch 1 taken 790 times.
790 const std::vector<uint32_t> dirty(touched.begin(), touched.end());
137 1079 const auto written = [&](std::span<const ColumnRef> columns) {
138 289 return std::ranges::any_of(
139 5406 columns, [&](ColumnRef column) { return store.LastWrite(column) > m_seen; });
140 790 };
141
6/6
✓ Branch 1 taken 790 times.
✓ Branch 4 taken 313 times.
✓ Branch 6 taken 301 times.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 260 times.
✓ Branch 9 taken 41 times.
1404 const bool activated = changes.Wrote(TableId::Imageables) || changes.Wrote(TableId::Meshes) ||
142
7/8
✓ Branch 0 taken 313 times.
✓ Branch 1 taken 477 times.
✓ Branch 3 taken 301 times.
✓ Branch 6 taken 260 times.
✓ Branch 8 taken 260 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 83 times.
✓ Branch 11 taken 177 times.
1611 changes.Wrote(TableId::Points) || changes.Wrote(TableId::Curves) ||
143
1/1
✓ Branch 1 taken 260 times.
260 written(kActivation);
144
6/6
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 299 times.
✓ Branch 2 taken 172 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 41 times.
✓ Branch 5 taken 131 times.
645 const bool placed = relaid || restacked || activated || !structural.empty() ||
145
6/6
✓ Branch 1 taken 172 times.
✓ Branch 4 taken 41 times.
✓ Branch 6 taken 34 times.
✓ Branch 7 taken 7 times.
✓ Branch 8 taken 19 times.
✓ Branch 9 taken 15 times.
247 changes.Wrote(TableId::Transforms) || changes.Wrote(TableId::MeshPoints) ||
146
3/3
✓ Branch 1 taken 34 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 3 times.
53 changes.Wrote(TableId::PointsMoved) ||
147
7/8
✓ Branch 0 taken 473 times.
✓ Branch 1 taken 317 times.
✓ Branch 3 taken 19 times.
✓ Branch 6 taken 16 times.
✓ Branch 8 taken 13 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
838 changes.Wrote(TableId::CurvesMoved) || written(kPlacement) ||
148
1/1
✓ Branch 1 taken 13 times.
13 written(kLayoutInputs);
149 790 m_seen = seen;
150
151 790 m_stats = {};
152 790 m_stats.tlases = tlases;
153 790 m_stats.instances = 0;
154
2/2
✓ Branch 0 taken 967 times.
✓ Branch 1 taken 790 times.
1757 for (const uint32_t count : m_regions.Counts()) {
155 967 m_stats.instances += count;
156 }
157 790 m_stats.relaid = relaid;
158
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 if (dirty.empty()) {
159 return;
160 }
161
162 790 std::vector<uint32_t> built;
163 790 std::vector<uint32_t> refit;
164 790 uint32_t widest = 0;
165
2/2
✓ Branch 0 taken 914 times.
✓ Branch 1 taken 790 times.
1704 for (const uint32_t tlas : dirty) {
166
2/2
✓ Branch 0 taken 790 times.
✓ Branch 1 taken 124 times.
914 const uint32_t count = m_regions.Counts()[tlas];
167
2/2
✓ Branch 0 taken 790 times.
✓ Branch 1 taken 124 times.
914 widest = std::max(widest, m_regions.Capacity(tlas));
168 914 m_stats.written += count;
169
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 901 times.
914 if (!placed) {
170 13 continue;
171 }
172
6/6
✓ Branch 0 taken 173 times.
✓ Branch 1 taken 728 times.
✓ Branch 3 taken 169 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 168 times.
✓ Branch 6 taken 1 time.
901 if (relaid || activated || structural.contains(tlas) || m_refits[tlas] >= m_maxRefits) {
173
1/1
✓ Branch 1 taken 733 times.
733 built.push_back(tlas);
174 733 m_refits[tlas] = 0;
175 } else {
176
1/1
✓ Branch 1 taken 168 times.
168 refit.push_back(tlas);
177 168 ++m_refits[tlas];
178 }
179 }
180
2/2
✓ Branch 0 taken 619 times.
✓ Branch 1 taken 171 times.
790 m_stats.built = uint32_t(built.size());
181
2/2
✓ Branch 0 taken 619 times.
✓ Branch 1 taken 171 times.
790 if (!built.empty()) {
182 619 std::vector<uint32_t> rebuilt;
183
2/2
✓ Branch 0 taken 733 times.
✓ Branch 1 taken 619 times.
1352 for (const uint32_t tlas : built) {
184
3/3
✓ Branch 0 taken 127 times.
✓ Branch 1 taken 606 times.
✓ Branch 3 taken 733 times.
860 rebuilt.push_back(TlasWorld(tlas, m_worlds));
185 }
186
1/1
✓ Branch 1 taken 619 times.
619 versions.Record(TableId::Slots, rebuilt);
187 619 }
188
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 785 times.
790 m_stats.refit = uint32_t(refit.size());
189
190
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 785 times.
790 device::Device& device = store.GetDevice();
191
4/5
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 785 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
790 static const profiler::ZoneId zone = profiler::ZoneId::Named("Instances/Write");
192
1/1
✓ Branch 1 taken 790 times.
790 const Ref<device::Buffer> dirtyBuffer = device.CreateBuffer({.label = "dirty TLASes"}, dirty);
193 790 InstanceParams params{};
194 1580 params.scene.address = store.DeviceData();
195
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.layout.address = m_layout->Address();
196
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.instances.address = m_records.Address();
197
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.shapes.address = m_shapes.Address();
198
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.tlases.address = dirtyBuffer->Address();
199
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.hits.address = m_hits.Address();
200
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.origins.address = m_renderOrigins.Address();
201 790 params.transforms = m_tables.transforms;
202 790 params.imageables = m_tables.imageables;
203 790 params.meshes = m_tables.meshes;
204 790 params.points = m_tables.points;
205 790 params.curves = m_tables.curves;
206
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 params.slotWorlds.address = m_slotWorlds.Address();
207
1/1
✓ Branch 1 taken 790 times.
790 params.unitBox = m_unitBox->Handle();
208
209
1/1
✓ Branch 1 taken 790 times.
790 device::Queue& queue = device.GetQueue();
210
1/1
✓ Branch 1 taken 790 times.
790 device::CommandEncoder encoder = queue.CreateEncoder();
211 790 OriginParams origins{};
212
1/1
✓ Branch 1 taken 790 times.
790 origins.scene.address = store.DeviceData();
213
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 origins.layout.address = m_layout->Address();
214 790 origins.products.address = m_productBuffer->Address();
215
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 origins.origins.address = m_renderOrigins.Address();
216
2/2
✓ Branch 0 taken 508 times.
✓ Branch 1 taken 282 times.
790 origins.viewers.address = m_viewers->Address();
217 790 origins.transforms = m_tables.transforms;
218
2/2
✓ Branch 0 taken 508 times.
✓ Branch 1 taken 282 times.
790 origins.productCount = uint32_t(m_products.size());
219 790 origins.tlasCount = tlases;
220
2/2
✓ Branch 0 taken 508 times.
✓ Branch 1 taken 282 times.
790 if (!m_products.empty()) {
221
3/3
✓ Branch 1 taken 508 times.
✓ Branch 4 taken 508 times.
✓ Branch 7 taken 508 times.
1016 encoder.Dispatch(Kernels().Entry("GatherViewers"), origins,
222 {.x = kViewerGroups, .y = origins.productCount});
223 }
224
3/3
✓ Branch 1 taken 790 times.
✓ Branch 4 taken 790 times.
✓ Branch 7 taken 790 times.
790 encoder.Dispatch(Kernels().Entry("PlaceOrigins"), origins,
225
1/1
✓ Branch 1 taken 790 times.
790 {.x = device::GroupCount(tlases, kInstanceGroup)});
226
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 if (widest > 0) {
227
1/1
✓ Branch 1 taken 790 times.
790 const device::ZoneScope scope(encoder, zone);
228
3/3
✓ Branch 1 taken 790 times.
✓ Branch 4 taken 790 times.
✓ Branch 7 taken 790 times.
790 encoder.Dispatch(
229
2/2
✓ Branch 1 taken 790 times.
✓ Branch 4 taken 790 times.
790 Kernels().Entry("WriteInstances"), params,
230
1/1
✓ Branch 1 taken 790 times.
790 {.x = device::GroupCount(widest, kInstanceGroup), .y = uint32_t(dirty.size())});
231 790 }
232 790 const device::BufferRange counts =
233
1/1
✓ Branch 1 taken 790 times.
790 LayoutWords(m_header.instanceCounts.address, 0, m_regions.Size());
234
2/2
✓ Branch 0 taken 619 times.
✓ Branch 1 taken 171 times.
790 if (!built.empty()) {
235
1/1
✓ Branch 1 taken 619 times.
619 m_builder.Build(encoder, *m_tlas, *m_records.Buffer(), counts, built);
236 }
237
2/2
✓ Branch 0 taken 632 times.
✓ Branch 1 taken 158 times.
790 if (refit.empty()) {
238
2/2
✓ Branch 1 taken 632 times.
✓ Branch 4 taken 632 times.
632 queue.Submit(encoder.Finish());
239 632 return;
240 }
241
1/1
✓ Branch 1 taken 158 times.
158 m_builder.SubmitRefit(std::move(encoder), *m_tlas, *m_records.Buffer(), counts, refit);
242 3792 }
243
244 1450 std::set<uint32_t> InstanceTable::Tlases(uint32_t world) const {
245
2/2
✓ Branch 0 taken 1398 times.
✓ Branch 1 taken 52 times.
1450 std::set<uint32_t> tlases;
246
2/2
✓ Branch 0 taken 1398 times.
✓ Branch 1 taken 52 times.
1450 if (world == kGlobalWorld) {
247
2/2
✓ Branch 0 taken 1615 times.
✓ Branch 1 taken 1398 times.
3013 for (uint32_t tlas = 0; tlas < m_regions.Size(); ++tlas) {
248
1/1
✓ Branch 1 taken 1615 times.
1615 tlases.insert(tlas);
249 }
250 1398 return tlases;
251 }
252
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
52 if (world < m_worlds) {
253
1/1
✓ Branch 1 taken 52 times.
52 tlases.insert(world);
254 }
255
2/2
✓ Branch 0 taken 104 times.
✓ Branch 1 taken 52 times.
156 for (const auto* map : {&m_shownIn, &m_watch}) {
256
2/2
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 103 times.
104 if (const auto found = map->find(world); found != map->end()) {
257
1/1
✓ Branch 1 taken 1 time.
1 tlases.insert(found->second.begin(), found->second.end());
258 }
259 }
260 52 return tlases;
261 ✗ }
262
263 790 void InstanceTable::Describe(RenderTables& tables) const {
264
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 tables.instances.address = m_layout ? m_layout->Address() : 0;
265
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 tables.origins.address = m_renderOrigins.Address();
266
1/2
✓ Branch 0 taken 790 times.
✗ Branch 1 not taken.
790 tables.slotWorlds.address = m_slotWorlds.Address();
267 790 }
268
269 978 void InstanceTable::Hold(std::vector<Ref<const RefCounted>>& held) const {
270
4/8
✓ Branch 1 taken 6846 times.
✓ Branch 2 taken 978 times.
✓ Branch 3 taken 6839 times.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
8802 HoldBuffers(held, {m_layout, m_records.Buffer(), m_shapes.Buffer(), m_hits.Buffer(),
271 978 m_slotWorlds.Buffer(), m_instancing, m_renderOrigins.Buffer()});
272
2/2
✓ Branch 0 taken 977 times.
✓ Branch 1 taken 1 time.
978 if (m_tlas) {
273 977 held.emplace_back(m_tlas);
274 }
275
1/2
✓ Branch 0 taken 978 times.
✗ Branch 1 not taken.
978 if (m_unitBox) {
276 978 held.emplace_back(m_unitBox);
277 }
278 1956 }
279
280 353 void InstanceTable::Prepare() {
281 353 Kernels();
282 353 }
283
284 2441 device::Program& InstanceTable::Kernels() {
285
2/2
✓ Branch 0 taken 379 times.
✓ Branch 1 taken 2062 times.
2441 if (!m_program) {
286
2/2
✓ Branch 2 taken 379 times.
✓ Branch 5 taken 379 times.
1137 m_program = m_structure.GetColumnStore().GetDevice().CreateProgram(
287 {.modules = {"chrono_batch_render.scene.tables.kernels.instances"},
288 .library = &kSceneKernels,
289 .entries = {"WriteInstances", "GatherViewers", "PlaceOrigins"},
290
2/3
✓ Branch 1 taken 379 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 379 times.
758 .label = "instances"});
291 }
292 2441 return *m_program;
293 758 }
294
295 }
296