GCC Code Coverage Report


./
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
52 of 58, 0 excluded
89.7%
Functions:
6 of 6, 0 excluded
100.0%
Branches:
45 of 85, 0 excluded
52.9%

libs/core/src/eu/core/uniform_buffer.cc
Line Branch Exec Source
1 #include "eu/core/uniform_buffer.h"
2
3 namespace eu::core
4 {
5
6 using UniformBufferDescription = std::vector<UniformProp>;
7
8 /// returns the size in bytes
9 16 int size_of(const UniformProp& prop, bool align)
10 {
11 16 constexpr int n = 4; // in bytes
12 16 constexpr int n2 = n * 2;
13 16 constexpr int n4 = n * 4;
14
5/7
✓ Branch 2 → 3 taken 14 times.
✓ Branch 2 → 4 taken 2 times.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 7 not taken.
✓ Branch 5 → 8 taken 4 times.
✓ Branch 5 → 9 taken 6 times.
✗ Branch 5 → 13 not taken.
16 switch (prop.array_count == 1 ? prop.type : UniformType::vec4)
15 {
16 6 case UniformType::bool_type:
17 case UniformType::int_type:
18 case UniformType::float_type:
19 6 return n;
20 case UniformType::vec2: return n2;
21 4 case UniformType::vec3:
22 case UniformType::vec4:
23 4 return n4;
24
2/2
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 11 taken 3 times.
6 case UniformType::mat4: return n4 * (align ? 1 : 4);
25 default: DIE("invalid uniform type"); return 0;
26 }
27 }
28
29 8 int calculate_alignment_bytes(int current_size, const UniformProp& prop)
30 {
31 8 const auto size = size_of(prop, true);
32 8 const auto mod = current_size % size;
33
2/2
✓ Branch 3 → 4 taken 7 times.
✓ Branch 3 → 5 taken 1 time.
8 if (mod == 0)
34 {
35 7 return 0;
36 }
37
38 1 const auto to_add = size - mod;
39
1/6
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 12 taken 1 time.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 14 not taken.
1 ASSERT((to_add + mod) % size == 0);
40 1 return to_add;
41 }
42
43 2 std::string source_from(const std::string& name, const UniformBufferDescription& desc)
44 {
45 8 const auto string_from_type = [](UniformType t)
46 {
47
5/8
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 4 taken 1 time.
✓ Branch 2 → 5 taken 2 times.
✗ Branch 2 → 6 not taken.
✓ Branch 2 → 7 taken 1 time.
✗ Branch 2 → 8 not taken.
✓ Branch 2 → 9 taken 3 times.
✗ Branch 2 → 10 not taken.
8 switch (t)
48 {
49 1 case UniformType::bool_type: return "bool";
50 1 case UniformType::int_type: return "int";
51 2 case UniformType::float_type: return "float";
52 case UniformType::vec2: return "vec2";
53 1 case UniformType::vec3: return "vec3";
54 case UniformType::vec4: return "vec4";
55 3 case UniformType::mat4: return "mat4";
56 default: DIE("invalid uniform type"); return "unhandled_type";
57 }
58 };
59
1/2
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 34 not taken.
2 std::ostringstream ss;
60
3/6
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 32 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 32 not taken.
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 32 not taken.
2 ss << "layout (std140) uniform " << name << "\n";
61 ss << "{"
62
2/4
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 32 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 32 not taken.
2 << "\n";
63
2/2
✓ Branch 23 → 10 taken 8 times.
✓ Branch 23 → 24 taken 2 times.
10 for (const auto& p: desc)
64 {
65
5/10
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 31 not taken.
✓ Branch 12 → 13 taken 8 times.
✗ Branch 12 → 31 not taken.
✓ Branch 13 → 14 taken 8 times.
✗ Branch 13 → 31 not taken.
✓ Branch 14 → 15 taken 8 times.
✗ Branch 14 → 31 not taken.
✓ Branch 15 → 16 taken 8 times.
✗ Branch 15 → 31 not taken.
8 ss << "\t" << string_from_type(p.type) << " " << p.name;
66
2/2
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 20 taken 7 times.
8 if (p.array_count > 1)
67 {
68
3/6
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 31 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 31 not taken.
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 31 not taken.
1 ss << "[" << p.array_count << "]";
69 }
70
1/2
✓ Branch 20 → 21 taken 8 times.
✗ Branch 20 → 31 not taken.
8 ss << ";\n";
71 }
72 ss << "};"
73
2/4
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 32 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 32 not taken.
2 << "\n";
74
1/2
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 32 not taken.
4 return ss.str();
75 2 }
76
77 8 void UniformBufferCompiler::add(CompiledUniformProp* target, UniformType type, const std::string& name, int array_count)
78 {
79
2/6
✓ Branch 2 → 3 taken 8 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 8 times.
✗ Branch 3 → 6 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
8 props.emplace_back(UniformProp{target, type, name, array_count});
80 8 }
81
82 2 UniformBufferSetup UniformBufferCompiler::compile(const std::string& name, int binding_point) const
83 {
84 2 UniformBufferSetup target;
85 2 target.size = 0;
86 2 target.binding_point = binding_point;
87
1/2
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 19 not taken.
2 target.name = name;
88
1/2
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 17 not taken.
2 target.source = source_from(name, props);
89
2/2
✓ Branch 14 → 9 taken 8 times.
✓ Branch 14 → 15 taken 2 times.
10 for (const auto& p: props)
90 {
91
1/2
✓ Branch 10 → 11 taken 8 times.
✗ Branch 10 → 18 not taken.
8 const auto size = size_of(p, false);
92
1/2
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 18 not taken.
8 target.size += calculate_alignment_bytes(target.size, p);
93 8 *p.target = {target.size, p.type, p.array_count};
94 8 target.size += size * p.array_count;
95 }
96
97 2 return target;
98 }
99
100 } // namespace eu::render
101