From bbf90a959b2eb546451cb14d4a1f49ff60363191 Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 6 Jul 2011 11:49:01 +0300 Subject: [PATCH] Added compatibility mode to SDL, for misbehaving apps that don't call SDL_Flip() --- ChangeAppSettings.sh | 62 ++++++++++++++++--- project/java/Globals.java | 2 +- project/java/Settings.java | 9 ++- project/java/Video.java | 3 +- project/jni/application/src | 2 +- .../src/video/android/SDL_androidvideo-1.2.c | 8 ++- .../src/video/android/SDL_androidvideo.c | 7 +++ .../src/video/android/SDL_androidvideo.h | 1 + 8 files changed, 80 insertions(+), 14 deletions(-) diff --git a/ChangeAppSettings.sh b/ChangeAppSettings.sh index cf0bab46e..be9be138c 100755 --- a/ChangeAppSettings.sh +++ b/ChangeAppSettings.sh @@ -126,15 +126,29 @@ fi fi if [ "$LibSdlVersion" = "1.2" ]; then - if [ -z "$SwVideoMode" -o -z "$AUTO" ]; then - echo - echo "Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL," - echo -n "this will allow small speed optimization (y) or (n) ($SwVideoMode): " - read var - if [ -n "$var" ] ; then - SwVideoMode="$var" - CHANGED=1 + if [ -z "$CompatibilityHacks" -o -z "$AUTO" ]; then + echo + echo "Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread -" + echo -n "enabling the compatibility mode will force screen update every halfsecond (y) or (n) ($CompatibilityHacks): " + read var + if [ -n "$var" ] ; then + CompatibilityHacks="$var" + CHANGED=1 + fi fi + if [ "$CompatibilityHacks" = y ]; then + SwVideoMode=y + else + if [ -z "$SwVideoMode" -o -z "$AUTO" ]; then + echo + echo "Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL," + echo -n "this will allow small speed optimization (y) or (n) ($SwVideoMode): " + read var + if [ -n "$var" ] ; then + SwVideoMode="$var" + CHANGED=1 + fi + fi fi else SwVideoMode=n @@ -300,7 +314,7 @@ if [ -n "$var" ] ; then fi fi -if [ -z "$HiddenMenuOptions" -o -z "$AUTO" ]; then +if [ -z "$AUTO" ]; then echo echo "Menu items to hide from startup menu, available menu items:" echo `grep 'extends Menu' project/java/Settings.java | sed 's/.* class \(.*\) extends .*/\1/'` @@ -313,6 +327,22 @@ if [ -n "$var" ] ; then fi fi +FirstStartMenuOptionsDefault='(AppUsesMouse ? new Settings.DisplaySizeConfig(true) : new Settings.DummyMenu()), new Settings.OptionalDownloadConfig(true)' +if [ -z "$AUTO" ]; then +echo +echo "Menu items to show at startup - this is Java code snippet, leave empty for default" +echo $FirstStartMenuOptionsDefault +echo "Available menu items:" +echo `grep 'extends Menu' project/java/Settings.java | sed 's/.* class \(.*\) extends .*/new Settings.\1(), /'` +echo "Current value: " "$FirstStartMenuOptions" +echo -n ": " +read var +if [ -n "$var" ] ; then + FirstStartMenuOptions="$var" + CHANGED=1 +fi +fi + if [ -z "$MultiABI" -o -z "$AUTO" ]; then echo echo "Enable multi-ABI binary, with hardware FPU support - " @@ -450,6 +480,7 @@ echo SdlVideoResize=$SdlVideoResize >> AndroidAppSettings.cfg echo SdlVideoResizeKeepAspect=$SdlVideoResizeKeepAspect >> AndroidAppSettings.cfg echo NeedDepthBuffer=$NeedDepthBuffer >> AndroidAppSettings.cfg echo SwVideoMode=$SwVideoMode >> AndroidAppSettings.cfg +echo CompatibilityHacks=$CompatibilityHacks >> AndroidAppSettings.cfg echo AppUsesMouse=$AppUsesMouse >> AndroidAppSettings.cfg echo AppNeedsTwoButtonMouse=$AppNeedsTwoButtonMouse >> AndroidAppSettings.cfg echo AppNeedsArrowKeys=$AppNeedsArrowKeys >> AndroidAppSettings.cfg @@ -464,6 +495,7 @@ echo AppTouchscreenKeyboardKeysAmountAutoFire=$AppTouchscreenKeyboardKeysAmountA echo RedefinedKeysScreenKb=\"$RedefinedKeysScreenKb\" >> AndroidAppSettings.cfg echo StartupMenuButtonTimeout=$StartupMenuButtonTimeout >> AndroidAppSettings.cfg echo HiddenMenuOptions=\'$HiddenMenuOptions\' >> AndroidAppSettings.cfg +echo FirstStartMenuOptions=\'$FirstStartMenuOptions\' >> AndroidAppSettings.cfg echo MultiABI=$MultiABI >> AndroidAppSettings.cfg echo AppVersionCode=$AppVersionCode >> AndroidAppSettings.cfg echo AppVersionName=\"$AppVersionName\" >> AndroidAppSettings.cfg @@ -525,6 +557,12 @@ else SwVideoMode=false fi +if [ "$CompatibilityHacks" = "y" ] ; then + CompatibilityHacks=true +else + CompatibilityHacks=false +fi + if [ "$AppUsesMouse" = "y" ] ; then AppUsesMouse=true else @@ -611,6 +649,10 @@ for F in $HiddenMenuOptions; do HiddenMenuOptions1="$HiddenMenuOptions1 new Settings.$F()," done +if [ -z "$FirstStartMenuOptions" ]; then + FirstStartMenuOptions="$FirstStartMenuOptionsDefault" +fi + ReadmeText="`echo $ReadmeText | sed 's/\"/\\\\\\\\\"/g' | sed 's/[&%]//g'`" echo Patching project/AndroidManifest.xml @@ -638,6 +680,7 @@ cat project/src/Globals.java | \ sed "s@public static String DataDownloadUrl = .*@public static String DataDownloadUrl = \"$AppDataDownloadUrl1\";@" | \ sed "s/public static boolean NeedDepthBuffer = .*;/public static boolean NeedDepthBuffer = $NeedDepthBuffer;/" | \ sed "s/public static boolean SwVideoMode = .*;/public static boolean SwVideoMode = $SwVideoMode;/" | \ + sed "s/public static boolean CompatibilityHacks = .*;/public static boolean CompatibilityHacks = $CompatibilityHacks;/" | \ sed "s/public static boolean HorizontalOrientation = .*;/public static boolean HorizontalOrientation = $HorizontalOrientation;/" | \ sed "s/public static boolean InhibitSuspend = .*;/public static boolean InhibitSuspend = $InhibitSuspend;/" | \ sed "s/public static boolean AppUsesMouse = .*;/public static boolean AppUsesMouse = $AppUsesMouse;/" | \ @@ -652,6 +695,7 @@ cat project/src/Globals.java | \ sed "s/public static int AppTouchscreenKeyboardKeysAmountAutoFire = .*;/public static int AppTouchscreenKeyboardKeysAmountAutoFire = $AppTouchscreenKeyboardKeysAmountAutoFire;/" | \ sed "s/public static int StartupMenuButtonTimeout = .*;/public static int StartupMenuButtonTimeout = $StartupMenuButtonTimeout;/" | \ sed "s/public static Settings.Menu HiddenMenuOptions .*;/public static Settings.Menu HiddenMenuOptions [] = { $HiddenMenuOptions1 };/" | \ + sed "s@public static Settings.Menu FirstStartMenuOptions .*;@public static Settings.Menu FirstStartMenuOptions [] = { $FirstStartMenuOptions };@" | \ sed "s%public static String ReadmeText = .*%public static String ReadmeText = \"$ReadmeText\".replace(\"^\",\"\\\n\");%" | \ sed "s%public static String CommandLine = .*%public static String CommandLine = \"$AppCmdline\";%" | \ sed "s/public static String AppLibraries.*/public static String AppLibraries[] = { $LibrariesToLoad };/" > \ diff --git a/project/java/Globals.java b/project/java/Globals.java index 10aa7346d..e1471a993 100644 --- a/project/java/Globals.java +++ b/project/java/Globals.java @@ -34,6 +34,7 @@ class Globals { public static String DataDownloadUrl = "Data files are 2 Mb|https://sourceforge.net/projects/libsdl-android/files/CommanderGenius/commandergenius-data.zip/download^High-quality GFX and music - 40 Mb|https://sourceforge.net/projects/libsdl-android/files/CommanderGenius/commandergenius-hqp.zip/download"; public static boolean NeedDepthBuffer = false; public static boolean SwVideoMode = false; + public static boolean CompatibilityHacks = false; public static boolean HorizontalOrientation = true; public static boolean InhibitSuspend = false; public static String ReadmeText = "^You may press \"Home\" now - the data will be downloaded in background".replace("^","\n"); @@ -50,7 +51,6 @@ class Globals { public static int AppTouchscreenKeyboardKeysAmountAutoFire = 1; public static int StartupMenuButtonTimeout = 3000; public static Settings.Menu HiddenMenuOptions [] = {}; - // Not configurable yet through ChangeAppSettings.sh public static Settings.Menu FirstStartMenuOptions [] = { (AppUsesMouse ? new Settings.DisplaySizeConfig(true) : new Settings.DummyMenu()), new Settings.OptionalDownloadConfig(true) }; // Phone-specific config, modified by user in "Change phone config" startup dialog, TODO: move this to settings diff --git a/project/java/Settings.java b/project/java/Settings.java index a32e151c0..e00dc0cb3 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -2240,7 +2240,7 @@ class Settings Globals.SmoothVideo }; - if(Globals.SwVideoMode) + if(Globals.SwVideoMode && !Globals.CompatibilityHacks) { CharSequence[] items2 = { p.getResources().getString(R.string.pointandclick_keepaspectratio), @@ -2315,6 +2315,12 @@ class Settings { if(Globals.SmoothVideo) nativeSetSmoothVideo(); + if( Globals.CompatibilityHacks ) + { + Globals.MultiThreadedVideo = true; + Globals.SwVideoMode = true; + nativeSetCompatibilityHacks(); + } if( Globals.SwVideoMode && Globals.MultiThreadedVideo ) nativeSetVideoMultithreaded(); if( Globals.PhoneHasTrackball ) @@ -2438,6 +2444,7 @@ class Settings private static native void nativeSetMultitouchUsed(); private static native void nativeSetTouchscreenKeyboardUsed(); private static native void nativeSetSmoothVideo(); + private static native void nativeSetCompatibilityHacks(); private static native void nativeSetVideoMultithreaded(); private static native void nativeSetupScreenKeyboard(int size, int theme, int nbuttonsAutoFire, int transparency); private static native void nativeSetupScreenKeyboardButtons(byte[] img); diff --git a/project/java/Video.java b/project/java/Video.java index dbfd263a6..acfd7e6cf 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -308,9 +308,10 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer // Tweak video thread priority, if user selected big audio buffer if(Globals.AudioBufferConfig >= 2) Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal + // Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code nativeInit( Globals.DataDir, Globals.CommandLine, - ( Globals.SwVideoMode && Globals.MultiThreadedVideo ) ? 1 : 0 ); // Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code + ( (Globals.SwVideoMode && Globals.MultiThreadedVideo) || Globals.CompatibilityHacks ) ? 1 : 0 ); System.exit(0); // The main() returns here - I don't bother with deinit stuff, just terminate process } diff --git a/project/jni/application/src b/project/jni/application/src index 02b189579..9cdf4a8cf 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -grafx2 \ No newline at end of file +milkytracker \ No newline at end of file diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c index 2cdc62838..9c21cc084 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c @@ -1028,10 +1028,11 @@ void SDL_ANDROID_MultiThreadedVideoLoop() { int signalNeeded = 0; int swapBuffersNeeded = 0; + int ret; SDL_mutexP(videoThread.mutex); videoThread.threadReady = 1; SDL_CondSignal(videoThread.cond2); - SDL_CondWaitTimeout(videoThread.cond, videoThread.mutex, 1000); + ret = SDL_CondWaitTimeout(videoThread.cond, videoThread.mutex, SDL_ANDROID_CompatibilityHacks ? 400 : 1000); if( videoThread.execute ) { videoThread.threadReady = 0; @@ -1059,6 +1060,11 @@ void SDL_ANDROID_MultiThreadedVideoLoop() videoThread.execute = 0; signalNeeded = 1; } + else if( SDL_ANDROID_CompatibilityHacks && ret == SDL_MUTEX_TIMEDOUT && SDL_CurrentVideoSurface ) + { + ANDROID_FlipHWSurfaceInternal(); + swapBuffersNeeded = 1; + } SDL_mutexV(videoThread.mutex); if( signalNeeded ) SDL_CondSignal(videoThread.cond2); diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c index b2a46e06d..4d3257545 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c @@ -67,6 +67,7 @@ static const char * showScreenKeyboardOldText = ""; static int showScreenKeyboardSendBackspace = 0; int SDL_ANDROID_SmoothVideo = 0; int SDL_ANDROID_VideoMultithreaded = 0; +int SDL_ANDROID_CompatibilityHacks = 0; static void appPutToBackgroundCallbackDefault(void) { @@ -299,3 +300,9 @@ JAVA_EXPORT_NAME(Settings_nativeSetVideoMultithreaded) (JNIEnv* env, jobject thi { SDL_ANDROID_VideoMultithreaded = 1; } + +JNIEXPORT void JNICALL +JAVA_EXPORT_NAME(Settings_nativeSetCompatibilityHacks) (JNIEnv* env, jobject thiz) +{ + SDL_ANDROID_CompatibilityHacks = 1; +} diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h index 6b56091ef..93adea392 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h @@ -40,6 +40,7 @@ extern int SDL_ANDROID_TouchscreenCalibrationX; extern int SDL_ANDROID_TouchscreenCalibrationY; extern int SDL_ANDROID_SmoothVideo; extern int SDL_ANDROID_VideoMultithreaded; +extern int SDL_ANDROID_CompatibilityHacks; extern void SDL_ANDROID_TextInputInit(char * buffer, int len); extern void SDL_ANDROID_TextInputFinished(); extern SDL_Surface *SDL_CurrentVideoSurface;