SleakEngine 1.0.0
C++23 multi-backend game engine
Loading...
Searching...
No Matches
OpenGLBuffer.cpp
Go to the documentation of this file.
2#include <Core/Logger.hpp>
3#include <cstring>
4
5namespace Sleak {
6namespace RenderEngine {
7
9 Size = size;
10 Type = type;
11
12 switch (type) {
14 m_target = GL_ARRAY_BUFFER;
15 break;
17 m_target = GL_ELEMENT_ARRAY_BUFFER;
18 break;
20 m_target = GL_UNIFORM_BUFFER;
21 break;
22 default:
23 m_target = GL_ARRAY_BUFFER;
24 break;
25 }
26}
27
31
32bool OpenGLBuffer::Initialize(void* data) {
33 if (Size == 0) return false;
34
35 glGenBuffers(1, &m_buffer);
36 glBindBuffer(m_target, m_buffer);
37
38 GLenum usage = (Type == BufferType::Constant) ? GL_DYNAMIC_DRAW
39 : GL_STATIC_DRAW;
40 glBufferData(m_target, Size, data, usage);
41 glBindBuffer(m_target, 0);
42
43 bIsInitialized = true;
44 return true;
45}
46
48 // For constant buffers, bind the UBO to its assigned slot
49 if (Type == BufferType::Constant && m_buffer != 0) {
50 glBindBufferBase(GL_UNIFORM_BUFFER, Slot, m_buffer);
51 }
52}
53
54void OpenGLBuffer::Update(void* data, size_t size) {
55 if (!data || size == 0 || m_buffer == 0) return;
56
57 // Store CPU shadow copy for transform CBs (needed by shadow pass)
58 if (Type == BufferType::Constant && size <= 128) {
59 StoreCPUShadowCopy(data, size);
60 }
61
62 glBindBuffer(m_target, m_buffer);
63 glBufferSubData(m_target, 0, size, data);
64 glBindBuffer(m_target, 0);
65}
66
68 if (m_buffer != 0) {
69 glDeleteBuffers(1, &m_buffer);
70 m_buffer = 0;
71 }
72 bIsInitialized = false;
73}
74
76 if (bIsMapped || m_buffer == 0) return bIsMapped;
77
78 glBindBuffer(m_target, m_buffer);
79 Data = glMapBuffer(m_target, GL_WRITE_ONLY);
80 if (Data) {
81 bIsMapped = true;
82 return true;
83 }
84 glBindBuffer(m_target, 0);
85 return false;
86}
87
89 if (!bIsMapped) return;
90
91 glBindBuffer(m_target, m_buffer);
92 glUnmapBuffer(m_target);
93 glBindBuffer(m_target, 0);
94 Data = nullptr;
95 bIsMapped = false;
96}
97
99 return Data;
100}
101
102} // namespace RenderEngine
103} // namespace Sleak
void StoreCPUShadowCopy(const void *data, size_t size)
Copies up to 128 bytes into the inline shadow-copy storage, clamping oversized input.
void Update() override
Re-uploads the last-mapped/updated data via glBufferSubData.
bool Map() override
Maps the buffer for direct CPU writes via glMapBuffer.
OpenGLBuffer(uint32_t size, BufferType type)
bool Initialize(void *data) override
Creates the GL buffer object and uploads the initial payload, if any.
Backend-facing rendering layer shared by the four graphics backends.
BufferType
GPU buffer usage kind, drives backend binding flags and layout.
Root namespace for everything the engine exposes.
Definition Camera.hpp:10