chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
52 / 52
100.0%
Branches:
54 / 59
91.5%
Functions:
4 / 4
100.0%

scene/tables/views.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #include "chrono_batch_render/scene/tables/views.h"
3
4 #include <algorithm>
5 #include <cstdint>
6 #include <vector>
7
8 #include "chrono_batch_render/device/commands.h"
9 #include "chrono_batch_render/device/queue.h"
10 #include "chrono_batch_render/scene/kernels.h"
11 #include "chrono_batch_render/scene/records/render_tables.h"
12 #include "chrono_batch_render/scene/tables/kernels/views.h"
13 #include "chrono_batch_render/stage/publish/change_set.h"
14 #include "chrono_batch_render/util/profiler.h"
15
16 namespace chrono::batch_render {
17
18 527 void ViewTable::Describe(RenderTables& tables) const {
19
1/2
✓ Branch 0 taken 527 times.
✗ Branch 1 not taken.
527 tables.views.address = m_views ? m_views->Address() : 0;
20
1/2
✓ Branch 0 taken 527 times.
✗ Branch 1 not taken.
527 tables.viewStarts.address = m_starts ? m_starts->Address() : 0;
21 527 }
22
23 353 void ViewTable::Prepare() {
24 353 Kernels();
25 353 }
26
27 527 void ViewTable::Run(const ChangeSet&, TableVersions&) {
28
4/5
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 522 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
527 CHRONO_BATCH_RENDER_ZONE("Views/Run");
29
1/1
✓ Branch 1 taken 527 times.
527 const Prims& prims = m_structure.GetPrims();
30
1/1
✓ Branch 1 taken 527 times.
527 ColumnStore& store = m_structure.GetColumnStore();
31
1/1
✓ Branch 1 taken 527 times.
527 device::Device& device = store.GetDevice();
32
5/5
✓ Branch 1 taken 527 times.
✓ Branch 3 taken 140 times.
✓ Branch 4 taken 387 times.
✓ Branch 6 taken 527 times.
✓ Branch 9 taken 527 times.
667 std::vector<uint32_t> starts(std::max(store.Schema(SchemaId::RenderProduct).Capacity(), 1u), 0);
33 527 std::vector<ViewEntry> entries;
34
3/3
✓ Branch 1 taken 527 times.
✓ Branch 3 taken 433 times.
✓ Branch 4 taken 527 times.
960 for (const auto& product : m_products.Products()) {
35
1/1
✓ Branch 1 taken 433 times.
433 starts[prims.Row(product->prim, SchemaId::RenderProduct)] = uint32_t(entries.size());
36
2/2
✓ Branch 0 taken 471 times.
✓ Branch 1 taken 433 times.
904 for (const uint32_t sensor : product->sensors) {
37
1/1
✓ Branch 1 taken 471 times.
471 ViewEntry entry{.product = prims.Row(product->prim, SchemaId::RenderProduct),
38 .camera = kNoRow,
39 471 .distortion = kNoRow};
40
4/4
✓ Branch 1 taken 471 times.
✓ Branch 4 taken 471 times.
✓ Branch 6 taken 428 times.
✓ Branch 7 taken 43 times.
471 if (IsA(prims.Record(sensor).schema, SchemaId::Camera)) {
41
1/1
✓ Branch 1 taken 428 times.
428 entry.camera = prims.Row(sensor, SchemaId::Camera);
42
2/3
✓ Branch 1 taken 428 times.
✓ Branch 3 taken 428 times.
✗ Branch 4 not taken.
428 if (prims.HasApi(sensor, SchemaId::LensDistortionAPI)) {
43
1/1
✓ Branch 1 taken 428 times.
428 entry.distortion = prims.Row(sensor, SchemaId::LensDistortionAPI);
44 }
45 }
46
1/1
✓ Branch 1 taken 471 times.
471 entries.push_back(entry);
47 }
48 527 }
49
1/1
✓ Branch 1 taken 527 times.
527 m_count = uint32_t(entries.size());
50
4/4
✓ Branch 1 taken 527 times.
✓ Branch 4 taken 527 times.
✓ Branch 6 taken 253 times.
✓ Branch 7 taken 274 times.
780 m_starts = device.CreateBuffer({.label = "view starts"}, std::span<const uint32_t>(starts));
51
1/1
✓ Branch 1 taken 527 times.
1054 m_views = device.CreateBuffer(
52
2/2
✓ Branch 0 taken 253 times.
✓ Branch 1 taken 274 times.
527 {.bytes = std::max<uint64_t>(entries.size(), 1) * sizeof(ViewRecord), .label = "views"});
53 527 if (entries.empty()) {
54 141 return;
55 }
56
1/1
✓ Branch 1 taken 386 times.
386 const Ref<device::Buffer> list =
57
1/1
✓ Branch 1 taken 386 times.
386 device.CreateBuffer({.label = "view entries"}, std::span<const ViewEntry>(entries));
58 386 ViewParams params{};
59 386 params.cameras = m_tables.cameras;
60 386 params.distortions = m_tables.distortions;
61 386 params.products = m_tables.products;
62 386 params.entries.address = list->Address();
63 386 params.views.address = m_views->Address();
64 386 params.count = m_count;
65
1/1
✓ Branch 1 taken 386 times.
386 device::Queue& queue = device.GetQueue();
66
1/1
✓ Branch 1 taken 386 times.
386 device::CommandEncoder encoder = queue.CreateEncoder();
67
3/3
✓ Branch 1 taken 386 times.
✓ Branch 4 taken 386 times.
✓ Branch 7 taken 386 times.
386 encoder.Dispatch(Kernels().Entry("WriteViews"), params,
68
1/1
✓ Branch 1 taken 386 times.
386 {.x = device::GroupCount(m_count, kViewGroup)});
69
2/2
✓ Branch 1 taken 386 times.
✓ Branch 4 taken 386 times.
386 queue.Submit(encoder.Finish());
70 2880 }
71
72 739 device::Program& ViewTable::Kernels() {
73
2/2
✓ Branch 0 taken 353 times.
✓ Branch 1 taken 386 times.
739 if (!m_program) {
74
2/2
✓ Branch 2 taken 353 times.
✓ Branch 5 taken 353 times.
1059 m_program = m_structure.GetColumnStore().GetDevice().CreateProgram(
75 {.modules = {"chrono_batch_render.scene.tables.kernels.views"},
76 .library = &kSceneKernels,
77 .entries = {"WriteViews"},
78
2/3
✓ Branch 1 taken 353 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 353 times.
706 .label = "views"});
79 }
80 739 return *m_program;
81 706 }
82
83 }
84