naev 0.11.5
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)))
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 /* Allocate. */
72 gl_vbo *vbo = calloc( 1, sizeof(gl_vbo) );
73
74 /* General stuff. */
75 vbo->size = size;
76
77 /* Create the buffer. */
78 glGenBuffers( 1, &vbo->id );
79
80 /* Upload the data. */
81 glBindBuffer( target, vbo->id );
82 glBufferData( target, size, data, usage );
83 glBindBuffer( target, 0 );
84
85 /* Check for errors. */
86 gl_checkErr();
87
88 return vbo;
89}
90
98void gl_vboData( gl_vbo *vbo, GLsizei size, const void* data )
99{
100 GLenum usage;
101
102 vbo->size = size;
103
104 /* Get usage. */
105 if (vbo->type == NGL_VBO_STREAM)
106 usage = GL_STREAM_DRAW;
107 else if (vbo->type == NGL_VBO_DYNAMIC)
108 usage = GL_DYNAMIC_DRAW;
109 else if (vbo->type == NGL_VBO_STATIC)
110 usage = GL_STATIC_DRAW;
111 else
112 usage = GL_STREAM_DRAW;
113
114 /* Get new data. */
115 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
116 glBufferData( GL_ARRAY_BUFFER, size, data, usage );
117
118 /* Check for errors. */
119 gl_checkErr();
120}
121
130void gl_vboSubData( gl_vbo *vbo, GLint offset, GLsizei size, const void* data )
131{
132 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
133 glBufferSubData( GL_ARRAY_BUFFER, offset, size, data );
134
135 /* Check for errors. */
136 gl_checkErr();
137}
138
145gl_vbo* gl_vboCreateStream( GLsizei size, const void* data )
146{
147 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW );
148 vbo->type = NGL_VBO_STREAM;
149
150 /* Check for errors. */
151 gl_checkErr();
152
153 return vbo;
154}
155
162gl_vbo* gl_vboCreateDynamic( GLsizei size, const void* data )
163{
164 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW );
165 vbo->type = NGL_VBO_DYNAMIC;
166
167 /* Check for errors. */
168 gl_checkErr();
169
170 return vbo;
171}
172
179gl_vbo* gl_vboCreateStatic( GLsizei size, const void* data )
180{
181 gl_vbo *vbo = gl_vboCreate( GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW );
182 vbo->type = NGL_VBO_STATIC;
183
184 /* Check for errors. */
185 gl_checkErr();
186
187 return vbo;
188}
189
196void* gl_vboMap( gl_vbo *vbo )
197{
198 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
199 return glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
200}
201
207void gl_vboUnmap( gl_vbo *vbo )
208{
209 (void) vbo;
210 glUnmapBuffer( GL_ARRAY_BUFFER );
211
212 /* Check for errors. */
213 gl_checkErr();
214}
215
226void gl_vboActivateAttribOffset( gl_vbo *vbo, GLuint index, GLuint offset,
227 GLint size, GLenum type, GLsizei stride )
228{
229 const GLvoid *pointer;
230
231 /* Set up. */
232 glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
233 pointer = BUFFER_OFFSET(offset);
234
235 glVertexAttribPointer( index, size, type, GL_FALSE, stride, pointer );
236
237 /* Check for errors. */
238 gl_checkErr();
239}
240
246void gl_vboDestroy( gl_vbo *vbo )
247{
248 if (vbo == NULL)
249 return;
250
251 glDeleteBuffers( 1, &vbo->id );
252 gl_checkErr();
253 free(vbo);
254}
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:246
gl_vbo * gl_vboCreateStream(GLsizei size, const void *data)
Creates a stream vbo.
Definition opengl_vbo.c:145
void gl_vboUnmap(gl_vbo *vbo)
Unmaps a buffer.
Definition opengl_vbo.c:207
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:196
gl_vbo * gl_vboCreateDynamic(GLsizei size, const void *data)
Creates a dynamic vbo.
Definition opengl_vbo.c:162
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:226
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:98
void gl_vboSubData(gl_vbo *vbo, GLint offset, GLsizei size, const void *data)
Loads some data into the VBO.
Definition opengl_vbo.c:130
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:179
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