Optiuon to run video rendering in separate thread - available only for SW mode
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
CHANGE_APP_SETTINGS_VERSION=16
|
CHANGE_APP_SETTINGS_VERSION=17
|
||||||
AUTO=
|
AUTO=
|
||||||
|
|
||||||
if [ "X$1" = "X-a" ]; then
|
if [ "X$1" = "X-a" ]; then
|
||||||
@@ -103,6 +103,18 @@ if [ -n "$var" ] ; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$LibSdlVersion" = "1.2" ]; then
|
||||||
|
if [ -z "$SwVideoMode" -o -z "$AUTO" ]; then
|
||||||
|
echo -n "\nApplication uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL,\nthis will allow small speed optimization (y) or (n) ($SwVideoMode): "
|
||||||
|
read var
|
||||||
|
if [ -n "$var" ] ; then
|
||||||
|
SwVideoMode="$var"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
SwVideoMode=n
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$AppUsesMouse" -o -z "$AUTO" ]; then
|
if [ -z "$AppUsesMouse" -o -z "$AUTO" ]; then
|
||||||
echo -n "\nApplication uses mouse (y) or (n) ($AppUsesMouse): "
|
echo -n "\nApplication uses mouse (y) or (n) ($AppUsesMouse): "
|
||||||
read var
|
read var
|
||||||
@@ -337,6 +349,7 @@ echo AppDataDownloadUrl=\"$AppDataDownloadUrl\" >> AndroidAppSettings.cfg
|
|||||||
echo SdlVideoResize=$SdlVideoResize >> AndroidAppSettings.cfg
|
echo SdlVideoResize=$SdlVideoResize >> AndroidAppSettings.cfg
|
||||||
echo SdlVideoResizeKeepAspect=$SdlVideoResizeKeepAspect >> AndroidAppSettings.cfg
|
echo SdlVideoResizeKeepAspect=$SdlVideoResizeKeepAspect >> AndroidAppSettings.cfg
|
||||||
echo NeedDepthBuffer=$NeedDepthBuffer >> AndroidAppSettings.cfg
|
echo NeedDepthBuffer=$NeedDepthBuffer >> AndroidAppSettings.cfg
|
||||||
|
echo SwVideoMode=$SwVideoMode >> AndroidAppSettings.cfg
|
||||||
echo AppUsesMouse=$AppUsesMouse >> AndroidAppSettings.cfg
|
echo AppUsesMouse=$AppUsesMouse >> AndroidAppSettings.cfg
|
||||||
echo AppNeedsTwoButtonMouse=$AppNeedsTwoButtonMouse >> AndroidAppSettings.cfg
|
echo AppNeedsTwoButtonMouse=$AppNeedsTwoButtonMouse >> AndroidAppSettings.cfg
|
||||||
echo AppNeedsArrowKeys=$AppNeedsArrowKeys >> AndroidAppSettings.cfg
|
echo AppNeedsArrowKeys=$AppNeedsArrowKeys >> AndroidAppSettings.cfg
|
||||||
@@ -404,6 +417,12 @@ else
|
|||||||
NeedDepthBuffer=false
|
NeedDepthBuffer=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$SwVideoMode" = "y" ] ; then
|
||||||
|
SwVideoMode=true
|
||||||
|
else
|
||||||
|
SwVideoMode=false
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$AppUsesMouse" = "y" ] ; then
|
if [ "$AppUsesMouse" = "y" ] ; then
|
||||||
AppUsesMouse=true
|
AppUsesMouse=true
|
||||||
else
|
else
|
||||||
@@ -511,6 +530,7 @@ cat project/src/Globals.java | \
|
|||||||
sed "s/public static final boolean Using_SDL_1_3 = .*;/public static final boolean Using_SDL_1_3 = $UsingSdl13;/" | \
|
sed "s/public static final boolean Using_SDL_1_3 = .*;/public static final boolean Using_SDL_1_3 = $UsingSdl13;/" | \
|
||||||
sed "s@public static String DataDownloadUrl = .*@public static String DataDownloadUrl = \"$AppDataDownloadUrl1\";@" | \
|
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 NeedDepthBuffer = .*;/public static boolean NeedDepthBuffer = $NeedDepthBuffer;/" | \
|
||||||
|
sed "s/public static boolean SwVideoMode = .*;/public static boolean SwVideoMode = $SwVideoMode;/" | \
|
||||||
sed "s/public static boolean HorizontalOrientation = .*;/public static boolean HorizontalOrientation = $HorizontalOrientation;/" | \
|
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 InhibitSuspend = .*;/public static boolean InhibitSuspend = $InhibitSuspend;/" | \
|
||||||
sed "s/public static boolean AppUsesMouse = .*;/public static boolean AppUsesMouse = $AppUsesMouse;/" | \
|
sed "s/public static boolean AppUsesMouse = .*;/public static boolean AppUsesMouse = $AppUsesMouse;/" | \
|
||||||
|
|||||||
1
build.sh
1
build.sh
@@ -26,6 +26,7 @@ fi
|
|||||||
cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build -j4 V=1 && \
|
cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build -j4 V=1 && \
|
||||||
{ grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \
|
{ grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \
|
||||||
[ -`which ndk-build | grep /android-ndk-r5b/` != - ] && \
|
[ -`which ndk-build | grep /android-ndk-r5b/` != - ] && \
|
||||||
|
echo Stripping libapplication.so by hand \
|
||||||
rm obj/local/armeabi/libapplication.so && \
|
rm obj/local/armeabi/libapplication.so && \
|
||||||
cp jni/application/src/libapplication.so obj/local/armeabi && \
|
cp jni/application/src/libapplication.so obj/local/armeabi && \
|
||||||
cp jni/application/src/libapplication.so libs/armeabi && \
|
cp jni/application/src/libapplication.so libs/armeabi && \
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ class Globals {
|
|||||||
// Set this value to true if you're planning to render 3D using OpenGL - it eats some GFX resources, so disabled for 2D
|
// Set this value to true if you're planning to render 3D using OpenGL - it eats some GFX resources, so disabled for 2D
|
||||||
public static boolean NeedDepthBuffer = false;
|
public static boolean NeedDepthBuffer = false;
|
||||||
|
|
||||||
|
public static boolean SwVideoMode = false;
|
||||||
|
|
||||||
public static boolean HorizontalOrientation = true;
|
public static boolean HorizontalOrientation = true;
|
||||||
|
|
||||||
// prevent device from going to suspend mode
|
// prevent device from going to suspend mode
|
||||||
@@ -101,6 +103,7 @@ class Globals {
|
|||||||
public static int TouchscreenCalibration[] = new int[4];
|
public static int TouchscreenCalibration[] = new int[4];
|
||||||
public static String DataDir = new String("");
|
public static String DataDir = new String("");
|
||||||
public static boolean SmoothVideo = false;
|
public static boolean SmoothVideo = false;
|
||||||
|
public static boolean MultiThreadedVideo = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
class LoadLibrary {
|
class LoadLibrary {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class Settings
|
|||||||
|
|
||||||
static boolean settingsLoaded = false;
|
static boolean settingsLoaded = false;
|
||||||
static boolean settingsChanged = false;
|
static boolean settingsChanged = false;
|
||||||
static final int SETTINGS_FILE_VERSION = 3;
|
static final int SETTINGS_FILE_VERSION = 4;
|
||||||
|
|
||||||
static void Save(final MainActivity p)
|
static void Save(final MainActivity p)
|
||||||
{
|
{
|
||||||
@@ -116,6 +116,7 @@ class Settings
|
|||||||
out.writeBoolean(Globals.RelativeMouseMovement);
|
out.writeBoolean(Globals.RelativeMouseMovement);
|
||||||
out.writeInt(Globals.RelativeMouseMovementSpeed);
|
out.writeInt(Globals.RelativeMouseMovementSpeed);
|
||||||
out.writeInt(Globals.RelativeMouseMovementAccel);
|
out.writeInt(Globals.RelativeMouseMovementAccel);
|
||||||
|
out.writeBoolean(Globals.MultiThreadedVideo);
|
||||||
|
|
||||||
out.writeInt(Globals.OptionalDataDownload.length);
|
out.writeInt(Globals.OptionalDataDownload.length);
|
||||||
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
||||||
@@ -249,6 +250,7 @@ class Settings
|
|||||||
Globals.RelativeMouseMovement = settingsFile.readBoolean();
|
Globals.RelativeMouseMovement = settingsFile.readBoolean();
|
||||||
Globals.RelativeMouseMovementSpeed = settingsFile.readInt();
|
Globals.RelativeMouseMovementSpeed = settingsFile.readInt();
|
||||||
Globals.RelativeMouseMovementAccel = settingsFile.readInt();
|
Globals.RelativeMouseMovementAccel = settingsFile.readInt();
|
||||||
|
Globals.MultiThreadedVideo = settingsFile.readBoolean();
|
||||||
|
|
||||||
Globals.OptionalDataDownload = new boolean[settingsFile.readInt()];
|
Globals.OptionalDataDownload = new boolean[settingsFile.readInt()];
|
||||||
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
||||||
@@ -1982,6 +1984,24 @@ class Settings
|
|||||||
Globals.SmoothVideo
|
Globals.SmoothVideo
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if(Globals.SwVideoMode)
|
||||||
|
{
|
||||||
|
CharSequence[] items2 = {
|
||||||
|
p.getResources().getString(R.string.pointandclick_keepaspectratio),
|
||||||
|
p.getResources().getString(R.string.pointandclick_showcreenunderfinger2),
|
||||||
|
p.getResources().getString(R.string.video_smooth),
|
||||||
|
p.getResources().getString(R.string.video_separatethread),
|
||||||
|
};
|
||||||
|
boolean defaults2[] = {
|
||||||
|
Globals.KeepAspectRatio,
|
||||||
|
Globals.ShowScreenUnderFinger,
|
||||||
|
Globals.SmoothVideo,
|
||||||
|
Globals.MultiThreadedVideo
|
||||||
|
};
|
||||||
|
items = items2;
|
||||||
|
defaults = defaults2;
|
||||||
|
}
|
||||||
|
|
||||||
if(Globals.Using_SDL_1_3)
|
if(Globals.Using_SDL_1_3)
|
||||||
{
|
{
|
||||||
CharSequence[] items2 = {
|
CharSequence[] items2 = {
|
||||||
@@ -2008,6 +2028,8 @@ class Settings
|
|||||||
Globals.ShowScreenUnderFinger = isChecked;
|
Globals.ShowScreenUnderFinger = isChecked;
|
||||||
if( item == 2 )
|
if( item == 2 )
|
||||||
Globals.SmoothVideo = isChecked;
|
Globals.SmoothVideo = isChecked;
|
||||||
|
if( item == 3 )
|
||||||
|
Globals.MultiThreadedVideo = isChecked;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener()
|
builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener()
|
||||||
@@ -2036,6 +2058,8 @@ class Settings
|
|||||||
{
|
{
|
||||||
if(Globals.SmoothVideo)
|
if(Globals.SmoothVideo)
|
||||||
nativeSetSmoothVideo();
|
nativeSetSmoothVideo();
|
||||||
|
if( Globals.SwVideoMode && Globals.MultiThreadedVideo )
|
||||||
|
nativeSetVideoMultithreaded();
|
||||||
if( Globals.PhoneHasTrackball )
|
if( Globals.PhoneHasTrackball )
|
||||||
nativeSetTrackballUsed();
|
nativeSetTrackballUsed();
|
||||||
if( Globals.AppUsesMouse )
|
if( Globals.AppUsesMouse )
|
||||||
@@ -2157,6 +2181,7 @@ class Settings
|
|||||||
private static native void nativeSetMultitouchUsed();
|
private static native void nativeSetMultitouchUsed();
|
||||||
private static native void nativeSetTouchscreenKeyboardUsed();
|
private static native void nativeSetTouchscreenKeyboardUsed();
|
||||||
private static native void nativeSetSmoothVideo();
|
private static native void nativeSetSmoothVideo();
|
||||||
|
private static native void nativeSetVideoMultithreaded();
|
||||||
private static native void nativeSetupScreenKeyboard(int size, int theme, int nbuttonsAutoFire, int transparency);
|
private static native void nativeSetupScreenKeyboard(int size, int theme, int nbuttonsAutoFire, int transparency);
|
||||||
private static native void nativeSetupScreenKeyboardButtons(byte[] img);
|
private static native void nativeSetupScreenKeyboardButtons(byte[] img);
|
||||||
private static native void nativeInitKeymap();
|
private static native void nativeInitKeymap();
|
||||||
|
|||||||
@@ -213,7 +213,8 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
|
|||||||
if(Globals.AudioBufferConfig >= 2)
|
if(Globals.AudioBufferConfig >= 2)
|
||||||
Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal
|
Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal
|
||||||
nativeInit( Globals.DataDir,
|
nativeInit( Globals.DataDir,
|
||||||
Globals.CommandLine); // Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code
|
Globals.CommandLine,
|
||||||
|
( Globals.SwVideoMode && Globals.MultiThreadedVideo ) ? 1 : 0 ); // Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code
|
||||||
System.exit(0); // The main() returns here - I don't bother with deinit stuff, just terminate process
|
System.exit(0); // The main() returns here - I don't bother with deinit stuff, just terminate process
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +253,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private native void nativeInitJavaCallbacks();
|
private native void nativeInitJavaCallbacks();
|
||||||
private native void nativeInit(String CurrentPath, String CommandLine);
|
private native void nativeInit(String CurrentPath, String CommandLine, int multiThreadedVideo);
|
||||||
private native void nativeResize(int w, int h, int keepAspectRatio);
|
private native void nativeResize(int w, int h, int keepAspectRatio);
|
||||||
private native void nativeDone();
|
private native void nativeDone();
|
||||||
private native void nativeGlContextLost();
|
private native void nativeGlContextLost();
|
||||||
|
|||||||
@@ -141,5 +141,6 @@
|
|||||||
|
|
||||||
<string name="video">Video settings</string>
|
<string name="video">Video settings</string>
|
||||||
<string name="video_smooth">Smooth the video</string>
|
<string name="video_smooth">Smooth the video</string>
|
||||||
|
<string name="video_separatethread">Separate thread for video, will increase FPS on some devices</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# The application settings for Android libSDL port
|
# The application settings for Android libSDL port
|
||||||
AppSettingVersion=16
|
AppSettingVersion=17
|
||||||
LibSdlVersion=1.2
|
LibSdlVersion=1.2
|
||||||
AppName="Ballfield"
|
AppName="Ballfield"
|
||||||
AppFullName=net.olofson.ballfield
|
AppFullName=net.olofson.ballfield
|
||||||
@@ -9,6 +9,7 @@ AppDataDownloadUrl="Game data is 1 Mb|ballfield.zip"
|
|||||||
SdlVideoResize=y
|
SdlVideoResize=y
|
||||||
SdlVideoResizeKeepAspect=n
|
SdlVideoResizeKeepAspect=n
|
||||||
NeedDepthBuffer=n
|
NeedDepthBuffer=n
|
||||||
|
SwVideoMode=y
|
||||||
AppUsesMouse=y
|
AppUsesMouse=y
|
||||||
AppNeedsTwoButtonMouse=y
|
AppNeedsTwoButtonMouse=y
|
||||||
AppNeedsArrowKeys=n
|
AppNeedsArrowKeys=n
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ SdlVideoResizeKeepAspect=n
|
|||||||
NeedDepthBuffer=n
|
NeedDepthBuffer=n
|
||||||
AppUsesMouse=y
|
AppUsesMouse=y
|
||||||
AppNeedsTwoButtonMouse=y
|
AppNeedsTwoButtonMouse=y
|
||||||
AppNeedsArrowKeys=y
|
AppNeedsArrowKeys=n
|
||||||
AppNeedsTextInput=y
|
AppNeedsTextInput=y
|
||||||
AppUsesJoystick=n
|
AppUsesJoystick=n
|
||||||
AppHandlesJoystickSensitivity=n
|
AppHandlesJoystickSensitivity=n
|
||||||
@@ -22,8 +22,8 @@ AppTouchscreenKeyboardKeysAmount=0
|
|||||||
AppTouchscreenKeyboardKeysAmountAutoFire=0
|
AppTouchscreenKeyboardKeysAmountAutoFire=0
|
||||||
RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2"
|
RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2"
|
||||||
MultiABI=n
|
MultiABI=n
|
||||||
AppVersionCode=10511
|
AppVersionCode=10512
|
||||||
AppVersionName="1.0.5.11"
|
AppVersionName="1.0.5.12"
|
||||||
CompiledLibraries="jpeg png freetype timidity lzma lzo2"
|
CompiledLibraries="jpeg png freetype timidity lzma lzo2"
|
||||||
CustomBuildScript=y
|
CustomBuildScript=y
|
||||||
AppCflags=''
|
AppCflags=''
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# The application settings for Android libSDL port
|
# The application settings for Android libSDL port
|
||||||
AppSettingVersion=16
|
AppSettingVersion=17
|
||||||
LibSdlVersion=1.2
|
LibSdlVersion=1.2
|
||||||
AppName="SDL Simple Mixer"
|
AppName="SDL Simple Mixer"
|
||||||
AppFullName=net.olofson.simplemixer
|
AppFullName=net.olofson.simplemixer
|
||||||
@@ -9,6 +9,7 @@ AppDataDownloadUrl="Game data is 1 Mb|data.zip"
|
|||||||
SdlVideoResize=y
|
SdlVideoResize=y
|
||||||
SdlVideoResizeKeepAspect=n
|
SdlVideoResizeKeepAspect=n
|
||||||
NeedDepthBuffer=n
|
NeedDepthBuffer=n
|
||||||
|
SwVideoMode=y
|
||||||
AppUsesMouse=y
|
AppUsesMouse=y
|
||||||
AppNeedsTwoButtonMouse=y
|
AppNeedsTwoButtonMouse=y
|
||||||
AppNeedsArrowKeys=n
|
AppNeedsArrowKeys=n
|
||||||
|
|||||||
@@ -49,14 +49,12 @@
|
|||||||
#define DEBUGOUT(...)
|
#define DEBUGOUT(...)
|
||||||
//#define DEBUGOUT(...) __android_log_print(ANDROID_LOG_INFO, "libSDL", __VA_ARGS__)
|
//#define DEBUGOUT(...) __android_log_print(ANDROID_LOG_INFO, "libSDL", __VA_ARGS__)
|
||||||
|
|
||||||
/* Initialization/Query functions */
|
|
||||||
static int ANDROID_VideoInit(_THIS, SDL_PixelFormat *vformat);
|
static int ANDROID_VideoInit(_THIS, SDL_PixelFormat *vformat);
|
||||||
static SDL_Rect **ANDROID_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
|
static SDL_Rect **ANDROID_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
|
||||||
static SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
|
static SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
|
||||||
static int ANDROID_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
|
static int ANDROID_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
|
||||||
static void ANDROID_VideoQuit(_THIS);
|
static void ANDROID_VideoQuit(_THIS);
|
||||||
|
|
||||||
/* Hardware surface functions */
|
|
||||||
static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface);
|
static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface);
|
||||||
static int ANDROID_LockHWSurface(_THIS, SDL_Surface *surface);
|
static int ANDROID_LockHWSurface(_THIS, SDL_Surface *surface);
|
||||||
static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface);
|
static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface);
|
||||||
@@ -69,6 +67,15 @@ static int ANDROID_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 co
|
|||||||
static int ANDROID_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key);
|
static int ANDROID_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key);
|
||||||
static int ANDROID_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value);
|
static int ANDROID_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value);
|
||||||
static void* ANDROID_GL_GetProcAddress(_THIS, const char *proc);
|
static void* ANDROID_GL_GetProcAddress(_THIS, const char *proc);
|
||||||
|
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
|
||||||
|
|
||||||
|
// Multithreaded video support for speed optimization
|
||||||
|
static int ANDROID_VideoInitMT(_THIS, SDL_PixelFormat *vformat);
|
||||||
|
static SDL_Surface *ANDROID_SetVideoModeMT(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
|
||||||
|
static void ANDROID_VideoQuitMT(_THIS);
|
||||||
|
static void ANDROID_UpdateRectsMT(_THIS, int numrects, SDL_Rect *rects);
|
||||||
|
static int ANDROID_FlipHWSurfaceMT(_THIS, SDL_Surface *surface);
|
||||||
|
|
||||||
|
|
||||||
// Stubs to get rid of crashing in OpenGL mode
|
// Stubs to get rid of crashing in OpenGL mode
|
||||||
// The implementation dependent data for the window manager cursor
|
// The implementation dependent data for the window manager cursor
|
||||||
@@ -99,12 +106,6 @@ void ANDROID_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
|
|||||||
//void ANDROID_MoveWMCursor(_THIS, int x, int y) { }
|
//void ANDROID_MoveWMCursor(_THIS, int x, int y) { }
|
||||||
|
|
||||||
|
|
||||||
/* etc. */
|
|
||||||
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
|
|
||||||
|
|
||||||
|
|
||||||
/* Private display data */
|
|
||||||
|
|
||||||
#define SDL_NUMMODES 12
|
#define SDL_NUMMODES 12
|
||||||
static SDL_Rect *SDL_modelist[SDL_NUMMODES+1];
|
static SDL_Rect *SDL_modelist[SDL_NUMMODES+1];
|
||||||
|
|
||||||
@@ -157,13 +158,13 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the function pointers */
|
/* Set the function pointers */
|
||||||
device->VideoInit = ANDROID_VideoInit;
|
device->VideoInit = SDL_ANDROID_VideoMultithreaded ? ANDROID_VideoInitMT : ANDROID_VideoInit;
|
||||||
device->ListModes = ANDROID_ListModes;
|
device->ListModes = ANDROID_ListModes;
|
||||||
device->SetVideoMode = ANDROID_SetVideoMode;
|
device->SetVideoMode = SDL_ANDROID_VideoMultithreaded ? ANDROID_SetVideoModeMT : ANDROID_SetVideoMode;
|
||||||
device->CreateYUVOverlay = NULL;
|
device->CreateYUVOverlay = NULL;
|
||||||
device->SetColors = ANDROID_SetColors;
|
device->SetColors = ANDROID_SetColors;
|
||||||
device->UpdateRects = ANDROID_UpdateRects;
|
device->UpdateRects = SDL_ANDROID_VideoMultithreaded ? ANDROID_UpdateRectsMT : ANDROID_UpdateRects;
|
||||||
device->VideoQuit = ANDROID_VideoQuit;
|
device->VideoQuit = SDL_ANDROID_VideoMultithreaded ? ANDROID_VideoQuitMT : ANDROID_VideoQuit;
|
||||||
device->AllocHWSurface = ANDROID_AllocHWSurface;
|
device->AllocHWSurface = ANDROID_AllocHWSurface;
|
||||||
device->CheckHWBlit = ANDROID_CheckHWBlit;
|
device->CheckHWBlit = ANDROID_CheckHWBlit;
|
||||||
device->FillHWRect = ANDROID_FillHWRect;
|
device->FillHWRect = ANDROID_FillHWRect;
|
||||||
@@ -171,7 +172,7 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
|||||||
device->SetHWAlpha = ANDROID_SetHWAlpha;
|
device->SetHWAlpha = ANDROID_SetHWAlpha;
|
||||||
device->LockHWSurface = ANDROID_LockHWSurface;
|
device->LockHWSurface = ANDROID_LockHWSurface;
|
||||||
device->UnlockHWSurface = ANDROID_UnlockHWSurface;
|
device->UnlockHWSurface = ANDROID_UnlockHWSurface;
|
||||||
device->FlipHWSurface = ANDROID_FlipHWSurface;
|
device->FlipHWSurface = SDL_ANDROID_VideoMultithreaded ? ANDROID_FlipHWSurfaceMT : ANDROID_FlipHWSurface;
|
||||||
device->FreeHWSurface = ANDROID_FreeHWSurface;
|
device->FreeHWSurface = ANDROID_FreeHWSurface;
|
||||||
device->SetCaption = NULL;
|
device->SetCaption = NULL;
|
||||||
device->SetIcon = NULL;
|
device->SetIcon = NULL;
|
||||||
@@ -183,16 +184,14 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
|||||||
device->GL_SwapBuffers = ANDROID_GL_SwapBuffers;
|
device->GL_SwapBuffers = ANDROID_GL_SwapBuffers;
|
||||||
device->GL_GetProcAddress = ANDROID_GL_GetProcAddress;
|
device->GL_GetProcAddress = ANDROID_GL_GetProcAddress;
|
||||||
device->free = ANDROID_DeleteDevice;
|
device->free = ANDROID_DeleteDevice;
|
||||||
|
device->WarpWMCursor = ANDROID_WarpWMCursor;
|
||||||
|
|
||||||
// Stubs
|
// Stubs
|
||||||
device->FreeWMCursor = ANDROID_FreeWMCursor;
|
device->FreeWMCursor = ANDROID_FreeWMCursor;
|
||||||
device->CreateWMCursor = ANDROID_CreateWMCursor;
|
device->CreateWMCursor = ANDROID_CreateWMCursor;
|
||||||
device->ShowWMCursor = ANDROID_ShowWMCursor;
|
device->ShowWMCursor = ANDROID_ShowWMCursor;
|
||||||
device->WarpWMCursor = ANDROID_WarpWMCursor;
|
|
||||||
//device->MoveWMCursor = ANDROID_MoveWMCursor;
|
|
||||||
|
|
||||||
glLibraryHandle = dlopen("libGLESv1_CM.so", RTLD_NOW);
|
glLibraryHandle = dlopen("libGLESv1_CM.so", RTLD_NOW);
|
||||||
__android_log_print(ANDROID_LOG_INFO, "libSDL", "dlopen(\"libGLESv1_CM.so\"): %p", glLibraryHandle);
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
@@ -971,3 +970,164 @@ static void* ANDROID_GL_GetProcAddress(_THIS, const char *proc)
|
|||||||
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_GL_GetProcAddress(\"%s\"): %p", proc, func);
|
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_GL_GetProcAddress(\"%s\"): %p", proc, func);
|
||||||
return func;
|
return func;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Multithreaded video - this will free up some CPU time while GPU renders video inside SDL_Flip()
|
||||||
|
enum videoThreadCmd_t { CMD_INIT, CMD_SETVIDEOMODE, CMD_QUIT, CMD_UPDATERECTS, CMD_FLIP };
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SDL_mutex * mutex;
|
||||||
|
SDL_cond * cond;
|
||||||
|
SDL_cond * cond2;
|
||||||
|
int execute;
|
||||||
|
int threadReady;
|
||||||
|
enum videoThreadCmd_t cmd;
|
||||||
|
SDL_VideoDevice *_this;
|
||||||
|
SDL_PixelFormat *vformat;
|
||||||
|
SDL_Surface *current;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int bpp;
|
||||||
|
Uint32 flags;
|
||||||
|
|
||||||
|
int retcode;
|
||||||
|
SDL_Surface * retcode2;
|
||||||
|
} videoThread_t;
|
||||||
|
static videoThread_t videoThread;
|
||||||
|
|
||||||
|
extern void SDL_ANDROID_MultiThreadedVideoLoopInit();
|
||||||
|
extern void SDL_ANDROID_MultiThreadedVideoLoop();
|
||||||
|
|
||||||
|
void SDL_ANDROID_MultiThreadedVideoLoopInit()
|
||||||
|
{
|
||||||
|
videoThread.mutex = SDL_CreateMutex();
|
||||||
|
videoThread.cond = SDL_CreateCond();
|
||||||
|
videoThread.cond2 = SDL_CreateCond();
|
||||||
|
videoThread.execute = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_ANDROID_MultiThreadedVideoLoop()
|
||||||
|
{
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int signalNeeded = 0;
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
videoThread.threadReady = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond2);
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond, videoThread.mutex, 10000);
|
||||||
|
if( videoThread.execute )
|
||||||
|
{
|
||||||
|
videoThread.threadReady = 0;
|
||||||
|
switch( videoThread.cmd )
|
||||||
|
{
|
||||||
|
case CMD_INIT:
|
||||||
|
videoThread.retcode = ANDROID_VideoInit(videoThread._this, videoThread.vformat);
|
||||||
|
break;
|
||||||
|
case CMD_SETVIDEOMODE:
|
||||||
|
videoThread.retcode2 = ANDROID_SetVideoMode(videoThread._this, videoThread.current,
|
||||||
|
videoThread.width, videoThread.height, videoThread.bpp, videoThread.flags);
|
||||||
|
break;
|
||||||
|
case CMD_QUIT:
|
||||||
|
ANDROID_VideoQuit(videoThread._this);
|
||||||
|
break;
|
||||||
|
case CMD_UPDATERECTS:
|
||||||
|
ANDROID_UpdateRects(videoThread._this, 0, NULL);
|
||||||
|
break;
|
||||||
|
case CMD_FLIP:
|
||||||
|
videoThread.retcode = ANDROID_FlipHWSurface(videoThread._this, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
videoThread.execute = 0;
|
||||||
|
signalNeeded = 1;
|
||||||
|
}
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
if( signalNeeded )
|
||||||
|
SDL_CondSignal(videoThread.cond2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ANDROID_VideoInitMT(_THIS, SDL_PixelFormat *vformat)
|
||||||
|
{
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
while( ! videoThread.threadReady )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
videoThread.cmd = CMD_INIT;
|
||||||
|
videoThread._this = this;
|
||||||
|
videoThread.vformat = vformat;
|
||||||
|
videoThread.execute = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond);
|
||||||
|
while( videoThread.execute )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
int ret = videoThread.retcode;
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface *ANDROID_SetVideoModeMT(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags)
|
||||||
|
{
|
||||||
|
if( flags & SDL_OPENGL || flags & SDL_HWSURFACE )
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_FATAL, "libSDL", "SDL_SetVideoMode(): cannot use multi-threaded video with SDL_OPENGL or SDL_HWSURFACE flags");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
while( ! videoThread.threadReady )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
videoThread.cmd = CMD_SETVIDEOMODE;
|
||||||
|
videoThread._this = this;
|
||||||
|
videoThread.current = current;
|
||||||
|
videoThread.width = width;
|
||||||
|
videoThread.height = height;
|
||||||
|
videoThread.bpp = bpp;
|
||||||
|
videoThread.flags = flags;
|
||||||
|
videoThread.execute = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond);
|
||||||
|
while( videoThread.execute )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
SDL_Surface * ret = videoThread.retcode2;
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANDROID_VideoQuitMT(_THIS)
|
||||||
|
{
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
while( ! videoThread.threadReady )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
videoThread.cmd = CMD_QUIT;
|
||||||
|
videoThread._this = this;
|
||||||
|
videoThread.execute = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond);
|
||||||
|
while( videoThread.execute )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANDROID_UpdateRectsMT(_THIS, int numrects, SDL_Rect *rects)
|
||||||
|
{
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
while( ! videoThread.threadReady )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
videoThread.cmd = CMD_UPDATERECTS;
|
||||||
|
videoThread._this = this;
|
||||||
|
videoThread.execute = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond);
|
||||||
|
while( videoThread.execute )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ANDROID_FlipHWSurfaceMT(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
SDL_mutexP(videoThread.mutex);
|
||||||
|
while( ! videoThread.threadReady )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
videoThread.cmd = CMD_FLIP;
|
||||||
|
videoThread._this = this;
|
||||||
|
videoThread.execute = 1;
|
||||||
|
SDL_CondSignal(videoThread.cond);
|
||||||
|
while( videoThread.execute )
|
||||||
|
SDL_CondWaitTimeout(videoThread.cond2, videoThread.mutex, 10000);
|
||||||
|
int ret = videoThread.retcode;
|
||||||
|
SDL_mutexV(videoThread.mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|||||||
@@ -603,8 +603,12 @@ void SDL_ANDROID_WarpMouse(int x, int y)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SDL_ANDROID_MainThreadPushMouseMotion(x, y);
|
||||||
|
// TODO: test and enable it
|
||||||
|
/*
|
||||||
relativeMovementX = x;
|
relativeMovementX = x;
|
||||||
relativeMovementY = y;
|
relativeMovementY = y;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ static jmethodID JavaShowScreenKeyboard = NULL;
|
|||||||
static int glContextLost = 0;
|
static int glContextLost = 0;
|
||||||
static int showScreenKeyboardDeferred = 0;
|
static int showScreenKeyboardDeferred = 0;
|
||||||
int SDL_ANDROID_SmoothVideo = 0;
|
int SDL_ANDROID_SmoothVideo = 0;
|
||||||
|
int SDL_ANDROID_VideoMultithreaded = 0;
|
||||||
|
|
||||||
static void appPutToBackgroundCallbackDefault(void)
|
static void appPutToBackgroundCallbackDefault(void)
|
||||||
{
|
{
|
||||||
@@ -252,3 +253,9 @@ JAVA_EXPORT_NAME(Settings_nativeSetSmoothVideo) (JNIEnv* env, jobject thiz)
|
|||||||
{
|
{
|
||||||
SDL_ANDROID_SmoothVideo = 1;
|
SDL_ANDROID_SmoothVideo = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
JAVA_EXPORT_NAME(Settings_nativeSetVideoMultithreaded) (JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
SDL_ANDROID_VideoMultithreaded = 1;
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ extern int SDL_ANDROID_TouchscreenCalibrationHeight;
|
|||||||
extern int SDL_ANDROID_TouchscreenCalibrationX;
|
extern int SDL_ANDROID_TouchscreenCalibrationX;
|
||||||
extern int SDL_ANDROID_TouchscreenCalibrationY;
|
extern int SDL_ANDROID_TouchscreenCalibrationY;
|
||||||
extern int SDL_ANDROID_SmoothVideo;
|
extern int SDL_ANDROID_SmoothVideo;
|
||||||
|
extern int SDL_ANDROID_VideoMultithreaded;
|
||||||
extern SDL_Surface *SDL_CurrentVideoSurface;
|
extern SDL_Surface *SDL_CurrentVideoSurface;
|
||||||
extern SDL_Rect SDL_ANDROID_ForceClearScreenRect;
|
extern SDL_Rect SDL_ANDROID_ForceClearScreenRect;
|
||||||
extern int SDL_ANDROID_ShowScreenUnderFinger;
|
extern int SDL_ANDROID_ShowScreenUnderFinger;
|
||||||
|
|||||||
@@ -24,15 +24,25 @@
|
|||||||
#define JAVA_EXPORT_NAME1(name,package) JAVA_EXPORT_NAME2(name,package)
|
#define JAVA_EXPORT_NAME1(name,package) JAVA_EXPORT_NAME2(name,package)
|
||||||
#define JAVA_EXPORT_NAME(name) JAVA_EXPORT_NAME1(name,SDL_JAVA_PACKAGE_PATH)
|
#define JAVA_EXPORT_NAME(name) JAVA_EXPORT_NAME1(name,SDL_JAVA_PACKAGE_PATH)
|
||||||
|
|
||||||
|
extern void SDL_ANDROID_MultiThreadedVideoLoopInit();
|
||||||
|
extern void SDL_ANDROID_MultiThreadedVideoLoop();
|
||||||
|
|
||||||
|
static int argc = 0;
|
||||||
|
static char ** argv = NULL;
|
||||||
|
|
||||||
|
static int threadedMain(void * unused)
|
||||||
|
{
|
||||||
|
SDL_main( argc, argv );
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
extern C_LINKAGE void
|
extern C_LINKAGE void
|
||||||
JAVA_EXPORT_NAME(DemoRenderer_nativeInit) ( JNIEnv* env, jobject thiz, jstring jcurdir, jstring cmdline )
|
JAVA_EXPORT_NAME(DemoRenderer_nativeInit) ( JNIEnv* env, jobject thiz, jstring jcurdir, jstring cmdline, jint multiThreadedVideo )
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
char curdir[PATH_MAX] = "";
|
char curdir[PATH_MAX] = "";
|
||||||
const jbyte *jstr;
|
const jbyte *jstr;
|
||||||
const char * str = "sdl";
|
const char * str = "sdl";
|
||||||
int argc = 0;
|
|
||||||
char ** argv = NULL;
|
|
||||||
|
|
||||||
strcpy(curdir, "/sdcard/app-data/");
|
strcpy(curdir, "/sdcard/app-data/");
|
||||||
strcat(curdir, SDL_CURDIR_PATH);
|
strcat(curdir, SDL_CURDIR_PATH);
|
||||||
@@ -86,8 +96,14 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInit) ( JNIEnv* env, jobject thiz, jstring
|
|||||||
for( i = 0; i < argc; i++ )
|
for( i = 0; i < argc; i++ )
|
||||||
__android_log_print(ANDROID_LOG_INFO, "libSDL", "param %d = \"%s\"", i, argv[i]);
|
__android_log_print(ANDROID_LOG_INFO, "libSDL", "param %d = \"%s\"", i, argv[i]);
|
||||||
|
|
||||||
main( argc, argv );
|
if( ! multiThreadedVideo )
|
||||||
|
SDL_main( argc, argv );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_ANDROID_MultiThreadedVideoLoopInit();
|
||||||
|
SDL_CreateThread(threadedMain, NULL);
|
||||||
|
SDL_ANDROID_MultiThreadedVideoLoop();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern C_LINKAGE void
|
extern C_LINKAGE void
|
||||||
@@ -101,9 +117,4 @@ JAVA_EXPORT_NAME(Settings_nativeSetEnv) ( JNIEnv* env, jobject thiz, jstring j_
|
|||||||
(*env)->ReleaseStringUTFChars(env, j_value, value);
|
(*env)->ReleaseStringUTFChars(env, j_value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef JAVA_EXPORT_NAME
|
|
||||||
#undef JAVA_EXPORT_NAME1
|
|
||||||
#undef JAVA_EXPORT_NAME2
|
|
||||||
#undef C_LINKAGE
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
2
todo.txt
2
todo.txt
@@ -7,8 +7,6 @@ I'm not planning any more games to port.
|
|||||||
Bugs to fix
|
Bugs to fix
|
||||||
===========
|
===========
|
||||||
|
|
||||||
- Running OpenGL SwapBuffers in a separate thread - huge speed improvement expected.
|
|
||||||
|
|
||||||
- Show/hide screen controls with longpress on Text Edit button.
|
- Show/hide screen controls with longpress on Text Edit button.
|
||||||
|
|
||||||
- Support of libjnigraphics (it will disable on-screen keyboard, only SW SDL screen surface supported)
|
- Support of libjnigraphics (it will disable on-screen keyboard, only SW SDL screen surface supported)
|
||||||
|
|||||||
Reference in New Issue
Block a user