This commit is contained in:
2025-04-14 08:11:23 +02:00
parent 605726bc4b
commit 13ed7b6cd4
3 changed files with 42 additions and 36 deletions

View File

@@ -12,13 +12,6 @@
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
@@ -32,6 +25,7 @@ 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)
@@ -73,10 +67,8 @@ 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,
@@ -85,16 +77,13 @@ 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[] = {
@@ -102,7 +91,6 @@ 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
{ {
@@ -113,28 +101,20 @@ 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;
} }
@@ -154,11 +134,9 @@ 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++)
{ {
@@ -170,22 +148,15 @@ 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;
} }
@@ -247,11 +218,8 @@ 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;
@@ -273,11 +241,8 @@ 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)

View File

@@ -37,6 +37,41 @@
} }
#endif #endif
#ifdef WINTRACE
#include <windows.h>
#include <dbghelp.h>
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo)
{
fprintf(stderr, "Exception occurred!\n");
PrintStackTrace();
return EXCEPTION_EXECUTE_HANDLER;
}
void PrintStackTrace()
{
// Initialize symbols
HANDLE process = GetCurrentProcess();
SymInitialize(process, NULL, TRUE);
// Capture stack backtrace
void* stack[62];
USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL);
SYMBOL_INFO* symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1);
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
for(USHORT i = 0; i < frames; i++)
{
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
fprintf(stderr, "[%d] %s - 0x%0llX\n", i, symbol->Name, symbol->Address);
}
free(symbol);
}
#endif
extern void TestBackend(); extern void TestBackend();
extern void TestDevice(); extern void TestDevice();
extern void TestBuffer(); extern void TestBuffer();
@@ -51,6 +86,10 @@ int main(void)
signal(SIGABRT, SignalHandler); signal(SIGABRT, SignalHandler);
#endif #endif
#ifdef WINTRACE
SetUnhandledExceptionFilter(ExceptionHandler);
#endif
UNITY_BEGIN(); UNITY_BEGIN();
TestBackend(); TestBackend();
TestDevice(); TestDevice();

View File

@@ -204,6 +204,8 @@ for name, module in pairs(tests) do
add_packages("libbacktrace") add_packages("libbacktrace")
set_extension(".x86_64") set_extension(".x86_64")
add_defines("BACKTRACE") add_defines("BACKTRACE")
elseif is_plat("windows") then
add_defines("WINTRACE")
end end
target_end() target_end()
end end