naev 0.10.4
opengl_vbo.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
10#include "naev.h"
13#include "log.h"
14#include "opengl.h"
15
16#define BUFFER_OFFSET(i) ((char *)(sizeof(char) * (i)))
21typedef enum gl_vboType_e {
27
31struct gl_vbo_s {
32 GLuint id;
34 GLsizei size;
35 char* data;
36};
37
41static gl_vbo* gl_vboCreate( GLenum target, GLsizei size, const void* data, GLenum usage );
42
48int gl_initVBO (void)
49{
50 return 0;
51}
52
56void gl_exitVBO (void)
57{
58}
59
69static gl_vbo* gl_vboCreate( GLenum target, GLsizei size, const void* data, GLenum usage )
70{
71 gl_vbo *vbo;
72
73 /* Allocate. */
74 vbo = calloc( 1, sizeof(gl_vbo) );
75
76 /* General stuff. */
77 vbo->size = size;
78
79 /* Create the buffer. */
80 glGenBuffers( 1, &vbo->id );
81
82 /* Upload the data. */
83 glBindBuffer( target, vbo->id );
84 glBufferData( target, size, data, usage );
85 glBindBuffer( target, 0 );
86
87 /* Check for errors. */
88 gl_checkErr();
89
90 return vbo;
91}
92
100void gl_vboData( gl_vbo *vbo, GLsizei size, const void* data )
101{
102 GLenum usage;
103
104 vbo->size = size;
105
106 /* Get usage. */
107 if (vbo->type == NGL_VBO_STREAM)
108 usage = GL_STREAM_DRAW;
109 else if (vbo->type == NGL_VBO_DYNAMIC)
110 usage = GL_DYNAMIC_DRAW;
111 else if (vbo->type == NGL_VBO_STATIC)
112 usage = GL_STATIC_DRAW;
113 else
114 usage = GL_STREAM_DRAW;
115
116 /* Get new data. */
117 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
118 glBufferData( GL_ARRAY_BUFFER, size, data, usage );
119
120 /* Check for errors. */
121 gl_checkErr();
122}
123
132void gl_vboSubData( gl_vbo *vbo, GLint offset, GLsizei size, const void* data )
133{
134 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
135 glBufferSubData( GL_ARRAY_BUFFER, offset, size, data );
136
137 /* Check for errors. */
138 gl_checkErr();
139}
140
147gl_vbo* gl_vboCreateStream( GLsizei size, const void* data )
148{
149 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW );
150 vbo->type = NGL_VBO_STREAM;
151
152 /* Check for errors. */
153 gl_checkErr();
154
155 return vbo;
156}
157
164gl_vbo* gl_vboCreateDynamic( GLsizei size, const void* data )
165{
166 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW );
167 vbo->type = NGL_VBO_DYNAMIC;
168
169 /* Check for errors. */
170 gl_checkErr();
171
172 return vbo;
173}
174
181gl_vbo* gl_vboCreateStatic( GLsizei size, const void* data )
182{
183 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW );
184 vbo->type = NGL_VBO_STATIC;
185
186 /* Check for errors. */
187 gl_checkErr();
188
189 return vbo;
190}
191
198void* gl_vboMap( gl_vbo *vbo )
199{
200 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
201 return glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
202}
203
209void gl_vboUnmap( gl_vbo *vbo )
210{
211 (void) vbo;
212 glUnmapBuffer( GL_ARRAY_BUFFER );
213
214 /* Check for errors. */
215 gl_checkErr();
216}
217
228void gl_vboActivateAttribOffset( gl_vbo *vbo, GLuint index, GLuint offset,
229 GLint size, GLenum type, GLsizei stride )
230{
231 const GLvoid *pointer;
232
233 /* Set up. */
234 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
235 pointer = BUFFER_OFFSET(offset);
236
237 glVertexAttribPointer( index, size, type, GL_FALSE, stride, pointer );
238
239 /* Check for errors. */
240 gl_checkErr();
241}
242
248void gl_vboDestroy( gl_vbo *vbo )
249{
250 if (vbo == NULL)
251 return;
252
253 glDeleteBuffers( 1, &vbo->id );
254 gl_checkErr();
255 free(vbo);
256}
Header file with generic functions and naev-specifics.
#define BUFFER_OFFSET(i)
Definition: opengl_vbo.c:16
static gl_vbo * gl_vboCreate(GLenum target, GLsizei size, const void *data, GLenum usage)
Creates a VBO.
Definition: opengl_vbo.c:69
void gl_vboDestroy(gl_vbo *vbo)
Destroys a VBO.
Definition: opengl_vbo.c:248
gl_vbo * gl_vboCreateStream(GLsizei size, const void *data)
Creates a stream vbo.
Definition: opengl_vbo.c:147
void gl_vboUnmap(gl_vbo *vbo)
Unmaps a buffer.
Definition: opengl_vbo.c:209
int gl_initVBO(void)
Initializes the OpenGL VBO subsystem.
Definition: opengl_vbo.c:48
void * gl_vboMap(gl_vbo *vbo)
Maps a buffer.
Definition: opengl_vbo.c:198
gl_vbo * gl_vboCreateDynamic(GLsizei size, const void *data)
Creates a dynamic vbo.
Definition: opengl_vbo.c:164
void gl_exitVBO(void)
Exits the OpenGL VBO subsystem.
Definition: opengl_vbo.c:56
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:228
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:100
void gl_vboSubData(gl_vbo *vbo, GLint offset, GLsizei size, const void *data)
Loads some data into the VBO.
Definition: opengl_vbo.c:132
gl_vboType
VBO types.
Definition: opengl_vbo.c:21
@ NGL_VBO_STREAM
Definition: opengl_vbo.c:23
@ NGL_VBO_STATIC
Definition: opengl_vbo.c:25
@ NGL_VBO_NULL
Definition: opengl_vbo.c:22
@ NGL_VBO_DYNAMIC
Definition: opengl_vbo.c:24
gl_vbo * gl_vboCreateStatic(GLsizei size, const void *data)
Creates a stream vbo.
Definition: opengl_vbo.c:181
Contains the VBO.
Definition: opengl_vbo.c:31
gl_vboType type
Definition: opengl_vbo.c:33
GLsizei size
Definition: opengl_vbo.c:34
char * data
Definition: opengl_vbo.c:35
GLuint id
Definition: opengl_vbo.c:32