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 "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

View File

@@ -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)