diff options
author | Dan Gudmundsson <dgud@erlang.org> | 2023-03-07 16:21:08 +0100 |
---|---|---|
committer | Dan Gudmundsson <dgud@erlang.org> | 2023-04-02 08:54:36 +0200 |
commit | b5c48b2aa1e2d208556a6feb728ae2ec7189cab6 (patch) | |
tree | 176b652d18500b9daa2a462c0e51149c30b6656b | |
parent | e1a5238f4ca16a03f428bd0566d4e767a9a16326 (diff) | |
download | erlang-b5c48b2aa1e2d208556a6feb728ae2ec7189cab6.tar.gz |
wx: Add debug printouts for OpenGL
-rw-r--r-- | lib/wx/api_gen/gl_gen_erl.erl | 8 | ||||
-rw-r--r-- | lib/wx/c_src/egl_impl.c | 17 | ||||
-rw-r--r-- | lib/wx/c_src/wxe_gl.cpp | 39 | ||||
-rw-r--r-- | lib/wx/c_src/wxe_gl.h | 2 | ||||
-rw-r--r-- | lib/wx/c_src/wxe_nif.c | 10 | ||||
-rw-r--r-- | lib/wx/src/gen/gl.erl | 11 | ||||
-rw-r--r-- | lib/wx/src/wxe_master.erl | 5 | ||||
-rw-r--r-- | lib/wx/src/wxe_util.erl | 6 |
8 files changed, 71 insertions, 27 deletions
diff --git a/lib/wx/api_gen/gl_gen_erl.erl b/lib/wx/api_gen/gl_gen_erl.erl index b2c3ae2112..2852da9656 100644 --- a/lib/wx/api_gen/gl_gen_erl.erl +++ b/lib/wx/api_gen/gl_gen_erl.erl @@ -88,8 +88,8 @@ gl_api(Fs, _GluNifs) -> w("-on_load(init_nif/0).~n",[]), w("~n-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), - w("-export([get_interface/0, rec/1, lookup_func/0]).\n",[]), - w("-nifs([lookup_func/0]).\n",[]), + w("-export([get_interface/0, rec/1, lookup_func/1]).\n",[]), + w("-nifs([lookup_func_nif/1]).\n",[]), w("-define(nif_stub,nif_stub_error(?LINE)).~n", []), w("%% @hidden~n", []), w("nif_stub_error(Line) ->~n" @@ -118,7 +118,9 @@ gl_api(Fs, _GluNifs) -> w(" error_logger:error_report([{gl, error}, {message, lists:flatten(Err)}]),~n", []), w(" rec(Op)~n", []), w(" end.~n~n", []), - w("lookup_func() -> ?nif_stub.\n\n",[]), + w("lookup_func(functions) -> lookup_func_nif(1);\n",[]), + w("lookup_func(function_names) -> lookup_func_nif(2).\n\n",[]), + w("lookup_func_nif(_Func) -> ?nif_stub.\n\n",[]), w("~n", []), w("~n", []), diff --git a/lib/wx/c_src/egl_impl.c b/lib/wx/c_src/egl_impl.c index 7fe58a040d..84e1601a7f 100644 --- a/lib/wx/c_src/egl_impl.c +++ b/lib/wx/c_src/egl_impl.c @@ -51,7 +51,7 @@ ERL_NIF_TERM EGL_ATOM_BADARG; static ErlNifFunc egl_funcs[] = { - {"lookup_func", 0, egl_lookup_func_func} + {"lookup_func_nif", 1, egl_lookup_func_func} }; static int egl_init(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM arg) { @@ -142,9 +142,22 @@ void * egl_lookup_func(int op) return gl_fns[op-GLE_LIB_START].nif_cb; } +const char * egl_lookup_func_desc(int op) +{ + return gl_fns[op-GLE_LIB_START].name; +} + + ERL_NIF_TERM egl_lookup_func_func(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { - egl_uword func = (egl_uword) egl_lookup_func; + egl_uword func = 0; + unsigned int which; + if(!(enif_get_uint(env, argv[0], &which)) && !(which == 1 || which == 2)) + return enif_make_badarg(env); + if(which == 1) + func = (egl_uword) egl_lookup_func; + if(which == 2) + func = (egl_uword) egl_lookup_func_desc; if(sizeof(void *) == sizeof(unsigned int)) return enif_make_uint(env, (unsigned int) func); else diff --git a/lib/wx/c_src/wxe_gl.cpp b/lib/wx/c_src/wxe_gl.cpp index 46c4cc7679..7ad6abb659 100644 --- a/lib/wx/c_src/wxe_gl.cpp +++ b/lib/wx/c_src/wxe_gl.cpp @@ -44,16 +44,25 @@ int egl_initiated = 0; wxeGLC glc; typedef void * (*WXE_GL_LOOKUP) (int); -WXE_GL_LOOKUP wxe_gl_lookup_func = NULL; +void * wxe_not_loaded(int x); +WXE_GL_LOOKUP wxe_gl_lookup_func = (WXE_GL_LOOKUP) wxe_not_loaded; typedef void * (*WXE_GL_FUNC) (ErlNifEnv*, ErlNifPid*, const ERL_NIF_TERM argv[]); +typedef const char * (*WXE_GL_FUNC_NAME) (int); +WXE_GL_FUNC_NAME wxe_gl_lookup_func_name; + extern "C" { -void wxe_initOpenGL(void * fptr) { +void wxe_initOpenGL(void * fptr, void *name_fptr) { wxe_gl_lookup_func = (WXE_GL_LOOKUP) fptr; + wxe_gl_lookup_func_name = (WXE_GL_FUNC_NAME) name_fptr; enif_set_pid_undefined(&gl_active_pid); } } +void * wxe_not_loaded(int x) { + return NULL; +} + ErlNifUInt64 wxe_make_hash(ErlNifEnv *env, ErlNifPid *pid) { ERL_NIF_TERM term = enif_make_pid(env, pid); @@ -113,9 +122,23 @@ void no_context(wxeCommand *event) { enif_clear_env(event->env); } -void gl_dispatch(wxeCommand *event) { +void gl_print_cmd(wxeCommand *event) +{ + int i; + const char *func = wxe_gl_lookup_func_name(event->op); + enif_fprintf(stderr, " %T %d %s(", event->caller, event->op, func); + for(i=0; i < event->argc; i++) { + wx_print_term(event->env, event->args[i]); + if(i < event->argc - 1) + enif_fprintf(stderr, ", "); + } + enif_fprintf(stderr, ")\r\n"); +} + +void gl_dispatch(wxeCommand *event) +{ WXE_GL_FUNC fptr; - if(egl_initiated) { + if((fptr = (WXE_GL_FUNC) wxe_gl_lookup_func(event->op))) { if(enif_compare_pids(&(event->caller),&gl_active_pid) != 0) { ErlNifUInt64 caller_index = wxe_make_hash(event->env, &(event->caller)); wxe_glc * current = glc[caller_index]; @@ -131,12 +154,10 @@ void gl_dispatch(wxeCommand *event) { return; } } - } else { - no_context(event); - return; - } - if((fptr = (WXE_GL_FUNC) wxe_gl_lookup_func(event->op))) { // enif_fprintf(stderr, "GL: caller %T gl_active %T %d\r\n", event->caller, gl_active_pid, event->op); + if(wxe_debug) { + gl_print_cmd(event); + } fptr(event->env, &event->caller, event->args); } else { enif_send(NULL, &event->caller, event->env, diff --git a/lib/wx/c_src/wxe_gl.h b/lib/wx/c_src/wxe_gl.h index 6c57e1b645..612432c22f 100644 --- a/lib/wx/c_src/wxe_gl.h +++ b/lib/wx/c_src/wxe_gl.h @@ -27,7 +27,7 @@ void setActiveGL(wxeMemEnv *memenv, ErlNifPid caller, wxGLCanvas *canvas, wxGLCo void deleteActiveGL(wxGLCanvas *canvas); void gl_dispatch(wxeCommand *); extern "C" { - void wxe_initOpenGL(void * fptr); + void wxe_initOpenGL(void * fptr, void *name_fptr); } diff --git a/lib/wx/c_src/wxe_nif.c b/lib/wx/c_src/wxe_nif.c index 6f6251e482..6d9ed300ac 100644 --- a/lib/wx/c_src/wxe_nif.c +++ b/lib/wx/c_src/wxe_nif.c @@ -65,7 +65,7 @@ ERL_NIF_TERM WXE_ATOM_wxPrintDialogData; ErlNifResourceType* wxeMemEnvRt = NULL; int wxe_debug = 0; -extern void wxe_initOpenGL(void * fptr); +extern void wxe_initOpenGL(void * fptr, void *debug); // void destroyMemEnv(wxeMemEnv *memenv); @@ -127,9 +127,13 @@ static ERL_NIF_TERM wx_setup_cmd(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar static ERL_NIF_TERM wx_init_opengl(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { void * fptr; + void * debug; if(!get_ptr(env, argv[0], &fptr)) return enif_make_badarg(env); - wxe_initOpenGL(fptr); + if(!get_ptr(env, argv[1], &debug)) + return enif_make_badarg(env); + + wxe_initOpenGL(fptr, debug); return WXE_ATOM_ok; } @@ -198,7 +202,7 @@ static ErlNifFunc nif_funcs[] = {"queue_cmd",13, wx_setup_cmd}, {"queue_cmd",14, wx_setup_cmd}, {"queue_cmd",15, wx_setup_cmd}, - {"init_opengl", 1, wx_init_opengl}, + {"init_opengl", 2, wx_init_opengl}, {"make_env", 0, wxe_make_env}, {"delete_env", 1, wxe_delete_env}, {"debug_driver", 1, wxe_debug_driver}, diff --git a/lib/wx/src/gen/gl.erl b/lib/wx/src/gen/gl.erl index d1c6e76937..e5ac08290c 100644 --- a/lib/wx/src/gen/gl.erl +++ b/lib/wx/src/gen/gl.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2022. All Rights Reserved. +%% Copyright Ericsson AB 2008-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -299,8 +299,8 @@ bindAttribLocationARB/3,getActiveAttribARB/3,getAttribLocationARB/2, blendBarrierKHR/0,maxShaderCompilerThreadsKHR/1,depthBoundsEXT/2]). --export([get_interface/0, rec/1, lookup_func/0]). --nifs([lookup_func/0]). +-export([get_interface/0, rec/1, lookup_func/1]). +-nifs([lookup_func_nif/1]). -define(nif_stub,nif_stub_error(?LINE)). %% @hidden nif_stub_error(Line) -> @@ -332,7 +332,10 @@ rec(Op) -> rec(Op) end. -lookup_func() -> ?nif_stub. +lookup_func(functions) -> lookup_func_nif(1); +lookup_func(function_names) -> lookup_func_nif(2). + +lookup_func_nif(_Func) -> ?nif_stub. diff --git a/lib/wx/src/wxe_master.erl b/lib/wx/src/wxe_master.erl index 5724457ae7..dd6eb4f159 100644 --- a/lib/wx/src/wxe_master.erl +++ b/lib/wx/src/wxe_master.erl @@ -80,8 +80,9 @@ init_opengl() -> case get(wx_init_opengl) of true -> {ok, "already initialized"}; _ -> - Opaque = gl:lookup_func(), - {ok, wxe_util:init_opengl(Opaque)} + Opaque = gl:lookup_func(functions), + Debug = gl:lookup_func(function_names), + {ok, wxe_util:init_opengl(Opaque, Debug)} end. %%-------------------------------------------------------------------- diff --git a/lib/wx/src/wxe_util.erl b/lib/wx/src/wxe_util.erl index 1d5f15f131..4f123ffc09 100644 --- a/lib/wx/src/wxe_util.erl +++ b/lib/wx/src/wxe_util.erl @@ -37,14 +37,14 @@ queue_cmd/11,queue_cmd/12,queue_cmd/13,queue_cmd/14,queue_cmd/15, make_env/0, delete_env/1, get_consts/0, debug_ping/0, debug_driver/1, - init_opengl/1 + init_opengl/2 ]). -nifs([queue_cmd/1,queue_cmd/2,queue_cmd/3,queue_cmd/4,queue_cmd/5, queue_cmd/6,queue_cmd/7,queue_cmd/8,queue_cmd/9,queue_cmd/10, queue_cmd/11,queue_cmd/12,queue_cmd/13,queue_cmd/14,queue_cmd/15, make_env/0, delete_env/1, debug_driver/1, get_consts_impl/0, - init_opengl/1 + init_opengl/2 ]). -export([priv_dir/2, opt_error_log/3, init_nif/1]). @@ -85,7 +85,7 @@ get_consts() -> get_consts_impl(), rec(?WXE_GET_CONSTS). -init_opengl(_) -> ?NIF_ERROR. +init_opengl(_,_) -> ?NIF_ERROR. get_consts_impl() -> ?NIF_ERROR. debug_ping() -> queue_cmd(?WXE_DEBUG_PING). |