Skip to content

Commit

Permalink
Improve ANGLE libraries loading
Browse files Browse the repository at this point in the history
Attempt to load both libEGL and libGLESv2
  • Loading branch information
Alovchin91 committed Feb 3, 2025
1 parent 10492bf commit 490afd3
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 22 deletions.
44 changes: 23 additions & 21 deletions skiko/src/awtMain/cpp/windows/AngleSupport.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@
#include <EGL/egl.h>
#include "exceptions_handler.h"

#define THROW_IF_NULL(action) \
do { \
auto __result { action }; \
if (0 == __result) { \
auto __code = GetLastError(); \
throwJavaRenderExceptionByErrorCode(env, __FUNCTION__, __code); \
return; \
} \
} while ((void)0, 0)

static HINSTANCE AngleEGLLibrary = nullptr;

extern "C" {
Expand Down Expand Up @@ -64,27 +74,19 @@ extern "C" {
}

JNIEXPORT void JNICALL Java_org_jetbrains_skiko_AngleSupport_1jvmKt_loadAngleLibraryWindows(JNIEnv *env, jobject obj) {
TCHAR path[MAX_PATH];
HMODULE hmodule;
if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPTSTR) &Java_org_jetbrains_skiko_AngleSupport_1jvmKt_loadAngleLibraryWindows,
&hmodule) == 0) {
auto code = GetLastError();
throwJavaRenderExceptionByErrorCode(env, __FUNCTION__, code);
return;
}
if (GetModuleFileName(hmodule, path, sizeof(path)) == 0) {
auto code = GetLastError();
throwJavaRenderExceptionByErrorCode(env, __FUNCTION__, code);
return;
}
PathRemoveFileSpec(path);
PathAppend(path, TEXT("libEGL.dll"));
AngleEGLLibrary = LoadLibrary(path);
if (AngleEGLLibrary == nullptr) {
auto code = GetLastError();
throwJavaRenderExceptionByErrorCode(env, __FUNCTION__, code);
}
TCHAR basePath[MAX_PATH] = TEXT("");
TCHAR libEGL[MAX_PATH] = TEXT("");
TCHAR libGLESv2[MAX_PATH] = TEXT("");
HMODULE hmodule = nullptr;
THROW_IF_NULL(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPTSTR) &Java_org_jetbrains_skiko_AngleSupport_1jvmKt_loadAngleLibraryWindows,
&hmodule));
THROW_IF_NULL(GetModuleFileName(hmodule, basePath, sizeof(basePath)));
THROW_IF_NULL(PathRemoveFileSpec(basePath));
THROW_IF_NULL(PathCombine(libEGL, basePath, TEXT("libEGL.dll")));
THROW_IF_NULL(PathCombine(libGLESv2, basePath, TEXT("libGLESv2.dll")));
THROW_IF_NULL(AngleEGLLibrary = LoadLibrary(libEGL));
THROW_IF_NULL(LoadLibrary(libGLESv2));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ internal actual fun loadAngleLibrary() {
when {
hostOs.isWindows -> {
Library.staticLoad()
loadAngleLibraryWindows()
try {
loadAngleLibraryWindows()
}
catch (e: Exception) {
throw RenderException("Failed to load ANGLE library: ${e}")
}
}
else -> Unit
}
Expand Down

0 comments on commit 490afd3

Please sign in to comment.