summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Gudmundsson <dgud@erlang.org>2023-03-07 16:21:08 +0100
committerDan Gudmundsson <dgud@erlang.org>2023-04-02 08:54:36 +0200
commitb5c48b2aa1e2d208556a6feb728ae2ec7189cab6 (patch)
tree176b652d18500b9daa2a462c0e51149c30b6656b
parente1a5238f4ca16a03f428bd0566d4e767a9a16326 (diff)
downloaderlang-b5c48b2aa1e2d208556a6feb728ae2ec7189cab6.tar.gz
wx: Add debug printouts for OpenGL
-rw-r--r--lib/wx/api_gen/gl_gen_erl.erl8
-rw-r--r--lib/wx/c_src/egl_impl.c17
-rw-r--r--lib/wx/c_src/wxe_gl.cpp39
-rw-r--r--lib/wx/c_src/wxe_gl.h2
-rw-r--r--lib/wx/c_src/wxe_nif.c10
-rw-r--r--lib/wx/src/gen/gl.erl11
-rw-r--r--lib/wx/src/wxe_master.erl5
-rw-r--r--lib/wx/src/wxe_util.erl6
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).