Optiuon to run video rendering in separate thread - available only for SW mode
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
CHANGE_APP_SETTINGS_VERSION=16
|
||||
CHANGE_APP_SETTINGS_VERSION=17
|
||||
AUTO=
|
||||
|
||||
if [ "X$1" = "X-a" ]; then
|
||||
@@ -103,6 +103,18 @@ if [ -n "$var" ] ; then
|
||||
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
|
||||
echo -n "\nApplication uses mouse (y) or (n) ($AppUsesMouse): "
|
||||
read var
|
||||
@@ -337,6 +349,7 @@ echo AppDataDownloadUrl=\"$AppDataDownloadUrl\" >> AndroidAppSettings.cfg
|
||||
echo SdlVideoResize=$SdlVideoResize >> AndroidAppSettings.cfg
|
||||
echo SdlVideoResizeKeepAspect=$SdlVideoResizeKeepAspect >> AndroidAppSettings.cfg
|
||||
echo NeedDepthBuffer=$NeedDepthBuffer >> AndroidAppSettings.cfg
|
||||
echo SwVideoMode=$SwVideoMode >> AndroidAppSettings.cfg
|
||||
echo AppUsesMouse=$AppUsesMouse >> AndroidAppSettings.cfg
|
||||
echo AppNeedsTwoButtonMouse=$AppNeedsTwoButtonMouse >> AndroidAppSettings.cfg
|
||||
echo AppNeedsArrowKeys=$AppNeedsArrowKeys >> AndroidAppSettings.cfg
|
||||
@@ -404,6 +417,12 @@ else
|
||||
NeedDepthBuffer=false
|
||||
fi
|
||||
|
||||
if [ "$SwVideoMode" = "y" ] ; then
|
||||
SwVideoMode=true
|
||||
else
|
||||
SwVideoMode=false
|
||||
fi
|
||||
|
||||
if [ "$AppUsesMouse" = "y" ] ; then
|
||||
AppUsesMouse=true
|
||||
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 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 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;/" | \
|
||||
|
||||
1
build.sh
1
build.sh
@@ -26,6 +26,7 @@ fi
|
||||
cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build -j4 V=1 && \
|
||||
{ grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \
|
||||
[ -`which ndk-build | grep /android-ndk-r5b/` != - ] && \
|
||||
echo Stripping libapplication.so by hand \
|
||||
rm obj/local/armeabi/libapplication.so && \
|
||||
cp jni/application/src/libapplication.so obj/local/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
|
||||
public static boolean NeedDepthBuffer = false;
|
||||
|
||||
public static boolean SwVideoMode = false;
|
||||
|
||||
public static boolean HorizontalOrientation = true;
|
||||
|
||||
// prevent device from going to suspend mode
|
||||
@@ -101,6 +103,7 @@ class Globals {
|
||||
public static int TouchscreenCalibration[] = new int[4];
|
||||
public static String DataDir = new String("");
|
||||
public static boolean SmoothVideo = false;
|
||||
public static boolean MultiThreadedVideo = false;
|
||||
}
|
||||
|
||||
class LoadLibrary {
|
||||
|
||||
@@ -45,7 +45,7 @@ class Settings
|
||||
|
||||
static boolean settingsLoaded = 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)
|
||||
{
|
||||
@@ -116,6 +116,7 @@ class Settings
|
||||
out.writeBoolean(Globals.RelativeMouseMovement);
|
||||
out.writeInt(Globals.RelativeMouseMovementSpeed);
|
||||
out.writeInt(Globals.RelativeMouseMovementAccel);
|
||||
out.writeBoolean(Globals.MultiThreadedVideo);
|
||||
|
||||
out.writeInt(Globals.OptionalDataDownload.length);
|
||||
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
||||
@@ -249,6 +250,7 @@ class Settings
|
||||
Globals.RelativeMouseMovement = settingsFile.readBoolean();
|
||||
Globals.RelativeMouseMovementSpeed = settingsFile.readInt();
|
||||
Globals.RelativeMouseMovementAccel = settingsFile.readInt();
|
||||
Globals.MultiThreadedVideo = settingsFile.readBoolean();
|
||||
|
||||
Globals.OptionalDataDownload = new boolean[settingsFile.readInt()];
|
||||
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
|
||||
@@ -1982,6 +1984,24 @@ class Settings
|
||||
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)
|
||||
{
|
||||
CharSequence[] items2 = {
|
||||
@@ -2008,6 +2028,8 @@ class Settings
|
||||
Globals.ShowScreenUnderFinger = isChecked;
|
||||
if( item == 2 )
|
||||
Globals.SmoothVideo = isChecked;
|
||||
if( item == 3 )
|
||||
Globals.MultiThreadedVideo = isChecked;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener()
|
||||
@@ -2036,6 +2058,8 @@ class Settings
|
||||
{
|
||||
if(Globals.SmoothVideo)
|
||||
nativeSetSmoothVideo();
|
||||
if( Globals.SwVideoMode && Globals.MultiThreadedVideo )
|
||||
nativeSetVideoMultithreaded();
|
||||
if( Globals.PhoneHasTrackball )
|
||||
nativeSetTrackballUsed();
|
||||
if( Globals.AppUsesMouse )
|
||||
@@ -2157,6 +2181,7 @@ class Settings
|
||||
private static native void nativeSetMultitouchUsed();
|
||||
private static native void nativeSetTouchscreenKeyboardUsed();
|
||||
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 nativeSetupScreenKeyboardButtons(byte[] img);
|
||||
private static native void nativeInitKeymap();
|
||||
|
||||
@@ -213,7 +213,8 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
|
||||
if(Globals.AudioBufferConfig >= 2)
|
||||
Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal
|
||||
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
|
||||
}
|
||||
|
||||
@@ -252,7 +253,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
|
||||
};
|
||||
|
||||
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 nativeDone();
|
||||
private native void nativeGlContextLost();
|
||||
|
||||
@@ -141,5 +141,6 @@
|
||||
|
||||
<string name="video">Video settings</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>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# The application settings for Android libSDL port
|
||||
AppSettingVersion=16
|
||||
AppSettingVersion=17
|
||||
LibSdlVersion=1.2
|
||||
AppName="Ballfield"
|
||||
AppFullName=net.olofson.ballfield
|
||||
@@ -9,6 +9,7 @@ AppDataDownloadUrl="Game data is 1 Mb|ballfield.zip"
|
||||
SdlVideoResize=y
|
||||
SdlVideoResizeKeepAspect=n
|
||||
NeedDepthBuffer=n
|
||||
SwVideoMode=y
|
||||
AppUsesMouse=y
|
||||
AppNeedsTwoButtonMouse=y
|
||||
AppNeedsArrowKeys=n
|
||||
|
||||
@@ -11,7 +11,7 @@ SdlVideoResizeKeepAspect=n
|
||||
NeedDepthBuffer=n
|
||||
AppUsesMouse=y
|
||||
AppNeedsTwoButtonMouse=y
|
||||
AppNeedsArrowKeys=y
|
||||
AppNeedsArrowKeys=n
|
||||
AppNeedsTextInput=y
|
||||
AppUsesJoystick=n
|
||||
AppHandlesJoystickSensitivity=n
|
||||
@@ -22,8 +22,8 @@ AppTouchscreenKeyboardKeysAmount=0
|
||||
AppTouchscreenKeyboardKeysAmountAutoFire=0
|
||||
RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2"
|
||||
MultiABI=n
|
||||
AppVersionCode=10511
|
||||
AppVersionName="1.0.5.11"
|
||||
AppVersionCode=10512
|
||||
AppVersionName="1.0.5.12"
|
||||
CompiledLibraries="jpeg png freetype timidity lzma lzo2"
|
||||
CustomBuildScript=y
|
||||
AppCflags=''
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# The application settings for Android libSDL port
|
||||
AppSettingVersion=16
|
||||
AppSettingVersion=17
|
||||
LibSdlVersion=1.2
|
||||
AppName="SDL Simple Mixer"
|
||||
AppFullName=net.olofson.simplemixer
|
||||
@@ -9,6 +9,7 @@ AppDataDownloadUrl="Game data is 1 Mb|data.zip"
|
||||
SdlVideoResize=y
|
||||
SdlVideoResizeKeepAspect=n
|
||||
NeedDepthBuffer=n
|
||||
SwVideoMode=y
|
||||
AppUsesMouse=y
|
||||
AppNeedsTwoButtonMouse=y
|
||||
AppNeedsArrowKeys=n
|
||||
|
||||
@@ -49,14 +49,12 @@
|
||||
#define DEBUGOUT(...)
|
||||
//#define DEBUGOUT(...) __android_log_print(ANDROID_LOG_INFO, "libSDL", __VA_ARGS__)
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int ANDROID_VideoInit(_THIS, SDL_PixelFormat *vformat);
|
||||
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 int ANDROID_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
|
||||
static void ANDROID_VideoQuit(_THIS);
|
||||
|
||||
/* Hardware surface functions */
|
||||
static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface);
|
||||
static int ANDROID_LockHWSurface(_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_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value);
|
||||
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
|
||||
// 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) { }
|
||||
|
||||
|
||||
/* etc. */
|
||||
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
|
||||
|
||||
|
||||
/* Private display data */
|
||||
|
||||
#define SDL_NUMMODES 12
|
||||
static SDL_Rect *SDL_modelist[SDL_NUMMODES+1];
|
||||
|
||||
@@ -157,13 +158,13 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
||||
}
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = ANDROID_VideoInit;
|
||||
device->VideoInit = SDL_ANDROID_VideoMultithreaded ? ANDROID_VideoInitMT : ANDROID_VideoInit;
|
||||
device->ListModes = ANDROID_ListModes;
|
||||
device->SetVideoMode = ANDROID_SetVideoMode;
|
||||
device->SetVideoMode = SDL_ANDROID_VideoMultithreaded ? ANDROID_SetVideoModeMT : ANDROID_SetVideoMode;
|
||||
device->CreateYUVOverlay = NULL;
|
||||
device->SetColors = ANDROID_SetColors;
|
||||
device->UpdateRects = ANDROID_UpdateRects;
|
||||
device->VideoQuit = ANDROID_VideoQuit;
|
||||
device->UpdateRects = SDL_ANDROID_VideoMultithreaded ? ANDROID_UpdateRectsMT : ANDROID_UpdateRects;
|
||||
device->VideoQuit = SDL_ANDROID_VideoMultithreaded ? ANDROID_VideoQuitMT : ANDROID_VideoQuit;
|
||||
device->AllocHWSurface = ANDROID_AllocHWSurface;
|
||||
device->CheckHWBlit = ANDROID_CheckHWBlit;
|
||||
device->FillHWRect = ANDROID_FillHWRect;
|
||||
@@ -171,7 +172,7 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
||||
device->SetHWAlpha = ANDROID_SetHWAlpha;
|
||||
device->LockHWSurface = ANDROID_LockHWSurface;
|
||||
device->UnlockHWSurface = ANDROID_UnlockHWSurface;
|
||||
device->FlipHWSurface = ANDROID_FlipHWSurface;
|
||||
device->FlipHWSurface = SDL_ANDROID_VideoMultithreaded ? ANDROID_FlipHWSurfaceMT : ANDROID_FlipHWSurface;
|
||||
device->FreeHWSurface = ANDROID_FreeHWSurface;
|
||||
device->SetCaption = NULL;
|
||||
device->SetIcon = NULL;
|
||||
@@ -183,16 +184,14 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
|
||||
device->GL_SwapBuffers = ANDROID_GL_SwapBuffers;
|
||||
device->GL_GetProcAddress = ANDROID_GL_GetProcAddress;
|
||||
device->free = ANDROID_DeleteDevice;
|
||||
device->WarpWMCursor = ANDROID_WarpWMCursor;
|
||||
|
||||
// Stubs
|
||||
device->FreeWMCursor = ANDROID_FreeWMCursor;
|
||||
device->CreateWMCursor = ANDROID_CreateWMCursor;
|
||||
device->ShowWMCursor = ANDROID_ShowWMCursor;
|
||||
device->WarpWMCursor = ANDROID_WarpWMCursor;
|
||||
//device->MoveWMCursor = ANDROID_MoveWMCursor;
|
||||
|
||||
glLibraryHandle = dlopen("libGLESv1_CM.so", RTLD_NOW);
|
||||
__android_log_print(ANDROID_LOG_INFO, "libSDL", "dlopen(\"libGLESv1_CM.so\"): %p", glLibraryHandle);
|
||||
|
||||
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);
|
||||
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
|
||||
{
|
||||
SDL_ANDROID_MainThreadPushMouseMotion(x, y);
|
||||
// TODO: test and enable it
|
||||
/*
|
||||
relativeMovementX = x;
|
||||
relativeMovementY = y;
|
||||
*/
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@ static jmethodID JavaShowScreenKeyboard = NULL;
|
||||
static int glContextLost = 0;
|
||||
static int showScreenKeyboardDeferred = 0;
|
||||
int SDL_ANDROID_SmoothVideo = 0;
|
||||
int SDL_ANDROID_VideoMultithreaded = 0;
|
||||
|
||||
static void appPutToBackgroundCallbackDefault(void)
|
||||
{
|
||||
@@ -252,3 +253,9 @@ JAVA_EXPORT_NAME(Settings_nativeSetSmoothVideo) (JNIEnv* env, jobject thiz)
|
||||
{
|
||||
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_TouchscreenCalibrationY;
|
||||
extern int SDL_ANDROID_SmoothVideo;
|
||||
extern int SDL_ANDROID_VideoMultithreaded;
|
||||
extern SDL_Surface *SDL_CurrentVideoSurface;
|
||||
extern SDL_Rect SDL_ANDROID_ForceClearScreenRect;
|
||||
extern int SDL_ANDROID_ShowScreenUnderFinger;
|
||||
|
||||
@@ -24,15 +24,25 @@
|
||||
#define JAVA_EXPORT_NAME1(name,package) JAVA_EXPORT_NAME2(name,package)
|
||||
#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
|
||||
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;
|
||||
char curdir[PATH_MAX] = "";
|
||||
const jbyte *jstr;
|
||||
const char * str = "sdl";
|
||||
int argc = 0;
|
||||
char ** argv = NULL;
|
||||
|
||||
strcpy(curdir, "/sdcard/app-data/");
|
||||
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++ )
|
||||
__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
|
||||
@@ -101,9 +117,4 @@ JAVA_EXPORT_NAME(Settings_nativeSetEnv) ( JNIEnv* env, jobject thiz, jstring j_
|
||||
(*env)->ReleaseStringUTFChars(env, j_value, value);
|
||||
}
|
||||
|
||||
#undef JAVA_EXPORT_NAME
|
||||
#undef JAVA_EXPORT_NAME1
|
||||
#undef JAVA_EXPORT_NAME2
|
||||
#undef C_LINKAGE
|
||||
|
||||
#endif
|
||||
|
||||
2
todo.txt
2
todo.txt
@@ -7,8 +7,6 @@ I'm not planning any more games to port.
|
||||
Bugs to fix
|
||||
===========
|
||||
|
||||
- Running OpenGL SwapBuffers in a separate thread - huge speed improvement expected.
|
||||
|
||||
- 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)
|
||||
|
||||
Reference in New Issue
Block a user