From abc92a6f3b4615e596992eda153da0c09a3c7cbf Mon Sep 17 00:00:00 2001 From: Dan Gudmundsson Date: Fri, 19 Nov 2010 14:57:59 +0100 Subject: Fix non available opengl functions Opengl functions are loaded at runtime and differ with drivers and cards. --- lib/wx/api_gen/gl_gen_c.erl | 35 ++++++++++++++++++++++++++--------- lib/wx/c_src/egl_impl.cpp | 10 ++-------- lib/wx/c_src/gen/gl_fdefs.h | 7 +++++++ lib/wx/c_src/gen/gl_finit.h | 6 +----- lib/wx/c_src/gen/gl_funcs.cpp | 14 ++++++++++++-- lib/wx/test/wx_opengl_SUITE.erl | 20 +++++++++++++++++--- 6 files changed, 65 insertions(+), 27 deletions(-) (limited to 'lib') diff --git a/lib/wx/api_gen/gl_gen_c.erl b/lib/wx/api_gen/gl_gen_c.erl index 230b853c2b..0f5cb0e1f4 100644 --- a/lib/wx/api_gen/gl_gen_c.erl +++ b/lib/wx/api_gen/gl_gen_c.erl @@ -48,20 +48,28 @@ gen(GLFuncs, GLUFuncs) -> w("#include ~n", []), w("#include ~n", []), w("#include \"../egl_impl.h\"~n", []), - w("#include \"gl_fdefs.h\"~n", []), + w("#include \"gl_fdefs.h\"~n~n", []), + w("extern gl_fns_t gl_fns[];~n~n", []), - w("~nint gl_error_op;~n", []), w("void egl_dispatch(int op, char *bp, ErlDrvPort port, " "ErlDrvTermData caller, char *bins[], int bins_sz[]){~n", []), - w(" gl_error_op = op;~n", []), - + w(" try {~n",[]), w(" switch(op)~n{~n",[]), w(" case 5000:~n erl_tess_impl(bp, port, caller);~n break;~n", []), [funcs(F) || F <- GLUFuncs], [funcs(F) || F <- GLFuncs], + w("}} catch (char *err_msg) {\n" + "int AP = 0; ErlDrvTermData rt[12];\n" + "rt[AP++] = ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) \"_egl_error_\");\n" + "rt[AP++] = ERL_DRV_INT; rt[AP++] = (int) op;\n" + "rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *) err_msg);\n" + "// rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *) gl_fns[op-GLE_GL_FUNC_START].name);\n" + "// rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;\n" + "rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3;\n" + "driver_send_term(port,caller,rt,AP);\n", []), w("}} /* The End */~n~n",[]), close(). @@ -530,6 +538,19 @@ gen_defines(GLFuncs,GLUFuncs) -> w("# define WXE_EXTERN~n", []), w("#else~n# define WXE_EXTERN extern~n", []), w("#endif~n~n", []), + + w("typedef struct {\n" + " const char * name;\n" + " const char * alt;\n" + " void * func;\n" + "} gl_fns_t;\n\n", []), + + GLFirst = case hd(GLFuncs) of + [First|_] when is_list(First) -> get(First); + First -> get(First) + end, + w("#define GLE_GL_FUNC_START ~p~n", [GLFirst#func.id]), + [fdefs(F) || F <- GLFuncs], [fdefs(F) || F <- GLUFuncs], close(). @@ -577,11 +598,7 @@ gl_gen_init(Funcs) -> open_write("../c_src/gen/gl_finit.h"), c_copyright(), w("/***** This file is generated do not edit ****/~n~n", []), - w("static struct {\n" - " const char * name;\n" - " const char * alt;\n" - " void * func;\n" - "} gl_fns[] = \n" + w("gl_fns_t gl_fns[] = \n" "{\n", []), [finits(F) || F <- Funcs], w(" { NULL, NULL, NULL}};\n",[]), diff --git a/lib/wx/c_src/egl_impl.cpp b/lib/wx/c_src/egl_impl.cpp index 87724f97dc..e2dbbb73c4 100644 --- a/lib/wx/c_src/egl_impl.cpp +++ b/lib/wx/c_src/egl_impl.cpp @@ -160,14 +160,8 @@ int load_gl_functions() { } void gl_error() { - // int AP = 0; ErlDrvTermData rt[8]; - // rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *)"_wxe_error_"); - // rt[AP++] = ERL_DRV_INT; rt[AP++] = (int) gl_error_op; - // rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *)"undef"); - // rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; - // driver_send_term(WXE_DRV_PORT,gl_active,rt,AP); - // BUGBUG - fprintf(stderr, "OpenGL Extension not available : %d\r\n", gl_error_op); + // fprintf(stderr, "OpenGL Extension not available \r\n"); + throw "undef_extension"; } /* ******************************************************************************* diff --git a/lib/wx/c_src/gen/gl_fdefs.h b/lib/wx/c_src/gen/gl_fdefs.h index c0fc338aa8..a45896d30d 100644 --- a/lib/wx/c_src/gen/gl_fdefs.h +++ b/lib/wx/c_src/gen/gl_fdefs.h @@ -24,6 +24,13 @@ # define WXE_EXTERN extern #endif +typedef struct { + const char * name; + const char * alt; + void * func; +} gl_fns_t; + +#define GLE_GL_FUNC_START 5037 typedef void (APIENTRY * WXEGLACCUM)(GLenum,GLfloat); WXE_EXTERN WXEGLACCUM weglAccum; typedef void (APIENTRY * WXEGLALPHAFUNC)(GLenum,GLclampf); diff --git a/lib/wx/c_src/gen/gl_finit.h b/lib/wx/c_src/gen/gl_finit.h index 3d707f4c18..583e36faf7 100644 --- a/lib/wx/c_src/gen/gl_finit.h +++ b/lib/wx/c_src/gen/gl_finit.h @@ -18,11 +18,7 @@ */ /***** This file is generated do not edit ****/ -static struct { - const char * name; - const char * alt; - void * func; -} gl_fns[] = +gl_fns_t gl_fns[] = { {"glAccum", NULL, &weglAccum}, {"glAlphaFunc", NULL, &weglAlphaFunc}, diff --git a/lib/wx/c_src/gen/gl_funcs.cpp b/lib/wx/c_src/gen/gl_funcs.cpp index ea82635846..30542a0f02 100644 --- a/lib/wx/c_src/gen/gl_funcs.cpp +++ b/lib/wx/c_src/gen/gl_funcs.cpp @@ -23,9 +23,10 @@ #include "../egl_impl.h" #include "gl_fdefs.h" -int gl_error_op; +extern gl_fns_t gl_fns[]; + void egl_dispatch(int op, char *bp, ErlDrvPort port, ErlDrvTermData caller, char *bins[], int bins_sz[]){ - gl_error_op = op; + try { switch(op) { case 5000: @@ -6955,5 +6956,14 @@ case 5863: { // glStencilClearTagEXT GLuint *stencilClearTag = (GLuint *) bp; bp += 4; weglStencilClearTagEXT(*stencilTagBits,*stencilClearTag); }; break; +}} catch (char *err_msg) { +int AP = 0; ErlDrvTermData rt[12]; +rt[AP++] = ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_egl_error_"); +rt[AP++] = ERL_DRV_INT; rt[AP++] = (int) op; +rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *) err_msg); +// rt[AP++] = ERL_DRV_ATOM; rt[AP++] = driver_mk_atom((char *) gl_fns[op-GLE_GL_FUNC_START].name); +// rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; +rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; +driver_send_term(port,caller,rt,AP); }} /* The End */ diff --git a/lib/wx/test/wx_opengl_SUITE.erl b/lib/wx/test/wx_opengl_SUITE.erl index 9d12711dd7..778d089bce 100644 --- a/lib/wx/test/wx_opengl_SUITE.erl +++ b/lib/wx/test/wx_opengl_SUITE.erl @@ -113,7 +113,7 @@ canvas(Config) -> Data = {?FACES,?VS}, drawBox(0, Data), ?m(ok, wxGLCanvas:swapBuffers(Canvas)), - + ?m([], flush()), Env = wx:get_env(), Tester = self(), spawn_link(fun() -> @@ -125,10 +125,23 @@ canvas(Config) -> %% This may fail when window is deleted catch draw_loop(2,Data,Canvas) end), - ?m_receive(works), + ?m([], flush()), + io:format("Undef func ~p ~n", [catch gl:uniform1d(2, 0.75)]), + timer:sleep(500), + ?m([], flush()), wx_test_lib:wx_destroy(Frame, Config). - + +flush() -> + flush([]). + +flush(Collected) -> + receive Msg -> + flush([Msg|Collected]) + after 1 -> + lists:reverse(Collected) + end. + draw_loop(Deg,Data,Canvas) -> timer:sleep(15), drawBox(Deg,Data), @@ -136,6 +149,7 @@ draw_loop(Deg,Data,Canvas) -> draw_loop(Deg+1, Data,Canvas). + drawBox(Deg,{Fs,Vs}) -> gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), -- cgit v1.2.3