GCC Code Coverage Report


./
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
0 of 39, 0 excluded
0.0%
Functions:
0 of 8, 0 excluded
0.0%
Branches:
0 of 30, 0 excluded
0.0%

libs/render/src/eu/render/uniform_buffer.cc
Line Branch Exec Source
1 #include "eu/render/uniform_buffer.h"
2
3 #include "eu/render/opengl_labels.h"
4 #include "eu/render/opengl_utils.h"
5
6 namespace eu::render
7 {
8
9 namespace
10 {
11 const UniformBuffer* bound_buffer = nullptr;
12 } // namespace
13
14 BoundUniformBuffer::BoundUniformBuffer(UniformBuffer* b)
15 : buffer(b)
16 {
17 ASSERT(bound_buffer == nullptr);
18 bound_buffer = b;
19 glBindBuffer(GL_UNIFORM_BUFFER, b->id);
20 }
21
22 BoundUniformBuffer::~BoundUniformBuffer()
23 {
24 ASSERT(bound_buffer == buffer);
25 bound_buffer = nullptr;
26 glBindBuffer(GL_UNIFORM_BUFFER, 0);
27 }
28
29 UniformBuffer::UniformBuffer(DEBUG_LABEL_ARG_MANY const core::UniformBufferSetup& setup)
30 : id(create_buffer())
31 {
32 auto bound = BoundUniformBuffer{this};
33 SET_DEBUG_LABEL_NAMED(id, DebugLabelFor::Buffer, fmt::format("UNI B {}", debug_label));
34
35 // Changed to a dynamic draw due to:
36 // Using glBufferSubData(...) to update a GL_STATIC_DRAW buffer
37 // Performance Severity: medium
38 // todo(Gustav): profile? provide a hint in an argument?
39 glBufferData(GL_UNIFORM_BUFFER, setup.size, nullptr, GL_DYNAMIC_DRAW);
40 glBindBufferBase(GL_UNIFORM_BUFFER, gluint_from_int(setup.binding_point), id);
41 }
42
43 UniformBuffer::~UniformBuffer()
44 {
45 unload();
46 }
47
48 UniformBuffer::UniformBuffer(UniformBuffer&& rhs) noexcept
49 : id(rhs.id)
50 {
51 rhs.id = 0;
52 }
53
54 UniformBuffer& UniformBuffer::operator=(UniformBuffer&& rhs) noexcept
55 {
56 unload();
57 id = rhs.id;
58 rhs.id = 0;
59 return *this;
60 }
61
62 // clears the loaded buffer to a invalid buffer
63 void UniformBuffer::unload()
64 {
65 if (id == 0)
66 {
67 return;
68 }
69
70 destroy_buffer(id);
71 id = 0;
72 }
73
74 void UniformBuffer::set_mat4(const core::CompiledUniformProp& prop, const m4& m) // NOLINT(readability-convert-member-functions-to-static)
75 {
76 // todo(Gustav): verify that the prop belongs to self
77 ASSERT(prop.type == core::UniformType::mat4 && prop.array_count == 1);
78 glBufferSubData(GL_UNIFORM_BUFFER, prop.offset, 16 * sizeof(float), m.get_column_major_data_ptr());
79 }
80
81 } // namespace eu::render
82