diff --git a/.github/workflows/opengl-es-test-windows.yml b/.github/workflows/opengl-es-test-windows.yml index b552cb7..6fdc3fe 100644 --- a/.github/workflows/opengl-es-test-windows.yml +++ b/.github/workflows/opengl-es-test-windows.yml @@ -44,6 +44,9 @@ jobs: echo "LIBGL_ALWAYS_SOFTWARE=1" >> $env:GITHUB_ENV echo "MESA_GL_VERSION_OVERRIDE=4.3" >> $env:GITHUB_ENV echo "MESA_GLES_VERSION_OVERRIDE=3.2" >> $env:GITHUB_ENV + echo "LIBGL_DEBUG=verbose" >> $env:GITHUB_ENV + echo "EGL_LOG_LEVEL=debug" >> $env:GITHUB_ENV + echo "MESA_VERBOSE=all" >> $env:GITHUB_ENV # Force xmake to a specific folder (for cache) - name: Set xmake env diff --git a/Sources/Backends/OpenGL/EGL/EGLInstance.c b/Sources/Backends/OpenGL/EGL/EGLInstance.c index 439697f..e9203f5 100644 --- a/Sources/Backends/OpenGL/EGL/EGLInstance.c +++ b/Sources/Backends/OpenGL/EGL/EGLInstance.c @@ -7,12 +7,18 @@ #include "EGLInstance.h" #include "../../../PulseInternal.h" -#include "EGL/eglext.h" #include "../OpenGLDevice.h" static PulseLibModule egl_lib_module = PULSE_NULL_LIB_MODULE; static uint32_t loader_references_count = 0; +#define CheckEgl(instance)\ + do { \ + EGLint err = instance->eglGetError(); \ + if(err != EGL_SUCCESS) \ + fprintf(stderr, "EGL Error: 0x%04x at %s:%d\n", err, __FILE__, __LINE__); \ + } while(0) + static bool EGLLoadFunctions(EGLInstance* instance) { #ifdef PULSE_PLAT_WINDOWS @@ -26,7 +32,6 @@ static bool EGLLoadFunctions(EGLInstance* instance) }; #endif - for(size_t i = 0; i < sizeof(libnames) / sizeof(const char*); i++) { if(loader_references_count == 0) @@ -68,8 +73,10 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE *display = instance->eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, device, PULSE_NULLPTR); else *display = instance->eglGetDisplay(EGL_DEFAULT_DISPLAY); + CheckEgl(instance); if(display == EGL_NO_DISPLAY || !instance->eglInitialize(*display, PULSE_NULLPTR, PULSE_NULLPTR)) return false; + CheckEgl(instance); EGLint attribs[] = { EGL_RENDERABLE_TYPE, es_context ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_BIT, @@ -78,13 +85,16 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE }; EGLint num_configs; instance->eglChooseConfig(*display, attribs, config, 1, &num_configs); + CheckEgl(instance); instance->eglBindAPI(es_context ? EGL_OPENGL_ES_API : EGL_OPENGL_API); + CheckEgl(instance); EGLint pbufferAttribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }; *surface = instance->eglCreatePbufferSurface(*display, *config, pbufferAttribs); + CheckEgl(instance); if(es_context) { EGLint ctx_attribs[] = { @@ -92,6 +102,7 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE EGL_NONE }; *context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs); + CheckEgl(instance); } else { @@ -102,20 +113,28 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE EGL_NONE }; *context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs); + CheckEgl(instance); } if(*context == EGL_NO_CONTEXT) { instance->eglDestroySurface(*display, *surface); + CheckEgl(instance); instance->eglTerminate(*display); + CheckEgl(instance); return false; } if(!instance->eglMakeCurrent(*display, *surface, *surface, *context)) { + CheckEgl(instance); instance->eglDestroySurface(*display, *surface); + CheckEgl(instance); instance->eglDestroyContext(display, *context); + CheckEgl(instance); instance->eglTerminate(*display); + CheckEgl(instance); return false; } + CheckEgl(instance); return true; } @@ -135,9 +154,11 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex uint64_t best_device_score = 0; instance->eglQueryDevicesEXT(0, PULSE_NULLPTR, &device_count); + CheckEgl(instance); devices = (EGLDeviceEXT*)calloc(device_count, sizeof(EGLDeviceEXT)); PULSE_CHECK_ALLOCATION_RETVAL(devices, false); instance->eglQueryDevicesEXT(device_count, devices, &device_count); + CheckEgl(instance); for(int32_t i = 0; i < device_count; i++) { @@ -149,15 +170,22 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex continue; PFNGLGETINTEGERI_VPROC glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)instance->eglGetProcAddress("glGetIntegeri_v"); + CheckEgl(instance); PFNGLGETINTEGERVPROC glGetIntegerv = (PFNGLGETINTEGERVPROC)instance->eglGetProcAddress("glGetIntegerv"); + CheckEgl(instance); PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)instance->eglGetProcAddress("glGetString"); + CheckEgl(instance); PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)instance->eglGetProcAddress("glGetStringi"); + CheckEgl(instance); if(!glGetIntegeri_v || !glGetIntegerv || !glGetString || !glGetStringi) { instance->eglDestroySurface(display, surface); + CheckEgl(instance); instance->eglDestroyContext(display, context); + CheckEgl(instance); instance->eglTerminate(display); + CheckEgl(instance); continue; } @@ -219,8 +247,11 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex current_device_score += max_texture_size; instance->eglDestroySurface(display, surface); + CheckEgl(instance); instance->eglDestroyContext(display, context); + CheckEgl(instance); instance->eglTerminate(display); + CheckEgl(instance); if(extensions_found_count != extensions_count) current_device_score = 0; @@ -242,8 +273,11 @@ void EGLUnloadInstance(EGLInstance* instance) { PULSE_CHECK_PTR(instance); instance->eglDestroySurface(instance->display, instance->surface); + CheckEgl(instance); instance->eglDestroyContext(instance->display, instance->context); + CheckEgl(instance); instance->eglTerminate(instance->display); + CheckEgl(instance); loader_references_count--; if(loader_references_count != 0)