glshim updated, added latest changes by ptitSeb
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
#define skip_glUnmapBuffer
|
||||
#define skip_glGetBufferParameteriv
|
||||
#define skip_glGetBufferSubData
|
||||
#define skip_glGetPointerv
|
||||
|
||||
#define skip_glBlendColor
|
||||
#define skip_glBlendFunc
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user