SleakEngine
0.1.0
C++23 multi-backend game engine
Toggle main menu visibility
Loading...
Searching...
No Matches
OpenGLBuffer.cpp
Go to the documentation of this file.
1
#include "
../../include/private/Graphics/OpenGL/OpenGLBuffer.hpp
"
2
#include <
Core/Logger.hpp
>
3
#include <cstring>
4
5
namespace
Sleak
{
6
namespace
RenderEngine
{
7
8
OpenGLBuffer::OpenGLBuffer
(uint32_t size,
BufferType
type) {
9
Size
= size;
10
Type
= type;
11
12
switch
(type) {
13
case
BufferType::Vertex
:
14
m_target = GL_ARRAY_BUFFER;
15
break
;
16
case
BufferType::Index
:
17
m_target = GL_ELEMENT_ARRAY_BUFFER;
18
break
;
19
case
BufferType::Constant
:
20
m_target = GL_UNIFORM_BUFFER;
21
break
;
22
default
:
23
m_target = GL_ARRAY_BUFFER;
24
break
;
25
}
26
}
27
28
OpenGLBuffer::~OpenGLBuffer
() {
29
Cleanup
();
30
}
31
32
bool
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
47
void
OpenGLBuffer::Update
() {
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
54
void
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
67
void
OpenGLBuffer::Cleanup
() {
68
if
(m_buffer != 0) {
69
glDeleteBuffers(1, &m_buffer);
70
m_buffer = 0;
71
}
72
bIsInitialized
=
false
;
73
}
74
75
bool
OpenGLBuffer::Map
() {
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
88
void
OpenGLBuffer::Unmap
() {
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
98
void
*
OpenGLBuffer::GetData
() {
99
return
Data
;
100
}
101
102
}
// namespace RenderEngine
103
}
// namespace Sleak
Logger.hpp
OpenGLBuffer.hpp
Sleak::RenderEngine::BufferBase::Data
void * Data
Definition
BufferBase.hpp:60
Sleak::RenderEngine::BufferBase::bIsMapped
bool bIsMapped
Definition
BufferBase.hpp:61
Sleak::RenderEngine::BufferBase::Size
size_t Size
Definition
BufferBase.hpp:58
Sleak::RenderEngine::BufferBase::StoreCPUShadowCopy
void StoreCPUShadowCopy(const void *data, size_t size)
Copies up to 128 bytes into the inline shadow-copy storage, clamping oversized input.
Definition
BufferBase.hpp:49
Sleak::RenderEngine::BufferBase::Type
BufferType Type
Definition
BufferBase.hpp:57
Sleak::RenderEngine::BufferBase::Slot
int Slot
Definition
BufferBase.hpp:59
Sleak::RenderEngine::OpenGLBuffer::Update
void Update() override
Re-uploads the last-mapped/updated data via glBufferSubData.
Definition
OpenGLBuffer.cpp:47
Sleak::RenderEngine::OpenGLBuffer::~OpenGLBuffer
~OpenGLBuffer() override
Definition
OpenGLBuffer.cpp:28
Sleak::RenderEngine::OpenGLBuffer::Map
bool Map() override
Maps the buffer for direct CPU writes via glMapBuffer.
Definition
OpenGLBuffer.cpp:75
Sleak::RenderEngine::OpenGLBuffer::GetData
void * GetData() override
Definition
OpenGLBuffer.cpp:98
Sleak::RenderEngine::OpenGLBuffer::OpenGLBuffer
OpenGLBuffer(uint32_t size, BufferType type)
Definition
OpenGLBuffer.cpp:8
Sleak::RenderEngine::OpenGLBuffer::Unmap
void Unmap() override
Definition
OpenGLBuffer.cpp:88
Sleak::RenderEngine::OpenGLBuffer::Initialize
bool Initialize(void *data) override
Creates the GL buffer object and uploads the initial payload, if any.
Definition
OpenGLBuffer.cpp:32
Sleak::RenderEngine::OpenGLBuffer::Cleanup
void Cleanup() override
Definition
OpenGLBuffer.cpp:67
Sleak::ResourceBase::bIsInitialized
bool bIsInitialized
Definition
ResourceBase.hpp:19
Sleak::RenderEngine
Backend-facing rendering layer shared by the four graphics backends.
Definition
Application.hpp:60
Sleak::RenderEngine::BufferType
BufferType
GPU buffer usage kind, drives backend binding flags and layout.
Definition
BufferBase.hpp:13
Sleak::RenderEngine::BufferType::Index
@ Index
Definition
BufferBase.hpp:13
Sleak::RenderEngine::BufferType::Vertex
@ Vertex
Definition
BufferBase.hpp:13
Sleak::RenderEngine::BufferType::Constant
@ Constant
Definition
BufferBase.hpp:13
Sleak
Root namespace for everything the engine exposes.
Definition
Camera.hpp:10
src
Graphics
OpenGL
OpenGLBuffer.cpp
Generated on
for SleakEngine by
1.18.0