Optiuon to run video rendering in separate thread - available only for SW mode

This commit is contained in:
pelya
2011-02-15 15:40:40 +00:00
parent adc6777fe7
commit 090ab8154c
15 changed files with 271 additions and 37 deletions

View File

@@ -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;/" | \

View File

@@ -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 && \

View File

@@ -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 {

View File

@@ -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();

View File

@@ -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();

View File

@@ -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>

View File

@@ -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

View File

@@ -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=''

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
*/
} }
}; };

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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)