# HG changeset patch # User John Tsiombikas # Date 1428714107 -10800 # Node ID 1a8343ea54ce80396d8fbd69ea1ec912fcab12e6 # Parent ddaa9c764030c9004a3a18cab13103ea05312944 fixed on windows diff -r ddaa9c764030 -r 1a8343ea54ce example/src/main.c --- a/example/src/main.c Wed Apr 08 02:32:22 2015 +0300 +++ b/example/src/main.c Sat Apr 11 04:01:47 2015 +0300 @@ -57,6 +57,10 @@ int x, y; unsigned int flags; + if(vr_init() == -1) { + return -1; + } + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); x = y = SDL_WINDOWPOS_UNDEFINED; @@ -72,10 +76,6 @@ glewInit(); - if(vr_init() == -1) { - return -1; - } - /* resize our window to match the HMD resolution */ win_width = vr_geti(VR_DISPLAY_WIDTH); win_height = vr_geti(VR_DISPLAY_HEIGHT); diff -r ddaa9c764030 -r 1a8343ea54ce src/mesh.c --- a/src/mesh.c Wed Apr 08 02:32:22 2015 +0300 +++ b/src/mesh.c Sat Apr 11 04:01:47 2015 +0300 @@ -9,34 +9,10 @@ const float *dist_factors); static float barrel_scale(float rad, const float *k); -/* let's avoid a glew dependency in the library just for this */ -#ifndef GL_ARRAY_BUFFER -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_STATIC_DRAW 0x88E4 -#endif - -#ifndef GL_VERSION_1_5 -static void (*glGenBuffers)(GLsizei, GLuint*); -static void (*glDeleteBuffers)(GLsizei, GLuint*); -static void (*glBufferData)(GLenum, unsigned int, const GLvoid*, GLenum); -static void (*glBindBuffer)(GLenum, GLuint); -#else -#ifndef GL_GLEXT_PROTOTYPES - -#ifndef GLAPI -#define GLAPI -#endif -#ifndef APIENTRY -#define APIENTRY -#endif - -GLAPI void APIENTRY glGenBuffers(GLsizei, GLuint*); -GLAPI void APIENTRY glDeleteBuffers(GLsizei, const GLuint*); -GLAPI void APIENTRY glBufferData(); -GLAPI void APIENTRY glBindBuffer(GLenum, GLuint); -#endif -#endif +static PFNGLGENBUFFERSARBPROC gl_gen_buffers; +static PFNGLDELETEBUFFERSARBPROC gl_delete_buffers; +static PFNGLBUFFERDATAARBPROC gl_buffer_data; +static PFNGLBINDBUFFERARBPROC gl_bind_buffer; int vrimp_mesh_init(struct mesh *m) { @@ -47,19 +23,17 @@ m->num_verts = m->num_faces = 0; m->vbo = m->ibo = 0; -#ifndef GL_VERSION_1_5 - if(!glGenBuffers) { - glGenBuffers = vrimp_glfunc("glGenBuffersARB"); - glDeleteBuffers = vrimp_glfunc("glDeleteBuffersARB"); - glBufferData = vrimp_glfunc("glBufferDataARB"); - glBindBuffer = vrimp_glfunc("glBindBufferARB"); + if(!gl_gen_buffers) { + gl_gen_buffers = (PFNGLGENBUFFERSARBPROC)vrimp_glfunc("glGenBuffersARB"); + gl_delete_buffers = (PFNGLDELETEBUFFERSARBPROC)vrimp_glfunc("glDeleteBuffersARB"); + gl_buffer_data = (PFNGLBUFFERDATAARBPROC)vrimp_glfunc("glBufferDataARB"); + gl_bind_buffer = (PFNGLBINDBUFFERARBPROC)vrimp_glfunc("glBindBufferARB"); - if(!(glGenBuffers && glDeleteBuffers && glBufferData && glBindBuffer)) { + if(!(gl_gen_buffers && gl_delete_buffers && gl_buffer_data && gl_bind_buffer)) { fprintf(stderr, "Failed to load VBO functions\n"); return -1; } } -#endif return 0; } @@ -69,8 +43,8 @@ free(m->varr); free(m->iarr); - if(m->vbo) glDeleteBuffers(1, &m->vbo); - if(m->ibo) glDeleteBuffers(1, &m->ibo); + if(m->vbo) gl_delete_buffers(1, &m->vbo); + if(m->ibo) gl_delete_buffers(1, &m->ibo); } void vrimp_mesh_draw(struct mesh *m) @@ -78,15 +52,15 @@ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glBindBuffer(GL_ARRAY_BUFFER, m->vbo); + gl_bind_buffer(GL_ARRAY_BUFFER, m->vbo); glVertexPointer(3, GL_FLOAT, sizeof(struct vertex), 0); glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), (void*)offsetof(struct vertex, tx)); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->ibo); + gl_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, m->ibo); glDrawElements(GL_TRIANGLES, m->num_faces * 3, GL_UNSIGNED_INT, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_bind_buffer(GL_ARRAY_BUFFER, 0); + gl_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, 0); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); @@ -157,12 +131,12 @@ } } - glGenBuffers(1, &m->vbo); - glGenBuffers(1, &m->ibo); - glBindBuffer(GL_ARRAY_BUFFER, m->vbo); - glBufferData(GL_ARRAY_BUFFER, num_verts * sizeof *varr, varr, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, num_tris * 3 * sizeof *iarr, iarr, GL_STATIC_DRAW); + gl_gen_buffers(1, &m->vbo); + gl_gen_buffers(1, &m->ibo); + gl_bind_buffer(GL_ARRAY_BUFFER, m->vbo); + gl_buffer_data(GL_ARRAY_BUFFER, num_verts * sizeof *varr, varr, GL_STATIC_DRAW); + gl_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, m->ibo); + gl_buffer_data(GL_ELEMENT_ARRAY_BUFFER, num_tris * 3 * sizeof *iarr, iarr, GL_STATIC_DRAW); m->prim = GL_TRIANGLES; m->num_verts = num_verts; diff -r ddaa9c764030 -r 1a8343ea54ce src/opengl.c --- a/src/opengl.c Wed Apr 08 02:32:22 2015 +0300 +++ b/src/opengl.c Sat Apr 11 04:01:47 2015 +0300 @@ -7,11 +7,6 @@ Drawable win = glXGetCurrentDrawable(); glXSwapBuffers(dpy, win); } - -void (*vrimp_glfunc(const char *name))() -{ - return glXGetProcAddress((const unsigned char*)name); -} #endif /* __unix__ */ #ifdef WIN32 @@ -20,11 +15,6 @@ HDC dc = wglGetCurrentDC(); SwapBuffers(dc); } - -void (*vrimp_glfunc(const char *name))() -{ - return (void (*)())wglGetProcAddress(name); -} #endif /* WIN32 */ #ifdef __APPLE__ @@ -34,11 +24,4 @@ * to a GLView class or whatever the fuck it's called... investigate further */ } - - -void (*vrimp_glfunc(const char *name))() -{ - /* TODO: whatever */ - return 0; -} #endif /* __APPLE__ */ diff -r ddaa9c764030 -r 1a8343ea54ce src/opengl.h --- a/src/opengl.h Wed Apr 08 02:32:22 2015 +0300 +++ b/src/opengl.h Sat Apr 11 04:01:47 2015 +0300 @@ -13,12 +13,18 @@ #include #endif +#include "glext.h" + #ifdef __unix__ #include #endif void vrimp_swap_buffers(void); -void (*vrimp_glfunc(const char *name))(); +#if defined(__unix__) +#define vrimp_glfunc(n) glXGetProcAddress(n) +#elif defined(WIN32) +#define vrimp_glfunc(n) wglGetProcAddress(n) +#endif #endif /* VR_OPENGL_H_ */ diff -r ddaa9c764030 -r 1a8343ea54ce src/vr_libovr.c --- a/src/vr_libovr.c Wed Apr 08 02:32:22 2015 +0300 +++ b/src/vr_libovr.c Sat Apr 11 04:01:47 2015 +0300 @@ -13,20 +13,13 @@ #include #include #include +#include "opengl.h" #include "opt.h" #include #include -#ifdef OVR_OS_LINUX -#include -#endif - -/* undef this if you want the retarded health and safety warning screen */ -#undef DISABLE_RETARDED_HEALTH_WARNING - -/* just dropping the prototype here to avoid including CAPI_HSWDisplay.h */ -OVR_EXPORT void ovrhmd_EnableHSWDisplaySDKRender(ovrHmd hmd, ovrBool enabled); +static PFNGLUSEPROGRAMPROC gl_use_program; static ovrHmd hmd; static void *optdb; @@ -111,6 +104,10 @@ set_option_int(optdb, VR_WIN_YOFFS, hmd->WindowsPos.y); } + if(!(gl_use_program = (PFNGLUSEPROGRAMPROC)vrimp_glfunc("glUseProgram"))) { + gl_use_program = (PFNGLUSEPROGRAMPROC)vrimp_glfunc("glUseProgramObjectARB"); + } + deferred_init_done = 0; return 0; } @@ -177,11 +174,6 @@ set_option_vec(optdb, VR_LEYE_OFFSET, leye_offs); set_option_vec(optdb, VR_REYE_OFFSET, reye_offs); } - - -#ifdef DISABLE_RETARDED_HEALTH_WARNING - ovrhmd_EnableHSWDisplaySDKRender(hmd, 0); -#endif } static void cleanup(void) @@ -314,17 +306,19 @@ static int present(void) { - int cur_prog; + int cur_prog = 0; if(!hmd) return 0; - glGetIntegerv(GL_CURRENT_PROGRAM, &cur_prog); + if(gl_use_program) { + glGetIntegerv(GL_CURRENT_PROGRAM, &cur_prog); + } ovrHmd_EndFrame(hmd, pose, &eye_tex[0].Texture); inside_begin_end = 0; - if(cur_prog) { - /*glUseProgram(0);*/ + if(gl_use_program) { + gl_use_program(cur_prog); } return 1;