From 69104d0bccce2bd3068b21c403c5f3999802d805 Mon Sep 17 00:00:00 2001 From: Coder2 Date: Sat, 28 Jun 2025 12:21:53 +0800 Subject: [PATCH] Harmony port: entrypoint multithread --- src/core/ohos/SDL_ohos.c | 62 +++++++++++++++++++++++++++++-------- src/video/SDL_egl.c | 1 + src/video/ohos/SDL_ohosgl.c | 3 +- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/core/ohos/SDL_ohos.c b/src/core/ohos/SDL_ohos.c index 4b1f272bd9..81d49ade95 100644 --- a/src/core/ohos/SDL_ohos.c +++ b/src/core/ohos/SDL_ohos.c @@ -67,6 +67,8 @@ void OHOS_windowDataFill(SDL_Window *w) w->w = wid; w->h = hei; w->internal->native_window = g_ohosNativeWindow; + + SDL_SetWindowSize(w, wid, hei); SDL_VideoDevice *_this = SDL_GetVideoDevice(); @@ -224,7 +226,7 @@ static napi_value sdlCallbackInit(napi_env env, napi_callback_info info) data->func = "test"; data->argCount = 0; - napi_call_threadsafe_function(napiEnv.func, data, napi_tsfn_blocking); + napi_call_threadsafe_function(napiEnv.func, data, napi_tsfn_nonblocking); // SDL_free(data); @@ -233,6 +235,26 @@ static napi_value sdlCallbackInit(napi_env env, napi_callback_info info) return result; } +typedef struct entrypoint_info_ { + char* libname; + char* func; +} entrypoint_info; +static int sdlLaunchMainInternal(void* reserved) +{ + if (!reserved) { + return -1; + } + entrypoint_info *data = (entrypoint_info*)reserved; + void *lib = dlopen(data->libname, RTLD_LAZY); + void *func = dlsym(lib, data->func); + typedef int (*test)(); + int d = ((test)func)(); + dlclose(lib); + SDL_free(reserved); + + return d; +} + static napi_value sdlLaunchMain(napi_env env, napi_callback_info info) { size_t argc = 2; @@ -248,12 +270,12 @@ static napi_value sdlLaunchMain(napi_env env, napi_callback_info info) napi_get_value_string_utf8(env, args[1], NULL, 0, &fstringSize); char *fname = SDL_malloc(fstringSize + 1); napi_get_value_string_utf8(env, args[1], fname, fstringSize + 1, &fstringSize); - - void *lib = dlopen(libname, RTLD_LAZY); - void *func = dlsym(lib, fname); - typedef int (*test)(); - ((test)func)(); - dlclose(lib); + + entrypoint_info *entry = (entrypoint_info*)SDL_malloc(sizeof(entrypoint_info)); + entry->func = fname; + entry->libname = libname; + SDL_Thread* m = SDL_CreateThread(sdlLaunchMainInternal, "SDL App Thread", entry); + SDL_SetMainReady(); napi_value result; napi_create_int32(env, 0, &result); @@ -278,6 +300,12 @@ static void OnSurfaceCreatedCB(OH_NativeXComponent *component, void *window) x = (int)offsetX; y = (int)offsetY; SDL_UnlockMutex(g_ohosPageMutex); + + napiCallbackData *data = SDL_malloc(sizeof(napiCallbackData)); + data->func = "onMainLaunch"; + data->argCount = 0; + + napi_call_threadsafe_function(napiEnv.func, data, napi_tsfn_nonblocking); } static void OnSurfaceChangedCB(OH_NativeXComponent *component, void *window) { @@ -296,6 +324,13 @@ static void OnSurfaceChangedCB(OH_NativeXComponent *component, void *window) x = (int)offsetX; y = (int)offsetY; SDL_UnlockMutex(g_ohosPageMutex); + + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + SDL_Window *win = _this->windows; + while (win != NULL) { + OHOS_windowDataFill(win); + win = win->next; + } } static void OnSurfaceDestroyedCB(OH_NativeXComponent *component, void *window) { @@ -318,6 +353,7 @@ static void OnSurfaceDestroyedCB(OH_NativeXComponent *component, void *window) static void onKeyEvent(OH_NativeXComponent *component, void *window) { OH_NativeXComponent_KeyEvent *keyEvent = NULL; + SDL_Log("key!"); if (OH_NativeXComponent_GetKeyEvent(component, &keyEvent) >= 0) { OH_NativeXComponent_KeyAction action; OH_NativeXComponent_KeyCode code; @@ -349,7 +385,8 @@ static void onNativeTouch(OH_NativeXComponent *component, void *window) for (int i = 0; i < touchEvent.numPoints; i++) { SDL_OHOSTouchEvent e; e.timestamp = touchEvent.timeStamp; - e.deviceId = touchEvent.deviceId; + // skip assertions + e.deviceId = touchEvent.deviceId + 1; e.fingerId = touchEvent.touchPoints[i].id; e.area = touchEvent.touchPoints[i].size; e.x = touchEvent.touchPoints[i].x / (float)wid; @@ -374,13 +411,13 @@ static void onNativeTouch(OH_NativeXComponent *component, void *window) OHOS_OnTouch(e); } + + OHOS_UnlockPage(); } -static void OnDispatchTouchEventCB(OH_NativeXComponent *component, void *window) -{ +// TODO mouse data +static void onNativeMouse(OH_NativeXComponent *component, void *window) { onNativeTouch(component, window); } -// TODO -static void onNativeMouse(OH_NativeXComponent *component, void *window) {} static napi_value SDL_OHOS_NAPI_Init(napi_env env, napi_value exports) { @@ -405,7 +442,6 @@ static napi_value SDL_OHOS_NAPI_Init(napi_env env, napi_value exports) callback.DispatchTouchEvent = onNativeTouch; OH_NativeXComponent_RegisterCallback(nativeXComponent, &callback); - mouseCallback.DispatchMouseEvent = OnDispatchTouchEventCB; mouseCallback.DispatchMouseEvent = onNativeMouse; OH_NativeXComponent_RegisterMouseEventCallback(nativeXComponent, &mouseCallback); diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 3d4df26073..fbece4136c 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -19,6 +19,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ #include "SDL_internal.h" +#include "dynapi/SDL_dynapi_overrides.h" #ifdef SDL_VIDEO_OPENGL_EGL diff --git a/src/video/ohos/SDL_ohosgl.c b/src/video/ohos/SDL_ohosgl.c index 38ad6e918a..53e13af30e 100644 --- a/src/video/ohos/SDL_ohosgl.c +++ b/src/video/ohos/SDL_ohosgl.c @@ -17,7 +17,8 @@ SDL_GLContext OHOS_GLES_CreateContext(SDL_VideoDevice *_this, SDL_Window *window SDL_GLContext result; OHOS_LockPage(); - + + OHOS_windowDataFill(window); result = SDL_EGL_CreateContext(_this, window->internal->egl_surface); OHOS_UnlockPage();