mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-17 08:20:30 +02:00
Restore JIT for armv7/armv7s iOS 9 devices, which were erroneously disabled when I fixed PPSSPP's arm64 crashing.
This commit is contained in:
1 parent
6764ff295e
commit
c4a28a2998
2 files changed
+168
-156
No files matched your search
@@ -1030,7 +1030,8 @@ void DeveloperToolsScreen::CreateViews() {
|
||||
if (!iosCanUseJit) {
|
||||
canUseJit = false;
|
||||
if (targetIsJailbroken) {
|
||||
list->Add(new TextView(sy->T("iOS9NoDynarec", "Dynarec (JIT) - (JIT temporarily unavailable on iOS 9)")));
|
||||
// if the device is jailbroken and it's being marked as unable to JIT, then that means it must be arm64 iOS 9
|
||||
list->Add(new TextView(sy->T("iOS9NoDynarec", "Dynarec (JIT) - (JIT not yet working on arm64 iOS 9)")));
|
||||
} else {
|
||||
list->Add(new TextView(sy->T("DynarecisJailed", "Dynarec (JIT) - (Not jailbroken - JIT not available)")));
|
||||
}
|
||||
|
||||
+166
-155
@@ -20,6 +20,10 @@
|
||||
#include "Core/Config.h"
|
||||
#include "GPU/GLES/FBO.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <mach/machine.h>
|
||||
|
||||
#define IS_IPAD() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
|
||||
#define IS_IPHONE() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
|
||||
|
||||
@@ -61,9 +65,15 @@ ViewController* sharedViewController;
|
||||
@end
|
||||
|
||||
@implementation ViewController
|
||||
-(bool) isArm64 {
|
||||
size_t size;
|
||||
cpu_type_t type;
|
||||
size = sizeof(type);
|
||||
sysctlbyname("hw.cputype", &type, &size, NULL, 0);
|
||||
return type == CPU_TYPE_ARM64;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
-(id) init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
sharedViewController = self;
|
||||
@@ -90,12 +100,14 @@ ViewController* sharedViewController;
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:string]) {
|
||||
// checking device jailbreak status in order to determine which message to show in GameSettingsScreen
|
||||
targetIsJailbroken = true;
|
||||
if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_IOS_9_0) {
|
||||
// if we're running on iOS arm64, only iOS <9 is supported with JIT.
|
||||
// if we're running on anything that isn't arm64, then JIT is supported on all iOS versions.
|
||||
if (![self isArm64] || [self isArm64] && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_IOS_9_0) {
|
||||
iosCanUseJit = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NativeInit(0, NULL, [self.documentsPath UTF8String], [self.bundlePath UTF8String], NULL);
|
||||
|
||||
iCadeToKeyMap[iCadeJoystickUp] = NKCODE_DPAD_UP;
|
||||
@@ -113,27 +125,26 @@ ViewController* sharedViewController;
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
|
||||
if ([GCController class]) // Checking the availability of a GameController framework
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controllerDidConnect:) name:GCControllerDidConnectNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controllerDidDisconnect:) name:GCControllerDidDisconnectNotification object:nil];
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controllerDidConnect:) name:GCControllerDidConnectNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controllerDidDisconnect:) name:GCControllerDidDisconnectNotification object:nil];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
self.view.frame = [[UIScreen mainScreen] bounds];
|
||||
self.view.multipleTouchEnabled = YES;
|
||||
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
|
||||
|
||||
if (!self.context)
|
||||
{
|
||||
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
|
||||
}
|
||||
|
||||
if (!self.context)
|
||||
{
|
||||
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
|
||||
}
|
||||
|
||||
GLKView* view = (GLKView *)self.view;
|
||||
view.context = self.context;
|
||||
@@ -150,7 +161,7 @@ ViewController* sharedViewController;
|
||||
CGSize size = [[UIApplication sharedApplication].delegate window].frame.size;
|
||||
|
||||
if (size.height > size.width)
|
||||
{
|
||||
{
|
||||
float h = size.height;
|
||||
size.height = size.width;
|
||||
size.width = h;
|
||||
@@ -170,18 +181,18 @@ ViewController* sharedViewController;
|
||||
|
||||
dp_xscale = (float)dp_xres / (float)pixel_xres;
|
||||
dp_yscale = (float)dp_yres / (float)pixel_yres;
|
||||
|
||||
|
||||
self.iCadeView = [[iCadeReaderView alloc] init];
|
||||
[self.view addSubview:self.iCadeView];
|
||||
self.iCadeView.delegate = self;
|
||||
self.iCadeView.active = YES;
|
||||
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
|
||||
if ([GCController class]) {
|
||||
if ([[GCController controllers] count] > 0) {
|
||||
[self setupController:[[GCController controllers] firstObject]];
|
||||
}
|
||||
}
|
||||
if ([GCController class]) {
|
||||
if ([[GCController controllers] count] > 0) {
|
||||
[self setupController:[[GCController controllers] firstObject]];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -206,12 +217,12 @@ ViewController* sharedViewController;
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
|
||||
if ([GCController class]) {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:GCControllerDidConnectNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:GCControllerDidDisconnectNotification object:nil];
|
||||
self.gameController = nil;
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:GCControllerDidConnectNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:GCControllerDidDisconnectNotification object:nil];
|
||||
self.gameController = nil;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
NativeShutdown();
|
||||
}
|
||||
|
||||
@@ -305,7 +316,7 @@ ViewController* sharedViewController;
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
for(UITouch* touch in touches)
|
||||
{
|
||||
{
|
||||
NSDictionary* dict = @{@"touch":touch,@"index":@([self freeTouchIndex])};
|
||||
[self.touches addObject:dict];
|
||||
CGPoint point = [touch locationInView:self.view];
|
||||
@@ -316,7 +327,7 @@ ViewController* sharedViewController;
|
||||
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
for(UITouch* touch in touches)
|
||||
{
|
||||
{
|
||||
CGPoint point = [touch locationInView:self.view];
|
||||
NSDictionary* dict = [self touchDictBy:touch];
|
||||
[self touchX:point.x y:point.y code:0 pointerId:[[dict objectForKey:@"index"] intValue]];
|
||||
@@ -326,7 +337,7 @@ ViewController* sharedViewController;
|
||||
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
for(UITouch* touch in touches)
|
||||
{
|
||||
{
|
||||
CGPoint point = [touch locationInView:self.view];
|
||||
NSDictionary* dict = [self touchDictBy:touch];
|
||||
[self touchX:point.x y:point.y code:2 pointerId:[[dict objectForKey:@"index"] intValue]];
|
||||
@@ -452,143 +463,143 @@ ViewController* sharedViewController;
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
|
||||
- (void)controllerDidConnect:(NSNotification *)note
|
||||
{
|
||||
if (![[GCController controllers] containsObject:self.gameController]) self.gameController = nil;
|
||||
|
||||
if (self.gameController != nil) return; // already have a connected controller
|
||||
|
||||
[self setupController:(GCController *)note.object];
|
||||
if (![[GCController controllers] containsObject:self.gameController]) self.gameController = nil;
|
||||
|
||||
if (self.gameController != nil) return; // already have a connected controller
|
||||
|
||||
[self setupController:(GCController *)note.object];
|
||||
}
|
||||
|
||||
- (void)controllerDidDisconnect:(NSNotification *)note
|
||||
{
|
||||
if (self.gameController == note.object) {
|
||||
self.gameController = nil;
|
||||
|
||||
if ([[GCController controllers] count] > 0) {
|
||||
[self setupController:[[GCController controllers] firstObject]];
|
||||
} else {
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:NO];
|
||||
}
|
||||
}
|
||||
if (self.gameController == note.object) {
|
||||
self.gameController = nil;
|
||||
|
||||
if ([[GCController controllers] count] > 0) {
|
||||
[self setupController:[[GCController controllers] firstObject]];
|
||||
} else {
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:NO];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)controllerButtonPressed:(BOOL)pressed keyCode:(keycode_t)keyCode
|
||||
{
|
||||
KeyInput key;
|
||||
key.deviceId = DEVICE_ID_PAD_0;
|
||||
key.flags = pressed ? KEY_DOWN : KEY_UP;
|
||||
key.keyCode = keyCode;
|
||||
NativeKey(key);
|
||||
KeyInput key;
|
||||
key.deviceId = DEVICE_ID_PAD_0;
|
||||
key.flags = pressed ? KEY_DOWN : KEY_UP;
|
||||
key.keyCode = keyCode;
|
||||
NativeKey(key);
|
||||
}
|
||||
|
||||
- (void)setupController:(GCController *)controller
|
||||
{
|
||||
self.gameController = controller;
|
||||
|
||||
GCGamepad *baseProfile = self.gameController.gamepad;
|
||||
if (baseProfile == nil) {
|
||||
self.gameController = nil;
|
||||
return;
|
||||
}
|
||||
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; // prevent auto-lock
|
||||
|
||||
self.gameController.controllerPausedHandler = ^(GCController *controller) {
|
||||
KeyInput key;
|
||||
key.flags = KEY_DOWN;
|
||||
key.keyCode = NKCODE_ESCAPE;
|
||||
key.deviceId = DEVICE_ID_KEYBOARD;
|
||||
NativeKey(key);
|
||||
};
|
||||
|
||||
baseProfile.buttonA.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_2]; // Cross
|
||||
};
|
||||
|
||||
baseProfile.buttonB.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_3]; // Circle
|
||||
};
|
||||
|
||||
baseProfile.buttonX.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_4]; // Square
|
||||
};
|
||||
|
||||
baseProfile.buttonY.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_1]; // Triangle
|
||||
};
|
||||
|
||||
baseProfile.leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_7]; // LTrigger
|
||||
};
|
||||
|
||||
baseProfile.rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_8]; // RTrigger
|
||||
};
|
||||
|
||||
baseProfile.dpad.up.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_UP];
|
||||
};
|
||||
|
||||
baseProfile.dpad.down.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_DOWN];
|
||||
};
|
||||
|
||||
baseProfile.dpad.left.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_LEFT];
|
||||
};
|
||||
|
||||
baseProfile.dpad.right.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_RIGHT];
|
||||
};
|
||||
|
||||
GCExtendedGamepad *extendedProfile = self.gameController.extendedGamepad;
|
||||
if (extendedProfile == nil)
|
||||
return; // controller doesn't support extendedGamepad profile
|
||||
|
||||
extendedProfile.leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_9]; // Select
|
||||
};
|
||||
|
||||
extendedProfile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_10]; // Start
|
||||
};
|
||||
|
||||
extendedProfile.leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_X;
|
||||
axisInput.value = value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
extendedProfile.leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_Y;
|
||||
axisInput.value = -value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
// Map right thumbstick as another analog stick, particularly useful for controllers like the DualShock 3/4 when connected to an iOS device
|
||||
extendedProfile.rightThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_Z;
|
||||
axisInput.value = value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
extendedProfile.rightThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_RZ;
|
||||
axisInput.value = -value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
self.gameController = controller;
|
||||
|
||||
GCGamepad *baseProfile = self.gameController.gamepad;
|
||||
if (baseProfile == nil) {
|
||||
self.gameController = nil;
|
||||
return;
|
||||
}
|
||||
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; // prevent auto-lock
|
||||
|
||||
self.gameController.controllerPausedHandler = ^(GCController *controller) {
|
||||
KeyInput key;
|
||||
key.flags = KEY_DOWN;
|
||||
key.keyCode = NKCODE_ESCAPE;
|
||||
key.deviceId = DEVICE_ID_KEYBOARD;
|
||||
NativeKey(key);
|
||||
};
|
||||
|
||||
baseProfile.buttonA.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_2]; // Cross
|
||||
};
|
||||
|
||||
baseProfile.buttonB.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_3]; // Circle
|
||||
};
|
||||
|
||||
baseProfile.buttonX.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_4]; // Square
|
||||
};
|
||||
|
||||
baseProfile.buttonY.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_1]; // Triangle
|
||||
};
|
||||
|
||||
baseProfile.leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_7]; // LTrigger
|
||||
};
|
||||
|
||||
baseProfile.rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_8]; // RTrigger
|
||||
};
|
||||
|
||||
baseProfile.dpad.up.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_UP];
|
||||
};
|
||||
|
||||
baseProfile.dpad.down.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_DOWN];
|
||||
};
|
||||
|
||||
baseProfile.dpad.left.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_LEFT];
|
||||
};
|
||||
|
||||
baseProfile.dpad.right.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_DPAD_RIGHT];
|
||||
};
|
||||
|
||||
GCExtendedGamepad *extendedProfile = self.gameController.extendedGamepad;
|
||||
if (extendedProfile == nil)
|
||||
return; // controller doesn't support extendedGamepad profile
|
||||
|
||||
extendedProfile.leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_9]; // Select
|
||||
};
|
||||
|
||||
extendedProfile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
|
||||
[self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_10]; // Start
|
||||
};
|
||||
|
||||
extendedProfile.leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_X;
|
||||
axisInput.value = value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
extendedProfile.leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_Y;
|
||||
axisInput.value = -value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
// Map right thumbstick as another analog stick, particularly useful for controllers like the DualShock 3/4 when connected to an iOS device
|
||||
extendedProfile.rightThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_Z;
|
||||
axisInput.value = value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
|
||||
extendedProfile.rightThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) {
|
||||
AxisInput axisInput;
|
||||
axisInput.deviceId = DEVICE_ID_PAD_0;
|
||||
axisInput.flags = 0;
|
||||
axisInput.axisId = JOYSTICK_AXIS_RZ;
|
||||
axisInput.value = -value;
|
||||
NativeAxis(axisInput);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in new issue
Block a user