From 7b4fd3bcadebbf2236666ae9a94f718eb47ac0e8 Mon Sep 17 00:00:00 2001 From: mittorn Date: Fri, 27 Oct 2023 00:24:23 +0300 Subject: [PATCH] platform/android: debug surface enabling/disabling, add notification for event_set_pause, fix wrong host.status, prevent rendering while no surface --- engine/platform/android/android_nosdl.c | 15 ++++++++++----- engine/platform/android/vid_android.c | 25 ++++++++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/engine/platform/android/android_nosdl.c b/engine/platform/android/android_nosdl.c index 95f15bdb..ba430478 100644 --- a/engine/platform/android/android_nosdl.c +++ b/engine/platform/android/android_nosdl.c @@ -854,12 +854,12 @@ void Platform_RunEvents( void ) case event_set_pause: // destroy EGL surface when hiding application + Con_Printf( "pause event %d\n", events.queue[i].arg ); if( !events.queue[i].arg ) { SNDDMA_Activate( true ); // (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 1 ); Android_UpdateSurface( true ); - host.status = HOST_FRAME; SetBits( gl_vsync.flags, FCVAR_CHANGED ); // set swap interval host.force_draw_version_time = host.realtime + FORCE_DRAW_VERSION_TIME; } @@ -868,22 +868,27 @@ void Platform_RunEvents( void ) { SNDDMA_Activate( false ); Android_UpdateSurface( false ); - host.status = HOST_NOFOCUS; // (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 0 ); } + (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.notify ); break; case event_resize: // reinitialize EGL and change engine screen size - if( host.status == HOST_FRAME &&( refState.width != jni.width || refState.height != jni.height ) ) + if( ( host.status == HOST_FRAME || host.status == HOST_NOFOCUS ) &&( refState.width != jni.width || refState.height != jni.height )) { // (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 0 ); // (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 1 ); + Con_DPrintf("resize event\n"); Android_UpdateSurface( false ); Android_UpdateSurface( true ); SetBits( gl_vsync.flags, FCVAR_CHANGED ); // set swap interval VID_SetMode(); } + else + { + Con_DPrintf("resize skip %d %d %d %d %d", jni.width, jni.height, refState.width, refState.height, host.status ); + } break; case event_joyadd: Joy_AddEvent(); @@ -934,14 +939,14 @@ void Platform_RunEvents( void ) #endif // disable sound during call/screen-off SNDDMA_Activate( false ); -// host.status = HOST_NOFOCUS; + host.status = HOST_SLEEP; // stop blocking UI thread (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.notify ); break; case event_onresume: // re-enable sound after onPause -// host.status = HOST_FRAME; + host.status = HOST_FRAME; SNDDMA_Activate( true ); host.force_draw_version_time = host.realtime + FORCE_DRAW_VERSION_TIME; break; diff --git a/engine/platform/android/vid_android.c b/engine/platform/android/vid_android.c index 0ddf6008..374684a7 100644 --- a/engine/platform/android/vid_android.c +++ b/engine/platform/android/vid_android.c @@ -122,9 +122,10 @@ Check if we may use native EGL without jni calls void Android_UpdateSurface( qboolean active ) { vid_android.nativeegl = false; - - if( glw_state.software || eglstate.valid ) + Con_Printf("1\n"); + if( glw_state.software || ( eglstate.valid && !eglstate.imported ) ) { + Con_Printf("2\n"); if( vid_android.window && !active ) { nw.release( vid_android.window ); @@ -157,20 +158,33 @@ void Android_UpdateSurface( qboolean active ) } return; } - + Con_Printf("3\n"); if( !vid_android.has_context ) return; - if( ( active && host.status == HOST_FRAME ) || !active ) + //if( ( active && host.status == HOST_FRAME ) || !active ) + if( !active ) + { + Con_Printf("toggleEGL 0\n"); (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 0 ); + } + host.status = HOST_SLEEP; if( active ) + { + Con_Printf("toggleEGL 1\n"); (*jni.env)->CallStaticVoidMethod( jni.env, jni.actcls, jni.toggleEGL, 1 ); + host.status = HOST_FRAME; + } + + // todo: check opengl context here and set HOST_SLEEP if not if( !Sys_CheckParm("-nativeegl") || !active ) return; // enabled by user vid_android.nativeegl = EGL_ImportContext(); + if( vid_android.nativeegl ) + Con_DPrintf( "nativeEGL success\n"); } /* @@ -270,6 +284,7 @@ qboolean R_Init_Video( const int type ) host.renderinfo_changed = false; + host.status = HOST_FRAME; // where it should we done? We have broken host.status on all non-SDL platforms! return true; } @@ -323,7 +338,7 @@ qboolean VID_SetMode( void ) { vid_android.has_context = vid_android.nativeegl = EGL_CreateContext(); - if( vid_android.has_context ) + if( vid_android.has_context ) Android_UpdateSurface( true ); else return false;