diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj
index 6f0ab6e6e2..d93b8d8667 100644
--- a/Common/Common.vcxproj
+++ b/Common/Common.vcxproj
@@ -72,7 +72,7 @@
USING_WIN_UI;_CRT_SECURE_NO_WARNINGS;WIN32;_ARCH_32=1;_M_IX86=1;_DEBUG;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions)
stdafx.h
MultiThreadedDebug
- ../ext/native
+ ../ext/native;..
StreamingSIMDExtensions2
Fast
true
@@ -99,7 +99,7 @@
stdafx.h
MultiThreadedDebug
USING_WIN_UI;_CRT_SECURE_NO_WARNINGS;WIN32;_ARCH_64=1;_M_X64=1;_DEBUG;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions)
- ../ext/native
+ ../ext/native;..
NotSet
Fast
false
@@ -132,7 +132,7 @@
false
StreamingSIMDExtensions2
Fast
- ../ext/native
+ ../ext/native;..
Speed
true
false
@@ -161,7 +161,7 @@
true
USING_WIN_UI;_CRT_SECURE_NO_WARNINGS;WIN32;_ARCH_64=1;_M_X64=1;NDEBUG;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions)
stdafx.h
- ../ext/native
+ ../ext/native;..
false
NotSet
Fast
@@ -209,6 +209,19 @@
+
+
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+
@@ -258,6 +271,24 @@
+
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+
diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters
index 2bce532528..5b2bb42345 100644
--- a/Common/Common.vcxproj.filters
+++ b/Common/Common.vcxproj.filters
@@ -48,6 +48,15 @@
+
+ GL\GLInterface
+
+
+ GL\GLInterface
+
+
+ GL
+
@@ -84,6 +93,15 @@
+
+ GL\GLInterface
+
+
+ GL\GLInterface
+
+
+ GL\GLInterface
+
@@ -92,5 +110,11 @@
{1b593f03-7b28-4707-9228-4981796f5589}
+
+ {2f2ca112-9e26-499e-9cb9-38a78b4ac09d}
+
+
+ {2c723cf4-75b6-406a-90c0-ebb7a13ba476}
+
\ No newline at end of file
diff --git a/Common/GL/GLInterface/EGL.cpp b/Common/GL/GLInterface/EGL.cpp
index 917e2392c0..4bd159969e 100644
--- a/Common/GL/GLInterface/EGL.cpp
+++ b/Common/GL/GLInterface/EGL.cpp
@@ -116,6 +116,7 @@ bool cInterfaceEGL::Create(void *window_handle, bool core)
INFO_LOG(G3D, "Error: eglInitialize() failed\n");
return false;
}
+ INFO_LOG(G3D, "eglInitialize() succeeded\n");
/* Detection code */
EGLConfig config;
@@ -124,7 +125,7 @@ bool cInterfaceEGL::Create(void *window_handle, bool core)
DetectMode();
// attributes for a visual in RGBA format with at least
- // 8 bits per color
+ // 8 bits per color, 16 bits of depth and 8 bits of stencil.
int attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
@@ -139,8 +140,8 @@ bool cInterfaceEGL::Create(void *window_handle, bool core)
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
- switch (s_opengl_mode)
- {
+
+ switch (s_opengl_mode) {
case MODE_OPENGL:
attribs[1] = EGL_OPENGL_BIT;
ctx_attribs[0] = EGL_NONE;
@@ -159,11 +160,13 @@ bool cInterfaceEGL::Create(void *window_handle, bool core)
break;
}
- if (!eglChooseConfig( egl_dpy, attribs, &config, 1, &num_configs)) {
+ if (!eglChooseConfig(egl_dpy, attribs, &config, 1, &num_configs)) {
INFO_LOG(G3D, "Error: couldn't get an EGL visual config\n");
exit(1);
}
+ INFO_LOG(G3D, "eglChooseConfig successful");
+
if (s_opengl_mode == MODE_OPENGL)
eglBindAPI(EGL_OPENGL_API);
else
diff --git a/Common/GL/GLInterface/EGLAndroid.cpp b/Common/GL/GLInterface/EGLAndroid.cpp
index f357982105..29796fae29 100644
--- a/Common/GL/GLInterface/EGLAndroid.cpp
+++ b/Common/GL/GLInterface/EGLAndroid.cpp
@@ -25,4 +25,3 @@ EGLNativeWindowType cInterfaceEGLAndroid::InitializePlatform(EGLNativeWindowType
void cInterfaceEGLAndroid::ShutdownPlatform()
{
}
-
diff --git a/Common/GL/GLInterface/EGLAndroid.h b/Common/GL/GLInterface/EGLAndroid.h
index 614b1a412d..811485d91b 100644
--- a/Common/GL/GLInterface/EGLAndroid.h
+++ b/Common/GL/GLInterface/EGLAndroid.h
@@ -13,7 +13,7 @@ protected:
EGLDisplay OpenDisplay() override;
EGLNativeWindowType InitializePlatform(EGLNativeWindowType host_window, EGLConfig config) override;
void ShutdownPlatform() override;
- void SetInternalResolution(int internalWidth, int internalHeight) override {
+ void OverrideBackbufferDimensions(int internalWidth, int internalHeight) override {
internalWidth_ = internalWidth;
internalHeight_ = internalHeight;
}
diff --git a/Common/GL/GLInterface/GLInterface.cpp b/Common/GL/GLInterface/GLInterface.cpp
index 8abe67dc71..bf8d729745 100644
--- a/Common/GL/GLInterface/GLInterface.cpp
+++ b/Common/GL/GLInterface/GLInterface.cpp
@@ -20,8 +20,7 @@
#error Platform doesnt have a GLInterface
#endif
-cInterfaceBase* HostGL_CreateGLInterface()
-{
+cInterfaceBase* HostGL_CreateGLInterface(){
#ifdef ANDROID
return new cInterfaceEGLAndroid;
#elif defined(__APPLE__)
diff --git a/Common/GL/GLInterfaceBase.h b/Common/GL/GLInterfaceBase.h
index 168f1398e6..9e8de11303 100644
--- a/Common/GL/GLInterfaceBase.h
+++ b/Common/GL/GLInterfaceBase.h
@@ -15,8 +15,7 @@ enum GLInterfaceMode {
MODE_OPENGLES3,
};
-class cInterfaceBase
-{
+class cInterfaceBase {
protected:
// Window dimensions.
u32 s_backbuffer_width;
@@ -38,6 +37,9 @@ public:
virtual void SwapInterval(int Interval) { }
virtual u32 GetBackBufferWidth() { return s_backbuffer_width; }
virtual u32 GetBackBufferHeight() { return s_backbuffer_height; }
+
+ virtual void OverrideBackbufferDimensions(int w, int h) = 0;
+
virtual void SetBackBufferDimensions(u32 W, u32 H) {s_backbuffer_width = W; s_backbuffer_height = H; }
virtual void Update() { }
virtual bool PeekMessages() { return false; }
diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp
index 8c51c2cfcd..164bdcffe6 100644
--- a/android/jni/app-android.cpp
+++ b/android/jni/app-android.cpp
@@ -11,7 +11,6 @@
#include
#include
#include
-#include
#include
#include "base/basictypes.h"
@@ -65,14 +64,29 @@ static int androidVersion;
static int deviceType;
// Should only be used for display detection during startup (for config defaults etc)
+// This is the ACTUAL display size, not the hardware scaled display size.
+static int display_dpi;
static int display_xres;
static int display_yres;
+static int desiredBackbufferSizeX;
+static int desiredBackbufferSizeY;
+
static jmethodID postCommand;
static jobject nativeActivity;
static volatile bool exitRenderLoop;
bool renderLoopRunning;
+float dp_xscale = 1.0f;
+float dp_yscale = 1.0f;
+
+InputState input_state;
+
+static bool renderer_inited = false;
+static bool first_lost = true;
+static std::string library_path;
+
+
// Android implementation of callbacks to the Java part of the app
void SystemToast(const char *text) {
lock_guard guard(frameCommandLock);
@@ -149,18 +163,6 @@ int System_GetPropertyInt(SystemProperty prop) {
}
}
-// Remember that all of these need initialization on init! The process
-// may be reused when restarting the game. Globals are DANGEROUS.
-
-float dp_xscale = 1.0f;
-float dp_yscale = 1.0f;
-
-InputState input_state;
-
-static bool renderer_inited = false;
-static bool first_lost = true;
-static std::string library_path;
-
std::string GetJavaString(JNIEnv *env, jstring jstr) {
const char *str = env->GetStringUTFChars(jstr, 0);
std::string cpp_string = std::string(str);
@@ -208,7 +210,7 @@ extern "C" jstring Java_org_ppsspp_ppsspp_NativeApp_queryConfig
}
extern "C" void Java_org_ppsspp_ppsspp_NativeApp_init
- (JNIEnv *env, jclass, jstring jmodel, jint jdeviceType, jint jxres, jint jyres, jstring jlangRegion, jstring japkpath,
+ (JNIEnv *env, jclass, jstring jmodel, jint jdeviceType, jstring jlangRegion, jstring japkpath,
jstring jdataDir, jstring jexternalDir, jstring jlibraryDir, jstring jshortcutParam,
jstring jinstallID, jint jAndroidVersion) {
jniEnvUI = env;
@@ -232,8 +234,6 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_init
right_joystick_y_async = 0;
hat_joystick_x_async = 0;
hat_joystick_y_async = 0;
- display_xres = jxres;
- display_yres = jyres;
std::string apkPath = GetJavaString(env, japkpath);
VFSRegister("", new ZipAssetReader(apkPath.c_str(), "assets/"));
@@ -319,23 +319,6 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_shutdown(JNIEnv *, jclass) {
ILOG("NativeApp.shutdown() -- end");
}
-extern "C" void Java_org_ppsspp_ppsspp_NativeApp_displayResize(JNIEnv *, jclass, jint w, jint h, jint dpi, jfloat refreshRate) {
- ILOG("NativeApp.displayResize(%i x %i, dpi=%i, refresh=%0.2f)", w, h, dpi, refreshRate);
-
- g_dpi = dpi;
- g_dpi_scale = 240.0f / (float)g_dpi;
-
- pixel_xres = w;
- pixel_yres = h;
- dp_xres = pixel_xres * g_dpi_scale;
- dp_yres = pixel_yres * g_dpi_scale;
- dp_xscale = (float)dp_xres / pixel_xres;
- dp_yscale = (float)dp_yres / pixel_yres;
- display_hz = refreshRate;
-
- NativeResized();
-}
-
extern "C" void Java_org_ppsspp_ppsspp_NativeRenderer_displayShutdown(JNIEnv *env, jobject obj) {
if (renderer_inited) {
renderer_inited = false;
@@ -493,21 +476,116 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeActivity_exitEGLRenderLoop(
}
}
+void correctRatio(int &sz_x, int &sz_y, float scale) {
+ float x = (float)sz_x;
+ float y = (float)sz_y;
+ float ratio = x / y;
+ ILOG("CorrectRatio: Considering size: %0.2f/%0.2f=%0.2f for scale %f", x, y, ratio, scale);
+ float targetRatio;
+
+ // Try to get the longest dimension to match scale*PSP resolution.
+ if (x >= y) {
+ targetRatio = 480.0f / 272.0f;
+ x = 480.f * scale;
+ y = 272.f * scale;
+ } else {
+ targetRatio = 272.0f / 480.0f;
+ x = 272.0f * scale;
+ y = 480.0f * scale;
+ }
+
+ float correction = targetRatio / ratio;
+ ILOG("Target ratio: %0.2f ratio: %0.2f correction: %0.2f", targetRatio, ratio, correction);
+ if (ratio < targetRatio) {
+ y *= correction;
+ } else {
+ x /= correction;
+ }
+
+ sz_x = x;
+ sz_y = y;
+ ILOG("Corrected ratio: %dx%d", sz_x, sz_y);
+}
+
+void getDesiredBackbufferSize(int &sz_x, int &sz_y) {
+ sz_x = display_xres;
+ sz_y = display_yres;
+ std::string config = NativeQueryConfig("hwScale");
+ int scale;
+ if (1 == sscanf(config.c_str(), "%d", &scale) && scale > 0) {
+ correctRatio(sz_x, sz_y, scale);
+ } else {
+ sz_x = 0;
+ sz_y = 0;
+ }
+}
+
+extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_setDisplayParameters(JNIEnv *, jclass, jint xres, jint yres, jint dpi, jfloat refreshRate) {
+ ILOG("NativeApp.setDisplayParameters(%d x %d, dpi=%d, refresh=%0.2f)", xres, yres, dpi, refreshRate);
+ display_xres = xres;
+ display_yres = yres;
+ display_dpi = dpi;
+ display_hz = refreshRate;
+}
+
+extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_backbufferResize(JNIEnv *, jclass, jint bufw, jint bufh) {
+ ILOG("NativeApp.backbufferResize(%d x %d)", bufw, bufh);
+
+ // pixel_*res is the backbuffer resolution.
+ pixel_xres = bufw;
+ pixel_yres = bufh;
+
+ g_dpi = (int)display_dpi;
+ g_dpi_scale = 240.0f / (float)g_dpi;
+
+ dp_xres = display_xres * g_dpi_scale;
+ dp_yres = display_yres * g_dpi_scale;
+
+ // Touch scaling is from display pixels to dp pixels.
+ dp_xscale = (float)dp_xres / (float)display_xres;
+ dp_yscale = (float)dp_yres / (float)display_yres;
+
+ pixel_in_dps = (float)pixel_xres / dp_xres;
+
+ ILOG("dp_xscale=%f dp_yscale=%f", dp_xscale, dp_yscale);
+ ILOG("dp_xres=%d dp_yres=%d", dp_xres, dp_yres);
+ ILOG("pixel_xres=%d pixel_yres=%d", pixel_xres, pixel_yres);
+ ILOG("g_dpi=%d g_dpi_scale=%f", g_dpi, g_dpi_scale);
+
+ NativeResized();
+}
+
+extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_computeDesiredBackbufferDimensions() {
+ getDesiredBackbufferSize(desiredBackbufferSizeX, desiredBackbufferSizeY);
+}
+
+extern "C" jint JNICALL Java_org_ppsspp_ppsspp_NativeApp_getDesiredBackbufferWidth(JNIEnv *, jclass) {
+ return desiredBackbufferSizeX;
+}
+
+extern "C" jint JNICALL Java_org_ppsspp_ppsspp_NativeApp_getDesiredBackbufferHeight(JNIEnv *, jclass) {
+ return desiredBackbufferSizeY;
+}
+
extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeActivity_runEGLRenderLoop(JNIEnv *env, jobject obj, jobject _surf) {
ANativeWindow *wnd = ANativeWindow_fromSurface(env, _surf);
- WLOG("runEGLRenderLoop");
+ WLOG("runEGLRenderLoop. display_xres=%d display_yres=%d", display_xres, display_yres);
if (wnd == nullptr) {
ELOG("Error: Surface is null.");
return;
}
-
+
cInterfaceBase *gl = HostGL_CreateGLInterface();
if (!gl) {
ELOG("ERROR: Failed to create GL interface");
return;
}
+ ILOG("EGL interface created. Desired backbuffer size: %dx%d", desiredBackbufferSizeX, desiredBackbufferSizeY);
+
+ // Apparently we still have to set this through Java through setFixedSize on the bufferHolder for it to take effect...
+ gl->SetBackBufferDimensions(desiredBackbufferSizeX, desiredBackbufferSizeY);
gl->SetMode(MODE_DETECT);
gl->Create(wnd);
gl->MakeCurrent();
@@ -566,11 +644,14 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeActivity_runEGLRenderLoop(J
}
}
+ // Restore lost device objects. TODO: This feels like the wrong place for this.
NativeDeviceLost();
ILOG("NativeDeviceLost completed.");
+
NativeShutdownGraphics();
renderer_inited = false;
+ gl->ClearCurrent();
delete gl;
ANativeWindow_release(wnd);
diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java
index 41f6b8509c..c465b3417b 100644
--- a/android/src/org/ppsspp/ppsspp/NativeActivity.java
+++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java
@@ -8,7 +8,6 @@ import java.util.Locale;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
-import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.UiModeManager;
import android.content.Context;
@@ -16,11 +15,9 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ConfigurationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
-import android.graphics.PixelFormat;
import android.graphics.Point;
import android.media.AudioManager;
import android.net.Uri;
@@ -29,6 +26,7 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.Vibrator;
import android.text.InputType;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
@@ -215,10 +213,8 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
String model = Build.MANUFACTURER + ":" + Build.MODEL;
String languageRegion = Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry();
- Point displaySize = new Point();
- GetScreenSize(displaySize);
NativeApp.audioConfig(optimalFramesPerBuffer, optimalSampleRate);
- NativeApp.init(model, deviceType, displaySize.x, displaySize.y, languageRegion, apkFilePath, dataDir, externalStorageDir, libraryDir, shortcutParam, installID, Build.VERSION.SDK_INT);
+ NativeApp.init(model, deviceType, languageRegion, apkFilePath, dataDir, externalStorageDir, libraryDir, shortcutParam, installID, Build.VERSION.SDK_INT);
NativeApp.sendMessage("cacheDir", getCacheDir().getAbsolutePath());
@@ -291,12 +287,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
}
}
- // Override this to scale the backbuffer (use the Android hardware scaler)
- public void getDesiredBackbufferSize(Point sz) {
- sz.x = 0;
- sz.y = 0;
- }
-
private Runnable mEmulationRunner = new Runnable()
{
@Override
@@ -331,6 +321,15 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
registerCallbacks();
installID = Installation.id(this);
+ DisplayMetrics metrics = new DisplayMetrics();
+ Display display = getWindowManager().getDefaultDisplay();
+ display.getMetrics(metrics);
+
+ float refreshRate = display.getRefreshRate();
+ Point outSize = new Point();
+ GetScreenSize(outSize);
+ NativeApp.setDisplayParameters(outSize.x, outSize.y, metrics.densityDpi, refreshRate);
+
if (!initialized) {
Initialize();
initialized = true;
@@ -349,19 +348,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
gainAudioFocus(this.audioManager, this.audioFocusChangeListener);
NativeApp.audioInit();
- mSurfaceView = new NativeSurfaceView(this);
- mSurfaceView.getHolder().addCallback(this);
-
- Point sz = new Point();
- getDesiredBackbufferSize(sz);
- if (sz.x > 0) {
- Log.i(TAG, "Requesting fixed size buffer: " + sz.x + "x" + sz.y);
- // Auto-calculates new DPI and forwards to the correct call on mGLSurfaceView.getHolder()
- mSurfaceView.setFixedSize(sz.x, sz.y);
- }
-
- setContentView(mSurfaceView);
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
updateSystemUiVisibility();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
@@ -369,6 +355,16 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
}
}
+ NativeApp.computeDesiredBackbufferDimensions();
+ int bbW = NativeApp.getDesiredBackbufferWidth();
+ int bbH = NativeApp.getDesiredBackbufferHeight();
+
+ mSurfaceView = new NativeSurfaceView(this, bbW, bbH);
+ mSurfaceView.getHolder().addCallback(this);
+ Log.i(TAG, "setcontentview before");
+ setContentView(mSurfaceView);
+ Log.i(TAG, "setcontentview after");
+
mRenderLoopThread = new Thread(mEmulationRunner);
mRenderLoopThread.start();
}
@@ -383,6 +379,7 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
Log.w(TAG, "Surface changed. Resolution: " + width + "x" + height);
+ NativeApp.backbufferResize(width, height);
mSurface = holder.getSurface();
if (mRenderLoopThread == null || !mRenderLoopThread.isAlive()) {
mRenderLoopThread = new Thread(mEmulationRunner);
@@ -440,18 +437,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
unregisterCallbacks();
}
- private boolean detectOpenGLES20() {
- ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- ConfigurationInfo info = am.getDeviceConfigurationInfo();
- return info.reqGlEsVersion >= 0x20000;
- }
-
- private boolean detectOpenGLES30() {
- ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- ConfigurationInfo info = am.getDeviceConfigurationInfo();
- return info.reqGlEsVersion >= 0x30000;
- }
-
@Override
protected void onPause() {
super.onPause();
@@ -489,12 +474,6 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
updateSystemUiVisibility();
}
-
- Point sz = new Point();
- getDesiredBackbufferSize(sz);
- if (sz.x > 0) {
- mSurfaceView.getHolder().setFixedSize(sz.x/2, sz.y/2);
- }
}
//keep this static so we can call this even if we don't
diff --git a/android/src/org/ppsspp/ppsspp/NativeApp.java b/android/src/org/ppsspp/ppsspp/NativeApp.java
index 0b59fb2d71..84b2003d5d 100644
--- a/android/src/org/ppsspp/ppsspp/NativeApp.java
+++ b/android/src/org/ppsspp/ppsspp/NativeApp.java
@@ -13,13 +13,19 @@ public class NativeApp {
public final static int DEVICE_TYPE_TV = 1;
public final static int DEVICE_TYPE_DESKTOP = 2;
- public static native void init(String model, int deviceType, int xres, int yres, String languageRegion, String apkPath, String dataDir, String externalDir, String libraryDir, String shortcutParam, String installID, int androidVersion);
+ public static native void init(String model, int deviceType, String languageRegion, String apkPath, String dataDir, String externalDir, String libraryDir, String shortcutParam, String installID, int androidVersion);
public static native void audioInit();
public static native void audioShutdown();
public static native void audioConfig(int optimalFramesPerBuffer, int optimalSampleRate);
- public static native void displayResize(int width, int height, int scaled_dpi, float refreshRate);
+ public static native void computeDesiredBackbufferDimensions();
+ public static native int getDesiredBackbufferWidth();
+ public static native int getDesiredBackbufferHeight();
+
+ public static native void setDisplayParameters(int display_xres, int display_yres, int dpi, float refreshRate);
+ public static native void backbufferResize(int bufferWidth, int bufferHeight);
+
public static native boolean isLandscape();
public static native boolean isAtTopLevel();
diff --git a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java
index 8822e86bdb..81d8a22adc 100644
--- a/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java
+++ b/android/src/org/ppsspp/ppsspp/NativeSurfaceView.java
@@ -1,66 +1,48 @@
package org.ppsspp.ppsspp;
-// Touch- and sensor-enabled GLSurfaceView.
+// Touch- and sensor-enabled SurfaceView.
// Supports simple multitouch and pressure.
+// DPI scaling is handled by the native code.
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
-import android.graphics.Point;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
-import android.opengl.GLSurfaceView;
import android.os.Build;
import android.os.Handler;
-import android.util.DisplayMetrics;
-// import android.os.Build;
-// import android.util.Log;
import android.util.Log;
-import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceView;
import com.bda.controller.*;
public class NativeSurfaceView extends SurfaceView implements SensorEventListener, ControllerListener {
- private static String TAG = "NativeGLView";
+ private static String TAG = "NativeSurfaceView";
private SensorManager mSensorManager;
private Sensor mAccelerometer;
- private NativeActivity mActivity;
// Moga controller
private Controller mController = null;
private boolean isMogaPro = false;
- private int dpi;
- private float refreshRate;
- private double dpi_scale_x;
- private double dpi_scale_y;
-
- int last_width, last_height;
-
- public int fixedW = 0;
- public int fixedH = 0;
-
- public NativeSurfaceView(NativeActivity activity) {
+ public NativeSurfaceView(NativeActivity activity, int fixedW, int fixedH) {
super(activity);
- DisplayMetrics metrics = new DisplayMetrics();
- Display display = activity.getWindowManager().getDefaultDisplay();
- display.getMetrics(metrics);
- dpi = metrics.densityDpi;
-
- refreshRate = display.getRefreshRate();
-
- mActivity = activity;
+ Log.i(TAG, "NativeSurfaceView");
mSensorManager = (SensorManager)activity.getSystemService(Activity.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mController = Controller.getInstance(activity);
- onResize(display.getWidth(), display.getHeight());
+ // Maybe we need to use this?
+ if (fixedW != 0 && fixedH != 0) {
+ Log.i(TAG, "Setting surface holder to use a fixed size of " + fixedW + "x" + fixedH + " pixels");
+ this.getHolder().setFixedSize(fixedW, fixedH);
+ }
try {
MogaHack.init(mController, activity);
@@ -71,37 +53,17 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene
}
}
- void onResize(int width, int height) {
- Point sz = new Point();
- mActivity.GetScreenSize(sz);
- double actualW = sz.x;
- double actualH = sz.y;
- dpi_scale_x = (width / actualW);
- dpi_scale_y = (height / actualH);
- Log.i(TAG, "onSurfaceChanged: " + dpi_scale_x + "x" + dpi_scale_y + " (width=" + width + ", actualW=" + actualW);
- int scaled_dpi = (int)(dpi * dpi_scale_x);
- NativeApp.displayResize(width, height, scaled_dpi, refreshRate);
- last_width = width;
- last_height = height;
- }
-
- void setFixedSize(int w, int h) {
- fixedW = w;
- fixedH = h;
- }
-
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private int getToolType(final MotionEvent ev, int pointer) {
return ev.getToolType(pointer);
}
+ @SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(final MotionEvent ev) {
boolean canReadToolType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
int numTouchesHandled = 0;
- float scaleX = (float)this.dpi_scale_x;
- float scaleY = (float)this.dpi_scale_y;
for (int i = 0; i < ev.getPointerCount(); i++) {
int pid = ev.getPointerId(i);
int code = 0;
@@ -133,7 +95,7 @@ public class NativeSurfaceView extends SurfaceView implements SensorEventListene
code |= tool << 10; // We use the Android tool type codes
}
// Can't use || due to short circuit evaluation
- numTouchesHandled += NativeApp.touch(scaleX * ev.getX(i), scaleY * ev.getY(i), code, pid) ? 1 : 0;
+ numTouchesHandled += NativeApp.touch(ev.getX(i), ev.getY(i), code, pid) ? 1 : 0;
}
}
return numTouchesHandled > 0;
diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java
index 18e1f4179e..bb61d9007d 100644
--- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java
+++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java
@@ -1,7 +1,6 @@
package org.ppsspp.ppsspp;
import android.app.AlertDialog;
-import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
@@ -15,7 +14,8 @@ public class PpssppActivity extends NativeActivity {
private static boolean m_hasUnsupportedABI = false;
private static boolean m_hasNoNativeBinary = false;
- static {
+ @SuppressWarnings("deprecation")
+ static void CheckABIAndLoadLibrary() {
if (Build.CPU_ABI.equals("armeabi")) {
m_hasUnsupportedABI = true;
} else {
@@ -28,6 +28,10 @@ public class PpssppActivity extends NativeActivity {
}
}
+ static {
+ CheckABIAndLoadLibrary();
+ }
+
public PpssppActivity() {
super();
}
@@ -36,6 +40,7 @@ public class PpssppActivity extends NativeActivity {
public void onCreate(Bundle savedInstanceState) {
if (m_hasUnsupportedABI || m_hasNoNativeBinary) {
new Thread() {
+ @SuppressWarnings("deprecation")
@Override
public void run() {
Looper.prepare();
@@ -68,55 +73,6 @@ public class PpssppActivity extends NativeActivity {
super.onCreate(savedInstanceState);
}
-
- private void correctRatio(Point sz, float scale) {
- float x = sz.x;
- float y = sz.y;
- float ratio = x / y;
- // Log.i(TAG, "Considering size: " + sz.x + "x" + sz.y + "=" + ratio);
- float targetRatio;
- if (x >= y) {
- targetRatio = 480.0f / 272.0f;
- x = 480.f * scale;
- y = 272.f * scale;
- } else {
- targetRatio = 272.0f / 480.0f;
- x = 272.0f * scale;
- y = 480.0f * scale;
- }
- float correction = targetRatio / ratio;
- // Log.i(TAG, "Target ratio: " + targetRatio + " ratio: " + ratio + " correction: " + correction);
- if (ratio < targetRatio) {
- y *= correction;
- } else {
- x /= correction;
- }
- sz.x = (int)x;
- sz.y = (int)y;
- // Log.i(TAG, "Corrected ratio: " + sz.x + "x" + sz.y);
- }
-
- @Override
- public void getDesiredBackbufferSize(Point sz) {
- GetScreenSize(sz);
- String config = NativeApp.queryConfig("hwScale");
- int scale;
- try {
- scale = Integer.parseInt(config);
- if (scale == 0) {
- sz.x = 0;
- sz.y = 0;
- return;
- }
- }
- catch (NumberFormatException e) {
- sz.x = 0;
- sz.y = 0;
- return;
- }
- correctRatio(sz, scale);
- }
-
// called by the C++ code through JNI. Dispatch anything we can't directly handle
// on the gfx thread to the UI thread.
public void postCommand(String command, String parameter) {
diff --git a/ext/native/ui/ui_context.cpp b/ext/native/ui/ui_context.cpp
index 56039e1809..d5b3bc3972 100644
--- a/ext/native/ui/ui_context.cpp
+++ b/ext/native/ui/ui_context.cpp
@@ -97,7 +97,7 @@ Bounds UIContext::GetScissorBounds() {
void UIContext::ActivateTopScissor() {
if (scissorStack_.size()) {
const Bounds &bounds = scissorStack_.back();
- float scale = 1.0f / g_dpi_scale;
+ float scale = pixel_in_dps;
int x = scale * bounds.x;
int y = scale * bounds.y;
int w = scale * bounds.w;