-
Notifications
You must be signed in to change notification settings - Fork 2
/
Buffer.cpp
105 lines (76 loc) · 1.85 KB
/
Buffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <gui/Texture.h>
#include "Buffer.h"
namespace gui {
Buffer::Buffer(GLsizei width, GLsizei height, GLint format, GLenum type) :
_format(format),
_type(type),
_width(0),
_height(0),
_size(0),
_buf(0),
_mapped(0) {
// create a pixel buffer object for the buffer
glCheck(glGenBuffers(1, &_buf));
if (_buf == 0)
BOOST_THROW_EXCEPTION(GuiError() << error_message("buffer id is zero") << STACK_TRACE);
// resize buffer
resize(width, height);
}
Buffer::~Buffer()
{
OpenGl::Guard guard;
// delete buffer
glCheck(glDeleteBuffers(1, &_buf));
}
void
Buffer::loadData(Texture& texture) {
// bind buffer
glCheck(glBindBuffer(GL_PIXEL_PACK_BUFFER, _buf));
// bind texture
texture.bind();
// copy texture content into buffer
glCheck(glGetTexImage(GL_TEXTURE_2D, 0, _format, _type, 0));
// unbind texture
texture.unbind();
// unbind buffer
glCheck(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
}
void
Buffer::resize(GLsizei width, GLsizei height) {
_width = width;
_height = height;
// bind buffer
glCheck(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _buf));
// create new buffer
_size = _width*_height;
if (_format == GL_RGB)
_size *= 3;
else if (_format == GL_RGBA || _format == GL_BGRA)
_size *= 4;
glCheck(glBufferData(GL_PIXEL_UNPACK_BUFFER, _size, 0, GL_DYNAMIC_DRAW));
// unbind buffer
glCheck(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
}
void
Buffer::bind(GLenum target) const {
// bind buffer
glCheck(glBindBuffer(target, _buf));
}
void
Buffer::unbind(GLenum target) const {
// unbind buffer
glCheck(glBindBuffer(target, 0));
}
void
Buffer::unmap() {
if (_mapped) {
_mapped = 0;
// bind buffer
glCheck(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _buf));
// unmap the pixel buffer object
glCheck(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));
}
// unbind buffer
glCheck(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
}
} // namespace gui