naev 0.12.5
opengl_vbo.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
9#include "opengl.h"
10
11#define BUFFER_OFFSET( i ) \
12 ( (char *)( sizeof( char ) * ( i ) ) )
13
23
27struct gl_vbo_s {
28 GLuint id;
30 GLsizei size;
31 char *data;
32};
33
37static gl_vbo *gl_vboCreate( GLenum target, GLsizei size, const void *data,
38 GLenum usage );
39
45int gl_initVBO( void )
46{
47 return 0;
48}
49
53void gl_exitVBO( void )
54{
55}
56
66static gl_vbo *gl_vboCreate( GLenum target, GLsizei size, const void *data,
67 GLenum usage )
68{
69 /* Allocate. */
70 gl_vbo *vbo = calloc( 1, sizeof( gl_vbo ) );
71
72 /* General stuff. */
73 vbo->size = size;
74
75 /* Create the buffer. */
76 glGenBuffers( 1, &vbo->id );
77
78 /* Upload the data. */
79 glBindBuffer( target, vbo->id );
80 glBufferData( target, size, data, usage );
81 glBindBuffer( target, 0 );
82
83 /* Check for errors. */
84 gl_checkErr();
85
86 return vbo;
87}
88
96void gl_vboData( gl_vbo *vbo, GLsizei size, const void *data )
97{
98 GLenum usage;
99
100 vbo->size = size;
101
102 /* Get usage. */
103 if ( vbo->type == NGL_VBO_STREAM )
104 usage = GL_STREAM_DRAW;
105 else if ( vbo->type == NGL_VBO_DYNAMIC )
106 usage = GL_DYNAMIC_DRAW;
107 else if ( vbo->type == NGL_VBO_STATIC )
108 usage = GL_STATIC_DRAW;
109 else
110 usage = GL_STREAM_DRAW;
111
112 /* Get new data. */
113 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
114 glBufferData( GL_ARRAY_BUFFER, size, data, usage );
115
116 /* Check for errors. */
117 gl_checkErr();
118}
119
128void gl_vboSubData( gl_vbo *vbo, GLint offset, GLsizei size, const void *data )
129{
130 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
131 glBufferSubData( GL_ARRAY_BUFFER, offset, size, data );
132
133 /* Check for errors. */
134 gl_checkErr();
135}
136
143gl_vbo *gl_vboCreateStream( GLsizei size, const void *data )
144{
145 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW );
146 vbo->type = NGL_VBO_STREAM;
147
148 /* Check for errors. */
149 gl_checkErr();
150
151 return vbo;
152}
153
160gl_vbo *gl_vboCreateDynamic( GLsizei size, const void *data )
161{
162 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW );
163 vbo->type = NGL_VBO_DYNAMIC;
164
165 /* Check for errors. */
166 gl_checkErr();
167
168 return vbo;
169}
170
177gl_vbo *gl_vboCreateStatic( GLsizei size, const void *data )
178{
179 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW );
180 vbo->type = NGL_VBO_STATIC;
181
182 /* Check for errors. */
183 gl_checkErr();
184
185 return vbo;
186}
187
194void *gl_vboMap( gl_vbo *vbo )
195{
196 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
197 return glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
198}
199
205void gl_vboUnmap( gl_vbo *vbo )
206{
207 (void)vbo;
208 glUnmapBuffer( GL_ARRAY_BUFFER );
209
210 /* Check for errors. */
211 gl_checkErr();
212}
213
224void gl_vboActivateAttribOffset( gl_vbo *vbo, GLuint index, GLuint offset,
225 GLint size, GLenum type, GLsizei stride )
226{
227 const GLvoid *pointer;
228
229 /* Set up. */
230 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
231 pointer = BUFFER_OFFSET( offset );
232
233 glVertexAttribPointer( index, size, type, GL_FALSE, stride, pointer );
234
235 /* Check for errors. */
236 gl_checkErr();
237}
238
244void gl_vboDestroy( gl_vbo *vbo )
245{
246 if ( vbo == NULL )
247 return;
248
249 glDeleteBuffers( 1, &vbo->id );
250 gl_checkErr();
251 free( vbo );
252}
#define BUFFER_OFFSET(i)
Definition opengl_vbo.c:11
static gl_vbo * gl_vboCreate(GLenum target, GLsizei size, const void *data, GLenum usage)
Creates a VBO.
Definition opengl_vbo.c:66
void gl_vboDestroy(gl_vbo *vbo)
Destroys a VBO.
Definition opengl_vbo.c:244
gl_vbo * gl_vboCreateStream(GLsizei size, const void *data)
Creates a stream vbo.
Definition opengl_vbo.c:143
void gl_vboUnmap(gl_vbo *vbo)
Unmaps a buffer.
Definition opengl_vbo.c:205
int gl_initVBO(void)
Initializes the OpenGL VBO subsystem.
Definition opengl_vbo.c:45
void * gl_vboMap(gl_vbo *vbo)
Maps a buffer.
Definition opengl_vbo.c:194
gl_vbo * gl_vboCreateDynamic(GLsizei size, const void *data)
Creates a dynamic vbo.
Definition opengl_vbo.c:160
void gl_exitVBO(void)
Exits the OpenGL VBO subsystem.
Definition opengl_vbo.c:53
void gl_vboActivateAttribOffset(gl_vbo *vbo, GLuint index, GLuint offset, GLint size, GLenum type, GLsizei stride)
Activates a VBO's offset.
Definition opengl_vbo.c:224
void gl_vboData(gl_vbo *vbo, GLsizei size, const void *data)
Reloads new data or grows the size of the vbo.
Definition opengl_vbo.c:96
void gl_vboSubData(gl_vbo *vbo, GLint offset, GLsizei size, const void *data)
Loads some data into the VBO.
Definition opengl_vbo.c:128
gl_vboType
VBO types.
Definition opengl_vbo.c:17
@ NGL_VBO_STREAM
Definition opengl_vbo.c:19
@ NGL_VBO_STATIC
Definition opengl_vbo.c:21
@ NGL_VBO_NULL
Definition opengl_vbo.c:18
@ NGL_VBO_DYNAMIC
Definition opengl_vbo.c:20
gl_vbo * gl_vboCreateStatic(GLsizei size, const void *data)
Creates a stream vbo.
Definition opengl_vbo.c:177
Contains the VBO.
Definition opengl_vbo.c:27
gl_vboType type
Definition opengl_vbo.c:29
GLsizei size
Definition opengl_vbo.c:30
char * data
Definition opengl_vbo.c:31
GLuint id
Definition opengl_vbo.c:28