Skip to content

Commit

Permalink
Use a single VBO for each glx object
Browse files Browse the repository at this point in the history
  • Loading branch information
xtreme8000 committed Nov 2, 2020
1 parent 255fc36 commit f1cb6d0
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 77 deletions.
111 changes: 35 additions & 76 deletions src/glx.c
Expand Up @@ -85,20 +85,10 @@ void glx_displaylist_create(struct glx_displaylist* x, bool has_color, bool has_
if(!glx_version || settings.force_displaylist) {
x->legacy = glGenLists(1);
} else {
glGenBuffers(1, x->modern + 0);

if(has_color)
glGenBuffers(1, x->modern + 1);
if(has_normal)
glGenBuffers(1, x->modern + 2);
glGenBuffers(1, &x->modern);
}
#else
glGenBuffers(1, x->modern + 0);

if(has_color)
glGenBuffers(1, x->modern + 1);
if(has_normal)
glGenBuffers(1, x->modern + 2);
glGenBuffers(1, &x->modern);
#endif
x->buffer_size = 0;
}
Expand All @@ -108,27 +98,18 @@ void glx_displaylist_destroy(struct glx_displaylist* x) {
if(!glx_version || settings.force_displaylist) {
glDeleteLists(x->legacy, 1);
} else {
glDeleteBuffers(1, x->modern + 0);

if(x->has_color)
glDeleteBuffers(1, x->modern + 1);
if(x->has_normal)
glDeleteBuffers(1, x->modern + 2);
glDeleteBuffers(1, &x->modern);
}
#else
glDeleteBuffers(1, x->modern + 0);

if(x->has_color)
glDeleteBuffers(1, x->modern + 1);
if(x->has_normal)
glDeleteBuffers(1, x->modern + 2);
glDeleteBuffers(1, &x->modern);
#endif
}

void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, void* color, void* vertex, void* normal) {
int grow_buffer = size > x->buffer_size;
x->buffer_size = max(x->buffer_size, size);
x->size = size;

#ifndef OPENGL_ES
if(!glx_version || settings.force_displaylist) {
glEnableClientState(GL_VERTEX_ARRAY);
Expand Down Expand Up @@ -161,50 +142,26 @@ void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, vo
glDisableClientState(GL_NORMAL_ARRAY);
} else {
#endif
glBindBuffer(GL_ARRAY_BUFFER, x->modern[0]);
switch(type) {
case GLX_DISPLAYLIST_NORMAL:
if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * 3 * sizeof(short), vertex, GL_DYNAMIC_DRAW);
} else {
glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 3 * sizeof(short), vertex);
}

if(x->has_color) {
glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]);
if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW);
} else {
glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color);
}
}
break;
case GLX_DISPLAYLIST_POINTS:
case GLX_DISPLAYLIST_ENHANCED:
if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * 3 * sizeof(float), vertex, GL_DYNAMIC_DRAW);
} else {
glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 3 * sizeof(float), vertex);
}

if(x->has_color) {
glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]);
if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW);
} else {
glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color);
}
}
break;
size_t len_vertex = ((type == GLX_DISPLAYLIST_NORMAL) ? sizeof(GLshort) : sizeof(GLfloat)) * 3;
size_t len_color = x->has_color ? (sizeof(GLubyte) * 4) : 0;
size_t len_normal = x->has_normal ? (sizeof(GLbyte) * 3) : 0;

glBindBuffer(GL_ARRAY_BUFFER, x->modern);

if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * (len_vertex + len_color + len_normal), NULL, GL_STATIC_DRAW);
}

glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * len_vertex, vertex);

if(x->has_color) {
glBufferSubData(GL_ARRAY_BUFFER, x->size * len_vertex, x->size * len_color, color);
}

if(x->has_normal) {
glBindBuffer(GL_ARRAY_BUFFER, x->modern[2]);
if(grow_buffer) {
glBufferData(GL_ARRAY_BUFFER, x->size * 3, normal, GL_DYNAMIC_DRAW);
} else {
glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 3, normal);
}
glBufferSubData(GL_ARRAY_BUFFER, x->size * (len_vertex + len_color), x->size * len_normal, normal);
}

glBindBuffer(GL_ARRAY_BUFFER, 0);
#ifndef OPENGL_ES
}
Expand All @@ -218,24 +175,26 @@ void glx_displaylist_draw(struct glx_displaylist* x, int type) {
} else {
#endif
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, x->modern);

size_t len_vertex = ((type == GLX_DISPLAYLIST_NORMAL) ? sizeof(GLshort) : sizeof(GLfloat)) * 3;
size_t len_color = x->has_color ? (sizeof(GLubyte) * 4) : 0;
size_t len_normal = x->has_normal ? (sizeof(GLbyte) * 3) : 0;

switch(type) {
case GLX_DISPLAYLIST_NORMAL: glVertexPointer(3, GL_SHORT, 0, NULL); break;
case GLX_DISPLAYLIST_POINTS:
case GLX_DISPLAYLIST_ENHANCED: glVertexPointer(3, GL_FLOAT, 0, NULL); break;
}

if(x->has_color) {
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, NULL);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, (const void*)(x->size * len_vertex));
}

if(x->has_normal) {
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, x->modern[2]);
glNormalPointer(GL_BYTE, 0, NULL);
}

glBindBuffer(GL_ARRAY_BUFFER, x->modern[0]);
switch(type) {
case GLX_DISPLAYLIST_NORMAL: glVertexPointer(3, GL_SHORT, 0, NULL); break;
case GLX_DISPLAYLIST_POINTS:
case GLX_DISPLAYLIST_ENHANCED: glVertexPointer(3, GL_FLOAT, 0, NULL); break;
glNormalPointer(GL_BYTE, 0, (const void*)(x->size * (len_vertex + len_color)));
}

glBindBuffer(GL_ARRAY_BUFFER, 0);
Expand Down
2 changes: 1 addition & 1 deletion src/glx.h
Expand Up @@ -30,7 +30,7 @@ extern int glx_fog;

struct glx_displaylist {
uint32_t legacy;
uint32_t modern[3];
uint32_t modern;
size_t size;
size_t buffer_size;
bool has_normal;
Expand Down

0 comments on commit f1cb6d0

Please sign in to comment.