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