diff --git a/core/nullDC.cpp b/core/nullDC.cpp
index c2bdcdc8c..e4beb21cb 100755
--- a/core/nullDC.cpp
+++ b/core/nullDC.cpp
@@ -229,6 +229,13 @@ void dc_term()
TermAudio();
}
+#if defined(_ANDROID)
+void dc_pause()
+{
+ SaveRomFiles(get_writable_data_path("/data/"));
+}
+#endif
+
void dc_stop()
{
sh4_cpu.Stop();
diff --git a/shell/android-studio/reicast/src/main/AndroidManifest.xml b/shell/android-studio/reicast/src/main/AndroidManifest.xml
index 9f99de1e3..82f017e6d 100644
--- a/shell/android-studio/reicast/src/main/AndroidManifest.xml
+++ b/shell/android-studio/reicast/src/main/AndroidManifest.xml
@@ -123,11 +123,6 @@
android:screenOrientation="sensorLandscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
-
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/FileBrowser.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/FileBrowser.java
index 5b8c375ab..a72ad3ac2 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/FileBrowser.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/FileBrowser.java
@@ -172,13 +172,12 @@ public class FileBrowser extends Fragment {
* findViewById(R.id.about).setOnTouchListener(viblist);
*/
- File home = new File(mPrefs.getString(Config.pref_home, home_directory));
- if (!home.exists() || !home.isDirectory()) {
+ String temp = mPrefs.getString(Config.pref_home, null);
+ if (temp == null || !new File(temp).isDirectory()) {
showToastMessage(getActivity().getString(R.string.config_home), Snackbar.LENGTH_LONG);
} else {
installButtons();
}
-
if (!ImgBrowse && !games) {
new LocateGames(R.array.flash).execute(home_directory);
} else {
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java
index 71fd12eba..4a083e9d7 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java
@@ -3,7 +3,6 @@ package com.reicast.emulator;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.net.Uri;
@@ -22,7 +21,6 @@ import android.view.WindowManager;
import android.widget.PopupWindow;
import com.reicast.emulator.config.Config;
-import com.reicast.emulator.emu.EmuService;
import com.reicast.emulator.emu.GL2JNIView;
import com.reicast.emulator.emu.JNIdc;
import com.reicast.emulator.emu.OnScreenMenu;
@@ -39,7 +37,6 @@ import java.util.HashMap;
import tv.ouya.console.api.OuyaController;
public class GL2JNIActivity extends Activity {
- private Intent serviceIntent;
public GL2JNIView mView;
OnScreenMenu menu;
public MainPopup popUp;
@@ -61,10 +58,6 @@ public class GL2JNIActivity extends Activity {
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
- //serviceIntent = new Intent(this, EmuService.class);
- //serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_FROM_BACKGROUND);
- //serviceIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES | Intent.FLAG_ACTIVITY_NO_ANIMATION);
- //startService(serviceIntent);
Emulator app = (Emulator)getApplicationContext();
app.getConfigurationPrefs(prefs);
@@ -566,26 +559,18 @@ public class GL2JNIActivity extends Activity {
protected void onPause() {
super.onPause();
mView.onPause();
+ JNIdc.pause();
moga.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
- //if (serviceRunning(EmuService.class))
- // stopService(serviceIntent);
mView.onDestroy();
- JNIdc.terminate();
+ JNIdc.destroy();
moga.onDestroy();
}
- @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
-// mView.onStop();
- }
-
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java
index 7bb2c80f1..495bb9ce6 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java
@@ -75,6 +75,13 @@ public class GL2JNINative extends NativeActivity {
app.getConfigurationPrefs(prefs);
menu = new OnScreenMenu(GL2JNINative.this, prefs);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ pad.compat[0] = true;
+ pad.compat[1] = true;
+ pad.compat[2] = true;
+ pad.compat[3] = true;
+ }
+
String fileName = null;
// Call parent onCreate()
@@ -567,6 +574,7 @@ public class GL2JNINative extends NativeActivity {
protected void onPause() {
super.onPause();
mView.onPause();
+ JNIdc.pause();
moga.onPause();
}
@@ -574,14 +582,13 @@ public class GL2JNINative extends NativeActivity {
protected void onDestroy() {
super.onDestroy();
mView.onDestroy();
- JNIdc.terminate();
+ JNIdc.destroy();
moga.onDestroy();
}
@Override
protected void onStop() {
super.onStop();
-// mView.onStop();
}
@Override
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java
index 7826c8691..ec60745b1 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java
@@ -259,9 +259,9 @@ public class MainActivity extends AppCompatActivity implements
builder.setPositiveButton(R.string.browse,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- onMainBrowseSelected(false,
- Environment.getExternalStorageDirectory().getAbsolutePath(),
- false, null);
+ String home_directory = mPrefs.getString(Config.pref_home,
+ Environment.getExternalStorageDirectory().getAbsolutePath());
+ onMainBrowseSelected(false, home_directory, false, null);
}
});
builder.setNegativeButton(R.string.gdrive,
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/Config.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/Config.java
index d28dd35b2..831d92fc5 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/Config.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/Config.java
@@ -15,7 +15,6 @@ public class Config {
public static final String pref_showfps = "show_fps";
public static final String pref_rendertype = "render_type";
public static final String pref_renderdepth = "depth_render";
- public static final String pref_egl14 = "use_egl14";
public static final String pref_touchvibe = "touch_vibration_enabled";
public static final String pref_vibrationDuration = "vibration_duration";
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java
index a0167e02f..e958a3a8d 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java
@@ -522,38 +522,13 @@ public class OptionsFragment extends Fragment {
fps_opt.setChecked(counter);
fps_opt.setOnCheckedChangeListener(fps_options);
- final CompoundButton use_egl14_opt = (CompoundButton) getView().findViewById(R.id.force_gpu_option);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
- OnCheckedChangeListener force_gpu_options = new OnCheckedChangeListener() {
-
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- mPrefs.edit().putBoolean(Config.pref_egl14, isChecked).apply();
- }
- };
- boolean enhanced = mPrefs.getBoolean(Config.pref_egl14, false);
- use_egl14_opt.setChecked(enhanced);
- use_egl14_opt.setOnCheckedChangeListener(force_gpu_options);
- } else {
- use_egl14_opt.setEnabled(false);
- }
-
CompoundButton force_software_opt = (CompoundButton) getView().findViewById(
R.id.software_option);
OnCheckedChangeListener force_software = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- mPrefs.edit()
- .putInt(Config.pref_rendertype, isChecked
- ? GL2JNIView.LAYER_TYPE_SOFTWARE : GL2JNIView.LAYER_TYPE_HARDWARE
- ).apply();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- if (isChecked) {
- use_egl14_opt.setEnabled(false);
- mPrefs.edit().putBoolean(Config.pref_egl14, false).apply();
- } else {
- use_egl14_opt.setEnabled(true);
- }
- }
+ mPrefs.edit().putInt(Config.pref_rendertype, isChecked ?
+ GL2JNIView.LAYER_TYPE_SOFTWARE : GL2JNIView.LAYER_TYPE_HARDWARE).apply();
}
};
int software = mPrefs.getInt(Config.pref_rendertype, GL2JNIView.LAYER_TYPE_HARDWARE);
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/EmuService.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/EmuService.java
deleted file mode 100644
index 05938898e..000000000
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/EmuService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.reicast.emulator.emu;
-
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-import android.support.v4.app.NotificationCompat;
-
-import com.reicast.emulator.R;
-
-public class EmuService extends Service {
-
- private final static int FOREGROUND_ID = 999;
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if (intent != null && intent.getAction() != null
- && intent.getAction().equals("com.reicast.emulator.KYS")) {
- stopSelf();
- } else {
- Intent intentService = new Intent(this, EmuService.class);
- intentService.setAction("com.reicast.emulator.KYS");
- PendingIntent pendingIntent = PendingIntent.getService(this,
- (int) System.currentTimeMillis(), intentService,
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.drawable.ic_launcher)
- .setTicker(getString(R.string.service_ticker))
- .setContentTitle(getString(R.string.service_title))
- .setContentText(getString(R.string.service_content))
- .setContentIntent(pendingIntent);
- startForeground(FOREGROUND_ID, builder.build());
- return START_STICKY_COMPATIBILITY;
- }
- return START_NOT_STICKY;
- }
-
- @Override
- public void onDestroy() {
- stopForeground(true);
- }
-}
\ No newline at end of file
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java
index 9d1be7143..2853ac11f 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java
@@ -6,12 +6,10 @@ import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
-import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
-import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.os.Build;
import android.os.Environment;
@@ -37,8 +35,6 @@ import com.reicast.emulator.emu.OnScreenMenu.FpsPopup;
import com.reicast.emulator.periph.VJoy;
import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
@@ -183,29 +179,18 @@ public class GL2JNIView extends GLSurfaceView
// is interpreted as any 32-bit surface with alpha by SurfaceFlinger.
if(translucent) this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
- if (prefs.getBoolean(Config.pref_egl14, false)) {
- setEGLContextFactory(new GLCFactory14.ContextFactory());
- setEGLConfigChooser(
- translucent?
- new GLCFactory14.ConfigChooser(8, 8, 8, 8, depth, stencil)
- : new GLCFactory14.ConfigChooser(5, 6, 5, 0, depth, stencil)
- );
- GLES20.glEnable(GLES20.GL_DEPTH_TEST);
- } else {
- // Setup the context factory for 2.0 rendering.
- // See ContextFactory class definition below
- setEGLContextFactory(new GLCFactory.ContextFactory());
+ // Setup the context factory for 2.0 rendering.
+ // See ContextFactory class definition below
+ setEGLContextFactory(new GLCFactory.ContextFactory());
- // We need to choose an EGLConfig that matches the format of
- // our surface exactly. This is going to be done in our
- // custom config chooser. See ConfigChooser class definition
- // below.
- setEGLConfigChooser(
- translucent?
- new GLCFactory.ConfigChooser(8, 8, 8, 8, depth, stencil)
- : new GLCFactory.ConfigChooser(5, 6, 5, 0, depth, stencil)
- );
- }
+ // We need to choose an EGLConfig that matches the format of
+ // our surface exactly. This is going to be done in our
+ // custom config chooser. See ConfigChooser class definition
+ // below.
+ setEGLConfigChooser(translucent?
+ new GLCFactory.ConfigChooser(8, 8, 8, 8, depth, stencil)
+ : new GLCFactory.ConfigChooser(5, 6, 5, 0, depth, stencil)
+ );
// Set the renderer responsible for frame rendering
setRenderer(rend=new Renderer(this));
@@ -695,24 +680,10 @@ public class GL2JNIView extends GLSurfaceView
}
-// public void onStop() {
-// // TODO Auto-generated method stub
-// System.exit(0);
-// try {
-// ethd.join();
-// } catch (InterruptedException e) {
-// // TODO Auto-generated catch block
-// e.printStackTrace();
-// }
-// }
-
public void onDestroy() {
- // TODO Auto-generated method stub
- System.exit(0);
try {
ethd.join();
} catch (InterruptedException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
}
diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GLCFactory14.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GLCFactory14.java
index 8225cfe88..cc27b165f 100644
--- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GLCFactory14.java
+++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GLCFactory14.java
@@ -2,17 +2,19 @@ package com.reicast.emulator.emu;
import android.annotation.TargetApi;
import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
import android.opengl.EGLExt;
-import android.opengl.GLSurfaceView;
+import android.opengl.EGLSurface;
+import android.opengl.GLES20;
import android.os.Build;
import android.util.Log;
+import android.view.Window;
import java.util.Locale;
import javax.microedition.khronos.egl.EGL10;
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.egl.EGLContext;
-import javax.microedition.khronos.egl.EGLDisplay;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class GLCFactory14 {
@@ -25,33 +27,52 @@ public class GLCFactory14 {
private int EGL_DEPTH_ENCODING_NV = 0x30E2;
private int EGL_DEPTH_ENCODING_NONLINEAR_NV = 0x30E3;
- public static class ContextFactory implements GLSurfaceView.EGLContextFactory
+ private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
+
+ private void configureWindow() {
+ GLES20.glEnable(GLES20.GL_DEPTH_TEST);
+ }
+
+ public EGLDisplay getDisplay() {
+ EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+
+ if (eglDisplay == EGL14.EGL_NO_DISPLAY) {
+ throw new RuntimeException("eglGetDisplay failed");
+ }
+
+ int[] major = new int[1];
+ int[] minor = new int[1];
+ if (!EGL14.eglInitialize(eglDisplay, major, 0, minor, 0)) {
+ throw new RuntimeException("eglInitialize failed");
+ }
+ if (minor[0] < 4) {
+ throw new RuntimeException("EGL 1.4 required");
+ }
+ return eglDisplay;
+ }
+
+ public void terminate(EGLDisplay display) {
+ EGL14.eglTerminate(display);
+ }
+
+ public EGLContext createContext(EGLDisplay display, EGLConfig eglConfig)
{
- private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
+ EGLContext context = EGL14.EGL_NO_CONTEXT;
+ for ( int clientVersion = 3; clientVersion >= 2; clientVersion-- ) {
+ int[] attrList = { EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL14.EGL_NONE };
- public EGLContext createContext(EGL10 egl,EGLDisplay display,EGLConfig eglConfig)
- {
- EGLContext context = EGL10.EGL_NO_CONTEXT;
- for ( int clientVersion = 3; clientVersion >= 2; clientVersion-- ) {
- int[] attrList = { EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL14.EGL_NONE };
+ LOGI("Creating OpenGL ES " + clientVersion + " context");
- LOGI("Creating OpenGL ES " + clientVersion + " context");
-
- checkEglError("Before eglCreateContext",egl);
- context = egl.eglCreateContext(display,eglConfig,EGL10.EGL_NO_CONTEXT,attrList);
- checkEglError("After eglCreateContext",egl);
- if (context != EGL10.EGL_NO_CONTEXT) {
- break;
- }
+ context = EGL14.eglCreateContext(display, eglConfig, EGL14.EGL_NO_CONTEXT, attrList, 0);
+ if (context != EGL14.EGL_NO_CONTEXT) {
+ break;
}
- return(context);
}
+ return(context);
+ }
- public void destroyContext(EGL10 egl,EGLDisplay display,EGLContext context)
- {
- LOGI("Destroying OpenGL ES X context");
- egl.eglDestroyContext(display,context);
- }
+ public void destroyContext(EGLDisplay display, EGLContext context) {
+ EGL14.eglDestroyContext(display, context);
}
private static void checkEglError(String prompt,EGL10 egl)
@@ -62,200 +83,193 @@ public class GLCFactory14 {
LOGE(String.format(Locale.getDefault(), "%s: EGL error: 0x%x",prompt,error));
}
- public static class ConfigChooser implements GLSurfaceView.EGLConfigChooser
- {
- // Subclasses can adjust these values:
- protected int mRedSize;
- protected int mGreenSize;
- protected int mBlueSize;
- protected int mAlphaSize;
- protected int mDepthSize;
- protected int mStencilSize;
- private int[] mValue = new int[1];
+ // Subclasses can adjust these values:
+ protected int mRedSize;
+ protected int mGreenSize;
+ protected int mBlueSize;
+ protected int mAlphaSize;
+ protected int mDepthSize;
+ protected int mStencilSize;
+ private int[] mValue = new int[1];
- public ConfigChooser(int r,int g,int b,int a,int depth,int stencil)
- {
- mRedSize = r;
- mGreenSize = g;
- mBlueSize = b;
- mAlphaSize = a;
- mDepthSize = depth;
- mStencilSize = stencil;
+ public EGLConfig chooseConfig(EGLDisplay display) {
+ mValue = new int[1];
+
+ int glAPIToTry = EGLExt.EGL_OPENGL_ES3_BIT_KHR;
+ int[] configSpec = null;
+
+ do {
+ EGL14.eglBindAPI(glAPIToTry);
+
+ int renderableType;
+ if (glAPIToTry == EGLExt.EGL_OPENGL_ES3_BIT_KHR) {
+ renderableType = EGLExt.EGL_OPENGL_ES3_BIT_KHR;
+ // If this API does not work, try ES2 next.
+ glAPIToTry = EGL14.EGL_OPENGL_ES2_BIT;
+ } else {
+ renderableType = EGL14.EGL_OPENGL_ES2_BIT;
+ // If this API does not work, is a potato.
+ glAPIToTry = EGL10.EGL_NONE;
+ }
+
+ // This EGL config specification is used to specify 3.0 rendering.
+ // We use a minimum size of 8 bits for red/green/blue, but will
+ // perform actual matching in chooseConfig() below.
+ configSpec = new int[] {
+ EGL14.EGL_RED_SIZE, 8,
+ EGL14.EGL_GREEN_SIZE, 8,
+ EGL14.EGL_BLUE_SIZE, 8,
+ EGL14.EGL_RENDERABLE_TYPE, renderableType,
+ EGL14.EGL_DEPTH_SIZE, 16,
+ EGL14.EGL_NONE
+ };
+
+ if (!EGL14.eglChooseConfig(display, configSpec, 0,null, 0, 0, mValue, 0)) {
+ configSpec[9] = 16;
+ if (!EGL14.eglChooseConfig(display, configSpec, 0,null, 0, 0, mValue, 0)) {
+ throw new IllegalArgumentException("Could not get context count");
+ }
+ }
+
+ } while (glAPIToTry != EGL10.EGL_NONE && mValue[0]<=0);
+
+ if (mValue[0]<=0) {
+ throw new IllegalArgumentException("No configs match configSpec");
}
- public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
- mValue = new int[1];
+ // Get all matching configurations.
+ EGLConfig[] configs = new EGLConfig[mValue[0]];
+ if (GL2JNIView.DEBUG)
+ LOGW(String.format(Locale.getDefault(), "%d configurations", configs.length));
+ if (!EGL14.eglChooseConfig(display, configSpec, 0, configs,0, mValue[0], mValue, 0)) {
+ throw new IllegalArgumentException("Could not get config data");
+ }
- int glAPIToTry = EGLExt.EGL_OPENGL_ES3_BIT_KHR;
- int[] configSpec = null;
+ for (int i = 0; i < configs.length; ++i) {
+ EGLConfig config = configs[i];
+ int d = findConfigAttrib(display, config, EGL14.EGL_DEPTH_SIZE, 0);
+ int s = findConfigAttrib(display, config, EGL14.EGL_STENCIL_SIZE, 0);
- do {
- EGL14.eglBindAPI(glAPIToTry);
+ // We need at least mDepthSize and mStencilSize bits
+ if (d >= mDepthSize || s >= mStencilSize) {
+ // We want an *exact* match for red/green/blue/alpha
+ int r = findConfigAttrib(display, config, EGL14.EGL_RED_SIZE, 0);
+ int g = findConfigAttrib(display, config, EGL14.EGL_GREEN_SIZE, 0);
+ int b = findConfigAttrib(display, config, EGL14.EGL_BLUE_SIZE, 0);
+ int a = findConfigAttrib(display, config, EGL14.EGL_ALPHA_SIZE, 0);
- int renderableType;
- if (glAPIToTry == EGLExt.EGL_OPENGL_ES3_BIT_KHR) {
- renderableType = EGLExt.EGL_OPENGL_ES3_BIT_KHR;
- // If this API does not work, try ES2 next.
- glAPIToTry = EGL14.EGL_OPENGL_ES2_BIT;
- } else {
- renderableType = EGL14.EGL_OPENGL_ES2_BIT;
- // If this API does not work, is a potato.
- glAPIToTry = EGL10.EGL_NONE;
- }
-
- // This EGL config specification is used to specify 2.0 rendering.
- // We use a minimum size of 4 bits for red/green/blue, but will
- // perform actual matching in chooseConfig() below.
- configSpec = new int[] {
- EGL14.EGL_RED_SIZE, 4,
- EGL14.EGL_GREEN_SIZE, 4,
- EGL14.EGL_BLUE_SIZE, 4,
- EGL14.EGL_RENDERABLE_TYPE, renderableType,
- EGL14.EGL_DEPTH_SIZE, 16,
- EGL14.EGL_NONE
- };
-
- if (!egl.eglChooseConfig(display, configSpec, null, 0, mValue)) {
- configSpec[9] = 16;
- if (!egl.eglChooseConfig(display, configSpec, null, 0, mValue)) {
- throw new IllegalArgumentException("Could not get context count");
+ if (r == mRedSize && g == mGreenSize && b == mBlueSize
+ && a == mAlphaSize)
+ if (GL2JNIView.DEBUG) {
+ LOGW(String.format("Configuration %d:", i));
+ printConfig(display, configs[i]);
}
- }
-
- } while (glAPIToTry != EGL10.EGL_NONE && mValue[0]<=0);
-
- if (mValue[0]<=0) {
- throw new IllegalArgumentException("No configs match configSpec");
+ return config;
}
-
- // Get all matching configurations.
- EGLConfig[] configs = new EGLConfig[mValue[0]];
- if (GL2JNIView.DEBUG)
- LOGW(String.format(Locale.getDefault(), "%d configurations", configs.length));
- if (!egl.eglChooseConfig(display, configSpec, configs, mValue[0], mValue)) {
- throw new IllegalArgumentException("Could not get config data");
- }
-
- for (int i = 0; i < configs.length; ++i) {
- EGLConfig config = configs[i];
- int d = findConfigAttrib(egl, display, config,
- EGL14.EGL_DEPTH_SIZE, 0);
- int s = findConfigAttrib(egl, display, config,
- EGL14.EGL_STENCIL_SIZE, 0);
-
- // We need at least mDepthSize and mStencilSize bits
- if (d >= mDepthSize || s >= mStencilSize) {
- // We want an *exact* match for red/green/blue/alpha
- int r = findConfigAttrib(egl, display, config,
- EGL14.EGL_RED_SIZE, 0);
- int g = findConfigAttrib(egl, display, config,
- EGL14.EGL_GREEN_SIZE, 0);
- int b = findConfigAttrib(egl, display, config,
- EGL14.EGL_BLUE_SIZE, 0);
- int a = findConfigAttrib(egl, display, config,
- EGL14.EGL_ALPHA_SIZE, 0);
-
- if (r == mRedSize && g == mGreenSize && b == mBlueSize
- && a == mAlphaSize)
- if (GL2JNIView.DEBUG) {
- LOGW(String.format("Configuration %d:", i));
- printConfig(egl, display, configs[i]);
- }
- return config;
- }
- }
-
- throw new IllegalArgumentException("Could not find suitable EGL config");
}
- private int findConfigAttrib(EGL10 egl,EGLDisplay display,EGLConfig config,int attribute,int defaultValue)
- {
- return(egl.eglGetConfigAttrib(display,config,attribute,mValue)? mValue[0] : defaultValue);
- }
+ throw new IllegalArgumentException("Could not find suitable EGL config");
+ }
- private void printConfig(EGL10 egl,EGLDisplay display,EGLConfig config)
- {
- final int[] attributes =
+ private int findConfigAttrib(EGLDisplay display, EGLConfig config, int defaultValue, int attribute) {
+ int[] value = new int[1];
+ if (EGL14.eglGetConfigAttrib(display, config, attribute, value, 0)) {
+ return value[0];
+ }
+ return defaultValue;
+ }
+
+ private void printConfig(EGLDisplay display, EGLConfig config)
+ {
+ final int[] attributes =
{
- EGL14.EGL_BUFFER_SIZE,
- EGL14.EGL_ALPHA_SIZE,
- EGL14.EGL_BLUE_SIZE,
- EGL14.EGL_GREEN_SIZE,
- EGL14.EGL_RED_SIZE,
- EGL14.EGL_DEPTH_SIZE,
- EGL14.EGL_STENCIL_SIZE,
- EGL14.EGL_CONFIG_CAVEAT,
- EGL14.EGL_CONFIG_ID,
- EGL14.EGL_LEVEL,
- EGL14.EGL_MAX_PBUFFER_HEIGHT,
- EGL14.EGL_MAX_PBUFFER_PIXELS,
- EGL14.EGL_MAX_PBUFFER_WIDTH,
- EGL14.EGL_NATIVE_RENDERABLE,
- EGL14.EGL_NATIVE_VISUAL_ID,
- EGL14.EGL_NATIVE_VISUAL_TYPE,
- 0x3030, // EGL14.EGL_PRESERVED_RESOURCES,
- EGL14.EGL_SAMPLES,
- EGL14.EGL_SAMPLE_BUFFERS,
- EGL14.EGL_SURFACE_TYPE,
- EGL14.EGL_TRANSPARENT_TYPE,
- EGL14.EGL_TRANSPARENT_RED_VALUE,
- EGL14.EGL_TRANSPARENT_GREEN_VALUE,
- EGL14.EGL_TRANSPARENT_BLUE_VALUE,
- EGL14.EGL_BIND_TO_TEXTURE_RGB,
- EGL14.EGL_BIND_TO_TEXTURE_RGBA,
- EGL14.EGL_MIN_SWAP_INTERVAL,
- EGL14.EGL_MAX_SWAP_INTERVAL,
- EGL14.EGL_LUMINANCE_SIZE,
- EGL14.EGL_ALPHA_MASK_SIZE,
- EGL14.EGL_COLOR_BUFFER_TYPE,
- EGL14.EGL_RENDERABLE_TYPE,
- EGL14.EGL_CONFORMANT
+ EGL14.EGL_BUFFER_SIZE,
+ EGL14.EGL_ALPHA_SIZE,
+ EGL14.EGL_BLUE_SIZE,
+ EGL14.EGL_GREEN_SIZE,
+ EGL14.EGL_RED_SIZE,
+ EGL14.EGL_DEPTH_SIZE,
+ EGL14.EGL_STENCIL_SIZE,
+ EGL14.EGL_CONFIG_CAVEAT,
+ EGL14.EGL_CONFIG_ID,
+ EGL14.EGL_LEVEL,
+ EGL14.EGL_MAX_PBUFFER_HEIGHT,
+ EGL14.EGL_MAX_PBUFFER_PIXELS,
+ EGL14.EGL_MAX_PBUFFER_WIDTH,
+ EGL14.EGL_NATIVE_RENDERABLE,
+ EGL14.EGL_NATIVE_VISUAL_ID,
+ EGL14.EGL_NATIVE_VISUAL_TYPE,
+ 0x3030, // EGL14.EGL_PRESERVED_RESOURCES,
+ EGL14.EGL_SAMPLES,
+ EGL14.EGL_SAMPLE_BUFFERS,
+ EGL14.EGL_SURFACE_TYPE,
+ EGL14.EGL_TRANSPARENT_TYPE,
+ EGL14.EGL_TRANSPARENT_RED_VALUE,
+ EGL14.EGL_TRANSPARENT_GREEN_VALUE,
+ EGL14.EGL_TRANSPARENT_BLUE_VALUE,
+ EGL14.EGL_BIND_TO_TEXTURE_RGB,
+ EGL14.EGL_BIND_TO_TEXTURE_RGBA,
+ EGL14.EGL_MIN_SWAP_INTERVAL,
+ EGL14.EGL_MAX_SWAP_INTERVAL,
+ EGL14.EGL_LUMINANCE_SIZE,
+ EGL14.EGL_ALPHA_MASK_SIZE,
+ EGL14.EGL_COLOR_BUFFER_TYPE,
+ EGL14.EGL_RENDERABLE_TYPE,
+ EGL14.EGL_CONFORMANT
};
- final String[] names =
+ final String[] names =
{
- "EGL_BUFFER_SIZE",
- "EGL_ALPHA_SIZE",
- "EGL_BLUE_SIZE",
- "EGL_GREEN_SIZE",
- "EGL_RED_SIZE",
- "EGL_DEPTH_SIZE",
- "EGL_STENCIL_SIZE",
- "EGL_CONFIG_CAVEAT",
- "EGL_CONFIG_ID",
- "EGL_LEVEL",
- "EGL_MAX_PBUFFER_HEIGHT",
- "EGL_MAX_PBUFFER_PIXELS",
- "EGL_MAX_PBUFFER_WIDTH",
- "EGL_NATIVE_RENDERABLE",
- "EGL_NATIVE_VISUAL_ID",
- "EGL_NATIVE_VISUAL_TYPE",
- "EGL_PRESERVED_RESOURCES",
- "EGL_SAMPLES",
- "EGL_SAMPLE_BUFFERS",
- "EGL_SURFACE_TYPE",
- "EGL_TRANSPARENT_TYPE",
- "EGL_TRANSPARENT_RED_VALUE",
- "EGL_TRANSPARENT_GREEN_VALUE",
- "EGL_TRANSPARENT_BLUE_VALUE",
- "EGL_BIND_TO_TEXTURE_RGB",
- "EGL_BIND_TO_TEXTURE_RGBA",
- "EGL_MIN_SWAP_INTERVAL",
- "EGL_MAX_SWAP_INTERVAL",
- "EGL_LUMINANCE_SIZE",
- "EGL_ALPHA_MASK_SIZE",
- "EGL_COLOR_BUFFER_TYPE",
- "EGL_RENDERABLE_TYPE",
- "EGL_CONFORMANT"
+ "EGL_BUFFER_SIZE",
+ "EGL_ALPHA_SIZE",
+ "EGL_BLUE_SIZE",
+ "EGL_GREEN_SIZE",
+ "EGL_RED_SIZE",
+ "EGL_DEPTH_SIZE",
+ "EGL_STENCIL_SIZE",
+ "EGL_CONFIG_CAVEAT",
+ "EGL_CONFIG_ID",
+ "EGL_LEVEL",
+ "EGL_MAX_PBUFFER_HEIGHT",
+ "EGL_MAX_PBUFFER_PIXELS",
+ "EGL_MAX_PBUFFER_WIDTH",
+ "EGL_NATIVE_RENDERABLE",
+ "EGL_NATIVE_VISUAL_ID",
+ "EGL_NATIVE_VISUAL_TYPE",
+ "EGL_PRESERVED_RESOURCES",
+ "EGL_SAMPLES",
+ "EGL_SAMPLE_BUFFERS",
+ "EGL_SURFACE_TYPE",
+ "EGL_TRANSPARENT_TYPE",
+ "EGL_TRANSPARENT_RED_VALUE",
+ "EGL_TRANSPARENT_GREEN_VALUE",
+ "EGL_TRANSPARENT_BLUE_VALUE",
+ "EGL_BIND_TO_TEXTURE_RGB",
+ "EGL_BIND_TO_TEXTURE_RGBA",
+ "EGL_MIN_SWAP_INTERVAL",
+ "EGL_MAX_SWAP_INTERVAL",
+ "EGL_LUMINANCE_SIZE",
+ "EGL_ALPHA_MASK_SIZE",
+ "EGL_COLOR_BUFFER_TYPE",
+ "EGL_RENDERABLE_TYPE",
+ "EGL_CONFORMANT"
};
- int[] value = new int[1];
+ int[] value = new int[1];
- for(int i=0 ; iNewByteArray(1536);
}
-JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_stop(JNIEnv *env,jobject obj)
+JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_pause(JNIEnv *env,jobject obj)
{
-// dc_stop();
+ dc_pause();
}
-JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_terminate(JNIEnv *env,jobject obj)
+JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_destroy(JNIEnv *env,jobject obj)
{
dc_term();
}