From cd814206385639e433ed1d43ec0f67e28d434139 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Sun, 25 Jun 2023 23:45:32 +0100 Subject: [PATCH] Update agdk-mainloop --- examples/agdk-mainloop/Cargo.toml | 2 ++ examples/agdk-mainloop/app/build.gradle | 2 ++ .../app/src/main/AndroidManifest.xml | 3 +- examples/agdk-mainloop/build.gradle | 4 +-- examples/agdk-mainloop/gradle.properties | 4 ++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/agdk-mainloop/src/lib.rs | 31 ++++++++++++++++--- 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/examples/agdk-mainloop/Cargo.toml b/examples/agdk-mainloop/Cargo.toml index 47d30a3..6971468 100644 --- a/examples/agdk-mainloop/Cargo.toml +++ b/examples/agdk-mainloop/Cargo.toml @@ -9,6 +9,8 @@ edition = "2021" log = "0.4" android_logger = "0.11.0" android-activity = { path="../../android-activity", features = ["game-activity"] } +ndk-sys = "0.4" +ndk = "0.7" [lib] name="main" diff --git a/examples/agdk-mainloop/app/build.gradle b/examples/agdk-mainloop/app/build.gradle index 77c1a85..cce660e 100644 --- a/examples/agdk-mainloop/app/build.gradle +++ b/examples/agdk-mainloop/app/build.gradle @@ -3,6 +3,7 @@ plugins { } android { + ndkVersion "25.2.9519653" compileSdk 31 defaultConfig { @@ -32,6 +33,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + namespace 'co.realfit.agdkmainloop' } dependencies { diff --git a/examples/agdk-mainloop/app/src/main/AndroidManifest.xml b/examples/agdk-mainloop/app/src/main/AndroidManifest.xml index 7b99a0b..b9d7563 100644 --- a/examples/agdk-mainloop/app/src/main/AndroidManifest.xml +++ b/examples/agdk-mainloop/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + = Default::default(); + let mut native_window: Option = None; while !quit { app.poll_events( @@ -37,11 +37,11 @@ fn android_main(app: AndroidApp) { } } MainEvent::InitWindow { .. } => { - render_state = Some(()); + native_window = app.native_window(); redraw_pending = true; } MainEvent::TerminateWindow { .. } => { - render_state = None; + native_window = None; } MainEvent::WindowResized { .. } => { redraw_pending = true; @@ -65,7 +65,7 @@ fn android_main(app: AndroidApp) { } if redraw_pending { - if let Some(_rs) = render_state { + if let Some(native_window) = &native_window { redraw_pending = false; // Handle input @@ -75,9 +75,32 @@ fn android_main(app: AndroidApp) { }); info!("Render..."); + dummy_render(native_window); } } }, ); } } + +/// Post a NOP frame to the window +/// +/// Since this is a bare minimum test app we don't depend +/// on any GPU graphics APIs but we do need to at least +/// convince Android that we're drawing something and are +/// responsive, otherwise it will stop delivering input +/// events to us. +fn dummy_render(native_window: &ndk::native_window::NativeWindow) { + unsafe { + let mut buf: ndk_sys::ANativeWindow_Buffer = std::mem::zeroed(); + let mut rect: ndk_sys::ARect = std::mem::zeroed(); + ndk_sys::ANativeWindow_lock( + native_window.ptr().as_ptr() as _, + &mut buf as _, + &mut rect as _, + ); + // Note: we don't try and touch the buffer since that + // also requires us to handle various buffer formats + ndk_sys::ANativeWindow_unlockAndPost(native_window.ptr().as_ptr() as _); + } +}