diff --git a/project/jni/glshim/src/config.h b/project/jni/glshim/src/config.h index 640e5074f..153fb5e52 100755 --- a/project/jni/glshim/src/config.h +++ b/project/jni/glshim/src/config.h @@ -36,6 +36,7 @@ #define skip_glUnmapBuffer #define skip_glGetBufferParameteriv #define skip_glGetBufferSubData +#define skip_glGetPointerv #define skip_glBlendColor #define skip_glBlendFunc diff --git a/project/jni/glshim/src/gl/buffers.c b/project/jni/glshim/src/gl/buffers.c index 345b9d2c5..6ba0bdea1 100755 --- a/project/jni/glshim/src/gl/buffers.c +++ b/project/jni/glshim/src/gl/buffers.c @@ -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; iarray!=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; +} diff --git a/project/jni/glshim/src/gl/buffers.h b/project/jni/glshim/src/gl/buffers.h index 5005e7357..ce0b621b6 100755 --- a/project/jni/glshim/src/gl/buffers.h +++ b/project/jni/glshim/src/gl/buffers.h @@ -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 diff --git a/project/jni/glshim/src/gl/const.h b/project/jni/glshim/src/gl/const.h index 00678c447..4825fea52 100755 --- a/project/jni/glshim/src/gl/const.h +++ b/project/jni/glshim/src/gl/const.h @@ -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 diff --git a/project/jni/glshim/src/gl/gl.c b/project/jni/glshim/src/gl/gl.c index fd1c398fe..854fe9137 100755 --- a/project/jni/glshim/src/gl/gl.c +++ b/project/jni/glshim/src/gl/gl.c @@ -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); + } +} diff --git a/project/jni/glshim/src/gl/gl.h b/project/jni/glshim/src/gl/gl.h index 94562b1d1..dd82d580b 100755 --- a/project/jni/glshim/src/gl/gl.h +++ b/project/jni/glshim/src/gl/gl.h @@ -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(); diff --git a/project/jni/glshim/src/gl/state.h b/project/jni/glshim/src/gl/state.h index 99449cd23..b99b2c8c9 100755 --- a/project/jni/glshim/src/gl/state.h +++ b/project/jni/glshim/src/gl/state.h @@ -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; diff --git a/project/jni/glshim/src/glx/lookup.c b/project/jni/glshim/src/glx/lookup.c index 29b12ea5e..aa7634909 100755 --- a/project/jni/glshim/src/glx/lookup.c +++ b/project/jni/glshim/src/glx/lookup.c @@ -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;