glshim updated, added latest changes by ptitSeb

This commit is contained in:
lubomyr
2015-10-29 01:17:00 +02:00
parent 7ab4a4db8b
commit 88977dc7bb
8 changed files with 169 additions and 17 deletions

View File

@@ -36,6 +36,7 @@
#define skip_glUnmapBuffer
#define skip_glGetBufferParameteriv
#define skip_glGetBufferSubData
#define skip_glGetPointerv
#define skip_glBlendColor
#define skip_glBlendFunc

View File

@@ -331,3 +331,88 @@ void glGetBufferSubDataARB(GLenum target, GLintptr offset, GLsizeiptr size, GLvo
void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid ** params) {
glGetBufferPointerv(target, pname, params);
}
// VAO ****************
static GLuint lastvao = 1;
void glGenVertexArrays(GLsizei n, GLuint *arrays) {
//printf("glGenVertexArrays(%i, %p)\n", n, arrays);
noerrorShim();
if (n<1) {
errorShim(GL_INVALID_VALUE);
return;
}
for (int i=0; i<n; i++) {
arrays[i] = lastvao++;
}
}
void glBindVertexArray(GLuint array) {
//printf("glBindVertexArray(%u)\n", array);
khint_t k;
int ret;
khash_t(glvao) *list = state.vaos;
if (! list) {
list = state.vaos = kh_init(glvao);
// segfaults if we don't do a single put
kh_put(glvao, list, 1, &ret);
kh_del(glvao, list, 1);
}
// check if needs to copy the data to current vao
if ((state.bindedvao!=NULL) && (state.bindedvao->array!=array))
{
memcpy(&state.bindedvao->pointers, &state.pointers, sizeof(state.pointers));
}
// if array = 0 => unbind buffer!
if (array == 0) {
// unbind buffer
state.bindedvao = NULL;
} else {
// search for an existing buffer
k = kh_get(glvao, list, array);
glvao_t *glvao = NULL;
if (k == kh_end(list)){
k = kh_put(glvao, list, array, &ret);
glvao = kh_value(list, k) = malloc(sizeof(glvao_t));
glvao->array = array;
// new vao is binded to nothing
memset(&glvao->pointers, 0, sizeof(glvao->pointers));
} else {
glvao = kh_value(list, k);
}
state.bindedvao = glvao;
memcpy(&state.pointers, &glvao->pointers, sizeof(state.pointers));
}
noerrorShim();
}
void glDeleteVertexArrays(GLsizei n, const GLuint *arrays) {
//printf("glDeleteVertexArrays(%i, %p)\n", n, arrays);
khash_t(glvao) *list = state.vaos;
if (list) {
khint_t k;
glvao_t *glvao;
for (int i = 0; i < n; i++) {
GLuint t = arrays[i];
k = kh_get(glvao, list, t);
if (k != kh_end(list)) {
glvao = kh_value(list, k);
kh_del(glvao, list, k);
free(glvao);
}
}
}
noerrorShim();
}
GLboolean glIsVertexArray(GLuint array) {
//printf("glIsVertexArray(%u)\n", array);
khash_t(glvao) *list = state.vaos;
khint_t k;
noerrorShim();
if (list) {
k = kh_get(glvao, list, array);
if (k != kh_end(list)) {
return GL_TRUE;
}
}
return GL_FALSE;
}

View File

@@ -3,6 +3,7 @@
#ifndef GL_BUFFERS_H
#define GL_BUFFERS_H
// VBO *****************
typedef struct {
GLuint buffer;
GLenum type;
@@ -41,4 +42,31 @@ GLboolean glUnmapBufferARB(GLenum target);
void glGetBufferSubDataARB(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data);
void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid ** params);
// Pointer..... ******
typedef struct {
GLint size;
GLenum type;
GLsizei stride;
glbuffer_t *buffer;
const GLvoid *pointer;
} pointer_state_t;
typedef struct {
pointer_state_t vertex, color, normal, tex_coord[MAX_TEX], secondary;
} pointer_states_t;
// VAO ****************
typedef struct {
GLuint array;
pointer_states_t pointers;
} glvao_t;
KHASH_MAP_INIT_INT(glvao, glvao_t*)
void glGenVertexArrays(GLsizei n, GLuint *arrays);
void glBindVertexArray(GLuint array);
void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
GLboolean glIsVertexArray(GLuint array);
#endif

View File

@@ -286,6 +286,10 @@
#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
#define GL_INDEX_ARRAY_POINTER 0x8091
#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
#define GL_SELECTION_BUFFER_POINTER 0x0DF3
// evaluators
#define GL_AUTO_NORMAL 0x0D80

View File

@@ -84,6 +84,7 @@ const GLubyte *glGetString(GLenum name) {
case GL_EXTENSIONS:
return (const GLubyte *)(char *){
"GL_ARB_vertex_buffer_object "
"GL_ARB_vertex_array_object "
"GL_ARB_vertex_buffer "
"GL_EXT_vertex_array "
"GL_EXT_secondary_color "
@@ -1790,3 +1791,34 @@ void glEdgeFlagPointer(GLsizei stride, const GLvoid * pointer) {
warning = true;
}
}
void glGetPointerv(GLenum pname, GLvoid* *params) {
noerrorShim();
switch(pname) {
case GL_COLOR_ARRAY_POINTER:
*params = state.pointers.color.pointer;
break;
case GL_EDGE_FLAG_ARRAY_POINTER:
*params = NULL;
break;
case GL_FEEDBACK_BUFFER_POINTER:
*params = NULL;
break;
case GL_INDEX_ARRAY_POINTER:
*params = NULL;
case GL_NORMAL_ARRAY_POINTER:
*params = state.pointers.normal.pointer;
break;
case GL_TEXTURE_COORD_ARRAY_POINTER:
*params = state.pointers.tex_coord[state.texture.client].pointer;
break;
case GL_SELECTION_BUFFER_POINTER:
*params = state.selectbuf.buffer;
break;
case GL_VERTEX_ARRAY_POINTER :
*params = state.pointers.vertex.pointer;
break;
default:
errorShim(GL_INVALID_ENUM);
}
}

View File

@@ -430,6 +430,7 @@ static inline const GLboolean valid_vertex_type(GLenum type) {
extern void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
extern void glIndexPointer(GLenum type, GLsizei stride, const GLvoid * pointer);
extern void glEdgeFlagPointer(GLsizei stride, const GLvoid * pointer);
extern void glGetPointerv(GLenum pname, GLvoid* *params);
extern void glFlush();
extern void glFinish();

View File

@@ -56,20 +56,6 @@ typedef struct {
GLuint client; // client active texture
} texture_state_t;
typedef struct {
GLint size;
GLenum type;
GLsizei stride;
glbuffer_t *buffer;
const GLvoid *pointer;
} pointer_state_t;
typedef struct {
pointer_state_t vertex, color, normal, tex_coord[MAX_TEX], secondary;
} pointer_states_t;
typedef struct {
renderlist_t *active;
GLboolean compiling;
@@ -164,6 +150,8 @@ typedef struct {
matrixstack_t **texture_matrix;
selectbuf_t selectbuf;
buffers_t buffers;
khash_t(glvao) *vaos;
glvao_t *bindedvao;
int shim_error;
GLenum last_error;
GLuint gl_batch;

View File

@@ -104,6 +104,16 @@ void *glXGetProcAddressARB(const char *name) {
ARB(glGetBufferParameteriv);
EX(glGetBufferSubData);
ARB(glGetBufferSubData);
// GL_ARB_vertex_array_object
EX(glGenVertexArrays);
EX(glBindVertexArray);
EX(glDeleteVertexArrays);
EX(glIsVertexArray);
ARB(glGenVertexArrays);
ARB(glBindVertexArray);
ARB(glDeleteVertexArrays);
ARB(glIsVertexArray);
// GL_ARB_frameBuffer_ext
EX(glFramebufferTexture1D);
@@ -175,9 +185,12 @@ void *glXGetProcAddressARB(const char *name) {
EXT(glNormalPointer);
EXT(glColorPointer);
EX(glIndexPointer); //TODO, stub for now
EXT(glIndexPointer);
EXT(glTexCoordPointer);
EX(glEdgeFlagPointer); //TODO, stub for now
//EXT(glGetPointerv); //TODO
EXT(glEdgeFlagPointer);
EX(glGetPointerv);
EXT(glGetPointerv);
// OES wrapper
@@ -461,8 +474,8 @@ void *glXGetProcAddressARB(const char *name) {
STUB(glSelectBuffer); //TODO
STUB(glFogCoordPointer);
STUB(glEdgeFlagPointerEXT);
STUB(glIndexPointerEXT);
/*STUB(glEdgeFlagPointerEXT);
STUB(glIndexPointerEXT);*/
printf("glXGetProcAddress: %s not found.\n", name);
return NULL;