chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
32 / 35
91.4%
Branches:
27 / 35
77.1%
Functions:
2 / 2
100.0%

render/sensor_pipelines.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #include "chrono_batch_render/render/sensor_pipelines.h"
3
4 #include <algorithm>
5 #include <map>
6 #include <string>
7 #include <utility>
8 #include <vector>
9
10 #include "chrono_batch_render/render/kernels.h"
11 #include "chrono_batch_render/util/error.h"
12 #include "chrono_batch_render/util/text.h"
13
14 namespace chrono::batch_render {
15
16 std::shared_ptr<const CompiledSensorPipeline>
17 34 CompileSensorPipeline(device::Device& device,
18 std::shared_ptr<const sensor_pipeline::SensorPipelineDefinition> definition,
19 const sensor_pipeline::NodeRegistry& registry) {
20 34 auto compiled = std::make_shared<CompiledSensorPipeline>();
21
1/1
✓ Branch 1 taken 34 times.
34 compiled->generated = sensor_pipeline::GenerateSensorPipeline(*definition, registry);
22 34 std::map<std::string, std::string, std::less<>> sources = {
23
4/8
✓ Branch 1 taken 34 times.
✓ Branch 5 taken 34 times.
✓ Branch 6 taken 34 times.
✓ Branch 7 taken 34 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
68 {compiled->generated.path, compiled->generated.source}};
24 34 std::vector<std::pair<std::string, std::string>> files;
25
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 34 times.
172 for (const sensor_pipeline::ResolvedNode& node : definition->pipeline.nodes) {
26 138 const sensor_pipeline::NodeDef& def = registry[node.def];
27
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 8 times.
138 if (def.code.source.empty()) {
28 130 continue;
29 }
30
1/1
✓ Branch 1 taken 8 times.
8 const std::string path = ModulePath(def.code.module);
31
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
8 if (std::ranges::find(files, path, &std::pair<std::string, std::string>::first) ==
32
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
8 files.end()) {
33
1/1
✓ Branch 1 taken 5 times.
5 sources.emplace(path, def.code.source);
34
1/1
✓ Branch 1 taken 5 times.
5 files.emplace_back(path, def.code.file);
35 }
36 8 }
37 34 try {
38
3/3
✓ Branch 1 taken 34 times.
✓ Branch 4 taken 34 times.
✓ Branch 7 taken 34 times.
136 compiled->program = device.CreateProgram({.modules = {compiled->generated.module},
39 .library = &kRenderKernels,
40 .sources = sources,
41
1/1
✓ Branch 1 taken 34 times.
34 .entries = compiled->generated.Entries(),
42
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 .label = "sensor pipeline"});
43 ✗ } catch (const Error& error) {
44
0/3
✗ Branch 3 not taken.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✗ throw Error("{}", MapOrigins(error.what(), files));
45 ✗ }
46 68 compiled->definition = std::move(definition);
47 34 return compiled;
48 136 }
49
50 81 void RecordSensorPipeline(device::CommandEncoder& encoder, const CompiledSensorPipeline& compiled,
51 const SensorPipelineParams& params, uint32_t captures,
52 uint64_t elements) {
53
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 81 times.
230 for (const sensor_pipeline::GeneratedKernel& step : compiled.generated.kernels) {
54 149 device::Kernel& kernel = compiled.program->Entry(step.entry);
55 149 const sensor_pipeline::DispatchShape shape = step.shape;
56
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 111 times.
149 const uint64_t threads = shape == sensor_pipeline::DispatchShape::Elements ? elements
57 : shape == sensor_pipeline::DispatchShape::ReduceGroups
58
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 25 times.
38 ? uint64_t(captures) * kReduceGroups * kPipelineGroup
59 : captures;
60 149 encoder.Dispatch(kernel, params,
61 device::FoldGroups(device::GroupCount(threads, kPipelineGroup)));
62 149 encoder.Barrier();
63 }
64 81 }
65
66 }
67