This commit is contained in:
2025-04-13 23:18:59 +02:00
parent e024653d66
commit 605726bc4b
2 changed files with 39 additions and 2 deletions

View File

@@ -44,6 +44,9 @@ jobs:
echo "LIBGL_ALWAYS_SOFTWARE=1" >> $env:GITHUB_ENV echo "LIBGL_ALWAYS_SOFTWARE=1" >> $env:GITHUB_ENV
echo "MESA_GL_VERSION_OVERRIDE=4.3" >> $env:GITHUB_ENV echo "MESA_GL_VERSION_OVERRIDE=4.3" >> $env:GITHUB_ENV
echo "MESA_GLES_VERSION_OVERRIDE=3.2" >> $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) # Force xmake to a specific folder (for cache)
- name: Set xmake env - name: Set xmake env

View File

@@ -7,12 +7,18 @@
#include "EGLInstance.h" #include "EGLInstance.h"
#include "../../../PulseInternal.h" #include "../../../PulseInternal.h"
#include "EGL/eglext.h"
#include "../OpenGLDevice.h" #include "../OpenGLDevice.h"
static PulseLibModule egl_lib_module = PULSE_NULL_LIB_MODULE; static PulseLibModule egl_lib_module = PULSE_NULL_LIB_MODULE;
static uint32_t loader_references_count = 0; 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) static bool EGLLoadFunctions(EGLInstance* instance)
{ {
#ifdef PULSE_PLAT_WINDOWS #ifdef PULSE_PLAT_WINDOWS
@@ -26,7 +32,6 @@ static bool EGLLoadFunctions(EGLInstance* instance)
}; };
#endif #endif
for(size_t i = 0; i < sizeof(libnames) / sizeof(const char*); i++) for(size_t i = 0; i < sizeof(libnames) / sizeof(const char*); i++)
{ {
if(loader_references_count == 0) 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); *display = instance->eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, device, PULSE_NULLPTR);
else else
*display = instance->eglGetDisplay(EGL_DEFAULT_DISPLAY); *display = instance->eglGetDisplay(EGL_DEFAULT_DISPLAY);
CheckEgl(instance);
if(display == EGL_NO_DISPLAY || !instance->eglInitialize(*display, PULSE_NULLPTR, PULSE_NULLPTR)) if(display == EGL_NO_DISPLAY || !instance->eglInitialize(*display, PULSE_NULLPTR, PULSE_NULLPTR))
return false; return false;
CheckEgl(instance);
EGLint attribs[] = { EGLint attribs[] = {
EGL_RENDERABLE_TYPE, es_context ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_BIT, 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; EGLint num_configs;
instance->eglChooseConfig(*display, attribs, config, 1, &num_configs); instance->eglChooseConfig(*display, attribs, config, 1, &num_configs);
CheckEgl(instance);
instance->eglBindAPI(es_context ? EGL_OPENGL_ES_API : EGL_OPENGL_API); instance->eglBindAPI(es_context ? EGL_OPENGL_ES_API : EGL_OPENGL_API);
CheckEgl(instance);
EGLint pbufferAttribs[] = { EGLint pbufferAttribs[] = {
EGL_WIDTH, 1, EGL_WIDTH, 1,
EGL_HEIGHT, 1, EGL_HEIGHT, 1,
EGL_NONE EGL_NONE
}; };
*surface = instance->eglCreatePbufferSurface(*display, *config, pbufferAttribs); *surface = instance->eglCreatePbufferSurface(*display, *config, pbufferAttribs);
CheckEgl(instance);
if(es_context) if(es_context)
{ {
EGLint ctx_attribs[] = { EGLint ctx_attribs[] = {
@@ -92,6 +102,7 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE
EGL_NONE EGL_NONE
}; };
*context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs); *context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs);
CheckEgl(instance);
} }
else else
{ {
@@ -102,20 +113,28 @@ bool EGLLoadOpenGLContext(EGLInstance* instance, EGLDisplay* display, EGLDeviceE
EGL_NONE EGL_NONE
}; };
*context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs); *context = instance->eglCreateContext(*display, *config, EGL_NO_CONTEXT, ctx_attribs);
CheckEgl(instance);
} }
if(*context == EGL_NO_CONTEXT) if(*context == EGL_NO_CONTEXT)
{ {
instance->eglDestroySurface(*display, *surface); instance->eglDestroySurface(*display, *surface);
CheckEgl(instance);
instance->eglTerminate(*display); instance->eglTerminate(*display);
CheckEgl(instance);
return false; return false;
} }
if(!instance->eglMakeCurrent(*display, *surface, *surface, *context)) if(!instance->eglMakeCurrent(*display, *surface, *surface, *context))
{ {
CheckEgl(instance);
instance->eglDestroySurface(*display, *surface); instance->eglDestroySurface(*display, *surface);
CheckEgl(instance);
instance->eglDestroyContext(display, *context); instance->eglDestroyContext(display, *context);
CheckEgl(instance);
instance->eglTerminate(*display); instance->eglTerminate(*display);
CheckEgl(instance);
return false; return false;
} }
CheckEgl(instance);
return true; return true;
} }
@@ -135,9 +154,11 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex
uint64_t best_device_score = 0; uint64_t best_device_score = 0;
instance->eglQueryDevicesEXT(0, PULSE_NULLPTR, &device_count); instance->eglQueryDevicesEXT(0, PULSE_NULLPTR, &device_count);
CheckEgl(instance);
devices = (EGLDeviceEXT*)calloc(device_count, sizeof(EGLDeviceEXT)); devices = (EGLDeviceEXT*)calloc(device_count, sizeof(EGLDeviceEXT));
PULSE_CHECK_ALLOCATION_RETVAL(devices, false); PULSE_CHECK_ALLOCATION_RETVAL(devices, false);
instance->eglQueryDevicesEXT(device_count, devices, &device_count); instance->eglQueryDevicesEXT(device_count, devices, &device_count);
CheckEgl(instance);
for(int32_t i = 0; i < device_count; i++) for(int32_t i = 0; i < device_count; i++)
{ {
@@ -149,15 +170,22 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex
continue; continue;
PFNGLGETINTEGERI_VPROC glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)instance->eglGetProcAddress("glGetIntegeri_v"); PFNGLGETINTEGERI_VPROC glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)instance->eglGetProcAddress("glGetIntegeri_v");
CheckEgl(instance);
PFNGLGETINTEGERVPROC glGetIntegerv = (PFNGLGETINTEGERVPROC)instance->eglGetProcAddress("glGetIntegerv"); PFNGLGETINTEGERVPROC glGetIntegerv = (PFNGLGETINTEGERVPROC)instance->eglGetProcAddress("glGetIntegerv");
CheckEgl(instance);
PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)instance->eglGetProcAddress("glGetString"); PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)instance->eglGetProcAddress("glGetString");
CheckEgl(instance);
PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)instance->eglGetProcAddress("glGetStringi"); PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)instance->eglGetProcAddress("glGetStringi");
CheckEgl(instance);
if(!glGetIntegeri_v || !glGetIntegerv || !glGetString || !glGetStringi) if(!glGetIntegeri_v || !glGetIntegerv || !glGetString || !glGetStringi)
{ {
instance->eglDestroySurface(display, surface); instance->eglDestroySurface(display, surface);
CheckEgl(instance);
instance->eglDestroyContext(display, context); instance->eglDestroyContext(display, context);
CheckEgl(instance);
instance->eglTerminate(display); instance->eglTerminate(display);
CheckEgl(instance);
continue; continue;
} }
@@ -219,8 +247,11 @@ bool EGLLoadInstance(EGLInstance* instance, const char** extensions, uint32_t ex
current_device_score += max_texture_size; current_device_score += max_texture_size;
instance->eglDestroySurface(display, surface); instance->eglDestroySurface(display, surface);
CheckEgl(instance);
instance->eglDestroyContext(display, context); instance->eglDestroyContext(display, context);
CheckEgl(instance);
instance->eglTerminate(display); instance->eglTerminate(display);
CheckEgl(instance);
if(extensions_found_count != extensions_count) if(extensions_found_count != extensions_count)
current_device_score = 0; current_device_score = 0;
@@ -242,8 +273,11 @@ void EGLUnloadInstance(EGLInstance* instance)
{ {
PULSE_CHECK_PTR(instance); PULSE_CHECK_PTR(instance);
instance->eglDestroySurface(instance->display, instance->surface); instance->eglDestroySurface(instance->display, instance->surface);
CheckEgl(instance);
instance->eglDestroyContext(instance->display, instance->context); instance->eglDestroyContext(instance->display, instance->context);
CheckEgl(instance);
instance->eglTerminate(instance->display); instance->eglTerminate(instance->display);
CheckEgl(instance);
loader_references_count--; loader_references_count--;
if(loader_references_count != 0) if(loader_references_count != 0)