From 25b7134a43ae31782ea417395c964d24a7e5236f Mon Sep 17 00:00:00 2001 From: klemek Date: Thu, 14 May 2026 00:11:49 +0200 Subject: [PATCH] fix: add debug capabilities for gl and egl --- .gitignore | 1 + Makefile.dev | 1 + compile_flags.txt | 4 +++- include/glad/egl.h | 46 +++++++++++++++++++++++++++++++++----- include/glad/gl.h | 37 +++++++++++++++++++++++++------ src/shaders.c | 55 ++++++++++++++++++++++++++++++++++++++++++---- src/window.c | 3 +++ 7 files changed, 129 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 3ca9a57..28ec657 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ conftest.* error.glsl draft/ *.gch +*.out diff --git a/Makefile.dev b/Makefile.dev index 904d66c..58a7d3d 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -22,6 +22,7 @@ build: -DGLFW_NATIVE_INCLUDE_NONE \ -DLOG_USE_COLOR \ -DVIDEO_IN \ + -DEGL_DEBUG \ -o build/$(TARGET) \ -g -Og diff --git a/compile_flags.txt b/compile_flags.txt index 995337e..8494fee 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -2,4 +2,6 @@ -DGLFW_INCLUDE_NONE -DGLFW_EXPOSE_NATIVE_EGL -DGLFW_NATIVE_INCLUDE_NONE --DVIDEO_IN \ No newline at end of file +-DVIDEO_IN +-DEGL_DEBUG +-DGL_DEBUG diff --git a/include/glad/egl.h b/include/glad/egl.h index ae57629..328f791 100644 --- a/include/glad/egl.h +++ b/include/glad/egl.h @@ -1,11 +1,11 @@ /** - * Loader generated by glad 2.0.8 on Sun Sep 21 11:51:45 2025 + * Loader generated by glad 2.0.8 on Wed May 13 21:51:29 2026 * * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 * * Generator: C/C++ * Specification: egl - * Extensions: 10 + * Extensions: 11 * * APIs: * - egl=1.5 @@ -19,10 +19,10 @@ * - ON_DEMAND = False * * Commandline: - * --api='egl=1.5' --extensions='EGL_EXT_image_dma_buf_import,EGL_EXT_image_dma_buf_import_modifiers,EGL_KHR_gl_texture_2D_image,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_platform_android,EGL_KHR_platform_gbm,EGL_KHR_platform_wayland,EGL_KHR_platform_x11,EGL_MESA_drm_image' c --header-only --loader + * --api='egl=1.5' --extensions='EGL_EXT_image_dma_buf_import,EGL_EXT_image_dma_buf_import_modifiers,EGL_KHR_debug,EGL_KHR_gl_texture_2D_image,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_platform_android,EGL_KHR_platform_gbm,EGL_KHR_platform_wayland,EGL_KHR_platform_x11,EGL_MESA_drm_image' c --header-only --loader * * Online: - * http://glad.sh/#api=egl%3D1.5&extensions=EGL_EXT_image_dma_buf_import%2CEGL_EXT_image_dma_buf_import_modifiers%2CEGL_KHR_gl_texture_2D_image%2CEGL_KHR_image%2CEGL_KHR_image_base%2CEGL_KHR_platform_android%2CEGL_KHR_platform_gbm%2CEGL_KHR_platform_wayland%2CEGL_KHR_platform_x11%2CEGL_MESA_drm_image&generator=c&options=HEADER_ONLY%2CLOADER + * http://glad.sh/#api=egl%3D1.5&extensions=EGL_EXT_image_dma_buf_import%2CEGL_EXT_image_dma_buf_import_modifiers%2CEGL_KHR_debug%2CEGL_KHR_gl_texture_2D_image%2CEGL_KHR_image%2CEGL_KHR_image_base%2CEGL_KHR_platform_android%2CEGL_KHR_platform_gbm%2CEGL_KHR_platform_wayland%2CEGL_KHR_platform_x11%2CEGL_MESA_drm_image&generator=c&options=HEADER_ONLY%2CLOADER * */ @@ -201,6 +201,11 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 #define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEBUG_CALLBACK_KHR 0x33B8 +#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 +#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA +#define EGL_DEBUG_MSG_INFO_KHR 0x33BC +#define EGL_DEBUG_MSG_WARN_KHR 0x33BB #define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) #define EGL_DEPTH_SIZE 0x3025 #define EGL_DISPLAY_SCALING 10000 @@ -295,6 +300,13 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) #define EGL_NO_SYNC EGL_CAST(EGLSync,0) #define EGL_NO_TEXTURE 0x305C +#define EGL_OBJECT_CONTEXT_KHR 0x33B2 +#define EGL_OBJECT_DISPLAY_KHR 0x33B1 +#define EGL_OBJECT_IMAGE_KHR 0x33B4 +#define EGL_OBJECT_STREAM_KHR 0x33B6 +#define EGL_OBJECT_SURFACE_KHR 0x33B3 +#define EGL_OBJECT_SYNC_KHR 0x33B5 +#define EGL_OBJECT_THREAD_KHR 0x33B0 #define EGL_OPENGL_API 0x30A2 #define EGL_OPENGL_BIT 0x0008 #define EGL_OPENGL_ES2_BIT 0x0004 @@ -934,6 +946,8 @@ GLAD_API_CALL int GLAD_EGL_VERSION_1_5; GLAD_API_CALL int GLAD_EGL_EXT_image_dma_buf_import; #define EGL_EXT_image_dma_buf_import_modifiers 1 GLAD_API_CALL int GLAD_EGL_EXT_image_dma_buf_import_modifiers; +#define EGL_KHR_debug 1 +GLAD_API_CALL int GLAD_EGL_KHR_debug; #define EGL_KHR_gl_texture_2D_image 1 GLAD_API_CALL int GLAD_EGL_KHR_gl_texture_2D_image; #define EGL_KHR_image 1 @@ -968,6 +982,7 @@ typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisp typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLint (GLAD_API_PTR *PFNEGLDEBUGMESSAGECONTROLKHRPROC)(EGLDEBUGPROCKHR callback, const EGLAttrib * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEKHRPROC)(EGLDisplay dpy, EGLImageKHR image); @@ -985,9 +1000,11 @@ typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname); typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLint (GLAD_API_PTR *PFNEGLLABELOBJECTKHRPROC)(EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDEBUGKHRPROC)(EGLint attribute, EGLAttrib * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDMABUFFORMATSEXTPROC)(EGLDisplay dpy, EGLint max_formats, EGLint * formats, EGLint * num_formats); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDMABUFMODIFIERSEXTPROC)(EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR * modifiers, EGLBoolean * external_only, EGLint * num_modifiers); typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name); @@ -1035,6 +1052,8 @@ GLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync; #define eglCreateSync glad_eglCreateSync GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; #define eglCreateWindowSurface glad_eglCreateWindowSurface +GLAD_API_CALL PFNEGLDEBUGMESSAGECONTROLKHRPROC glad_eglDebugMessageControlKHR; +#define eglDebugMessageControlKHR glad_eglDebugMessageControlKHR GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; #define eglDestroyContext glad_eglDestroyContext GLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; @@ -1069,12 +1088,16 @@ GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; #define eglGetSyncAttrib glad_eglGetSyncAttrib GLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize; #define eglInitialize glad_eglInitialize +GLAD_API_CALL PFNEGLLABELOBJECTKHRPROC glad_eglLabelObjectKHR; +#define eglLabelObjectKHR glad_eglLabelObjectKHR GLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; #define eglMakeCurrent glad_eglMakeCurrent GLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI; #define eglQueryAPI glad_eglQueryAPI GLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; #define eglQueryContext glad_eglQueryContext +GLAD_API_CALL PFNEGLQUERYDEBUGKHRPROC glad_eglQueryDebugKHR; +#define eglQueryDebugKHR glad_eglQueryDebugKHR GLAD_API_CALL PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT; #define eglQueryDmaBufFormatsEXT glad_eglQueryDmaBufFormatsEXT GLAD_API_CALL PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT; @@ -1157,6 +1180,7 @@ int GLAD_EGL_VERSION_1_4 = 0; int GLAD_EGL_VERSION_1_5 = 0; int GLAD_EGL_EXT_image_dma_buf_import = 0; int GLAD_EGL_EXT_image_dma_buf_import_modifiers = 0; +int GLAD_EGL_KHR_debug = 0; int GLAD_EGL_KHR_gl_texture_2D_image = 0; int GLAD_EGL_KHR_image = 0; int GLAD_EGL_KHR_image_base = 0; @@ -1184,6 +1208,7 @@ PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface = NULL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface = NULL; PFNEGLCREATESYNCPROC glad_eglCreateSync = NULL; PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface = NULL; +PFNEGLDEBUGMESSAGECONTROLKHRPROC glad_eglDebugMessageControlKHR = NULL; PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext = NULL; PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage = NULL; PFNEGLDESTROYIMAGEKHRPROC glad_eglDestroyImageKHR = NULL; @@ -1201,9 +1226,11 @@ PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay = NULL; PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress = NULL; PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib = NULL; PFNEGLINITIALIZEPROC glad_eglInitialize = NULL; +PFNEGLLABELOBJECTKHRPROC glad_eglLabelObjectKHR = NULL; PFNEGLMAKECURRENTPROC glad_eglMakeCurrent = NULL; PFNEGLQUERYAPIPROC glad_eglQueryAPI = NULL; PFNEGLQUERYCONTEXTPROC glad_eglQueryContext = NULL; +PFNEGLQUERYDEBUGKHRPROC glad_eglQueryDebugKHR = NULL; PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT = NULL; PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT = NULL; PFNEGLQUERYSTRINGPROC glad_eglQueryString = NULL; @@ -1284,6 +1311,12 @@ static void glad_egl_load_EGL_EXT_image_dma_buf_import_modifiers( GLADuserptrloa glad_eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC) load(userptr, "eglQueryDmaBufFormatsEXT"); glad_eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC) load(userptr, "eglQueryDmaBufModifiersEXT"); } +static void glad_egl_load_EGL_KHR_debug( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_debug) return; + glad_eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC) load(userptr, "eglDebugMessageControlKHR"); + glad_eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC) load(userptr, "eglLabelObjectKHR"); + glad_eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC) load(userptr, "eglQueryDebugKHR"); +} static void glad_egl_load_EGL_KHR_image( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_KHR_image) return; glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) load(userptr, "eglCreateImageKHR"); @@ -1338,6 +1371,7 @@ static int glad_egl_find_extensions_egl(EGLDisplay display) { GLAD_EGL_EXT_image_dma_buf_import = glad_egl_has_extension(extensions, "EGL_EXT_image_dma_buf_import"); GLAD_EGL_EXT_image_dma_buf_import_modifiers = glad_egl_has_extension(extensions, "EGL_EXT_image_dma_buf_import_modifiers"); + GLAD_EGL_KHR_debug = glad_egl_has_extension(extensions, "EGL_KHR_debug"); GLAD_EGL_KHR_gl_texture_2D_image = glad_egl_has_extension(extensions, "EGL_KHR_gl_texture_2D_image"); GLAD_EGL_KHR_image = glad_egl_has_extension(extensions, "EGL_KHR_image"); GLAD_EGL_KHR_image_base = glad_egl_has_extension(extensions, "EGL_KHR_image_base"); @@ -1409,6 +1443,7 @@ int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userp if (!glad_egl_find_extensions_egl(display)) return 0; glad_egl_load_EGL_EXT_image_dma_buf_import_modifiers(load, userptr); + glad_egl_load_EGL_KHR_debug(load, userptr); glad_egl_load_EGL_KHR_image(load, userptr); glad_egl_load_EGL_KHR_image_base(load, userptr); glad_egl_load_EGL_MESA_drm_image(load, userptr); @@ -1421,7 +1456,7 @@ int gladLoadEGL(EGLDisplay display, GLADloadfunc load) { return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } - + #ifdef GLAD_EGL @@ -1572,4 +1607,3 @@ void gladLoaderUnloadEGL(void) { #endif #endif /* GLAD_EGL_IMPLEMENTATION */ - diff --git a/include/glad/gl.h b/include/glad/gl.h index 90fc8e2..3179e9c 100644 --- a/include/glad/gl.h +++ b/include/glad/gl.h @@ -1,11 +1,11 @@ /** - * Loader generated by glad 2.0.8 on Sun Sep 21 13:34:57 2025 + * Loader generated by glad 2.0.8 on Wed May 13 21:57:23 2026 * * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 * * Generator: C/C++ * Specification: gl - * Extensions: 3 + * Extensions: 4 * * APIs: * - gl:compatibility=4.6 @@ -19,10 +19,10 @@ * - ON_DEMAND = False * * Commandline: - * --api='gl:compatibility=4.6' --extensions='GL_ARB_direct_state_access,GL_EXT_EGL_image_storage,GL_EXT_direct_state_access' c --header-only --loader + * --api='gl:compatibility=4.6' --extensions='GL_ARB_direct_state_access,GL_EXT_EGL_image_storage,GL_EXT_direct_state_access,GL_KHR_debug' c --header-only --loader * * Online: - * http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_ARB_direct_state_access%2CGL_EXT_EGL_image_storage%2CGL_EXT_direct_state_access&generator=c&options=HEADER_ONLY%2CLOADER + * http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_ARB_direct_state_access%2CGL_EXT_EGL_image_storage%2CGL_EXT_direct_state_access%2CGL_KHR_debug&generator=c&options=HEADER_ONLY%2CLOADER * */ @@ -2409,6 +2409,8 @@ GLAD_API_CALL int GLAD_GL_ARB_direct_state_access; GLAD_API_CALL int GLAD_GL_EXT_EGL_image_storage; #define GL_EXT_direct_state_access 1 GLAD_API_CALL int GLAD_GL_EXT_direct_state_access; +#define GL_KHR_debug 1 +GLAD_API_CALL int GLAD_GL_KHR_debug; typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value); @@ -6396,6 +6398,7 @@ int GLAD_GL_VERSION_4_6 = 0; int GLAD_GL_ARB_direct_state_access = 0; int GLAD_GL_EXT_EGL_image_storage = 0; int GLAD_GL_EXT_direct_state_access = 0; +int GLAD_GL_KHR_debug = 0; @@ -9178,6 +9181,20 @@ static void glad_gl_load_GL_EXT_direct_state_access( GLADuserptrloadfunc load, v glad_glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) load(userptr, "glVertexArrayVertexBindingDivisorEXT"); glad_glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) load(userptr, "glVertexArrayVertexOffsetEXT"); } +static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_debug) return; + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); +} @@ -9276,6 +9293,7 @@ static int glad_gl_find_extensions_gl(void) { GLAD_GL_ARB_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_ARB_direct_state_access"); GLAD_GL_EXT_EGL_image_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_storage"); GLAD_GL_EXT_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_EXT_direct_state_access"); + GLAD_GL_KHR_debug = glad_gl_has_extension(exts, exts_i, "GL_KHR_debug"); glad_gl_free_extensions(exts_i); @@ -9360,6 +9378,7 @@ int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { glad_gl_load_GL_ARB_direct_state_access(load, userptr); glad_gl_load_GL_EXT_EGL_image_storage(load, userptr); glad_gl_load_GL_EXT_direct_state_access(load, userptr); + glad_gl_load_GL_KHR_debug(load, userptr); @@ -9373,7 +9392,7 @@ int gladLoadGL( GLADloadfunc load) { - + #ifdef GLAD_GL @@ -9482,7 +9501,9 @@ static void* glad_gl_dlopen_handle(void) { "libGL-1.so", #endif "libGL.so.1", - "libGL.so" + "libGL.so", + "libEGL.so.1", + "libEGL.so" }; #endif @@ -9505,6 +9526,9 @@ static struct _glad_gl_userptr glad_gl_build_userptr(void *handle) { #else userptr.gl_get_proc_address_ptr = (GLADglprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); + if (!userptr.gl_get_proc_address_ptr) + userptr.gl_get_proc_address_ptr = + (GLADglprocaddrfunc) glad_dlsym_handle(handle, "eglGetProcAddress"); #endif return userptr; @@ -9547,4 +9571,3 @@ void gladLoaderUnloadGL(void) { #endif #endif /* GLAD_GL_IMPLEMENTATION */ - diff --git a/src/shaders.c b/src/shaders.c index cb6ff87..3f444ed 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -26,7 +26,7 @@ static const GLuint unused_uniform = (GLuint)-1; -bool check_glerror_ro(const char *context) { +static bool check_glerror_ro(const char *context) { unsigned int code; code = glGetError(); @@ -39,7 +39,7 @@ bool check_glerror_ro(const char *context) { return false; } -bool check_glerror(ShaderProgram *program, const char *context) { +static bool check_glerror(ShaderProgram *program, const char *context) { if (check_glerror_ro(context)) { program->error = true; return true; @@ -47,7 +47,20 @@ bool check_glerror(ShaderProgram *program, const char *context) { return false; } -bool check_eglerror_ro(const char *context) { +#ifdef GL_DEBUG + +static void gl_debug_callback(GLenum source, GLenum type, GLuint id, + GLenum severity, + __attribute__((unused)) GLsizei length, + const GLchar *message, + __attribute__((unused)) const void *userParam) { + log_debug("GL Debug: source=%x, type=%x, id=%d, severity=%x, message=%s", + source, type, id, severity, message ? message : "(null)"); +} + +#endif /* GL_DEBUG */ + +static bool check_eglerror_ro(const char *context) { #ifdef VIDEO_IN unsigned int code; @@ -61,7 +74,7 @@ bool check_eglerror_ro(const char *context) { return false; } -bool check_eglerror(ShaderProgram *program, const char *context) { +static bool check_eglerror(ShaderProgram *program, const char *context) { if (check_eglerror_ro(context)) { program->error = true; return true; @@ -69,9 +82,29 @@ bool check_eglerror(ShaderProgram *program, const char *context) { return false; } +#ifdef VIDEO_IN +#ifdef EGL_DEBUG + +static void egl_debug_callback(EGLenum error, const char *command, + EGLint messageType, EGLLabelKHR threadLabel, + EGLLabelKHR objectLabel, const char *message) { + log_debug("EGL Debug: error=%04x, command=%s, type=%d, " + "thread=%p, object=%p, message=%s", + error, command ? command : "(null)", messageType, threadLabel, + objectLabel, message ? message : "(null)"); +} + +#endif /* EGL_DEBUG */ +#endif /* VIDEO_IN */ + static bool init_gl(ShaderProgram *program) { gladLoadGL(glfwGetProcAddress); +#ifdef GL_DEBUG + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(gl_debug_callback, NULL); +#endif /* GL_DEBUG */ + #ifdef VIDEO_IN program->egl_display = glfwGetEGLDisplay(); if (program->egl_display == EGL_NO_DISPLAY) { @@ -81,6 +114,20 @@ static bool init_gl(ShaderProgram *program) { } gladLoadEGL(program->egl_display, glfwGetProcAddress); + +#ifdef EGL_DEBUG + { + PFNEGLDEBUGMESSAGECONTROLKHRPROC debug_ctrl = + (PFNEGLDEBUGMESSAGECONTROLKHRPROC)glfwGetProcAddress( + "eglDebugMessageControlKHR"); + if (debug_ctrl != NULL) { + const EGLAttrib attrib_list[] = {EGL_NONE}; + debug_ctrl(egl_debug_callback, attrib_list); + } + } + +#endif /* EGL_DEBUG */ + #endif /* VIDEO_IN */ return !check_glerror(program, "init_gl") && diff --git a/src/window.c b/src/window.c index 6790077..671a44f 100644 --- a/src/window.c +++ b/src/window.c @@ -59,6 +59,9 @@ create_window(GLFWmonitor *monitor, const char *title, Window *shared_context, // Context related hints glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); +#ifdef GL_DEBUG + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); +#endif glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // create fullscreen window in selected monitor