Merge pull request #1267 from reicast/lk/android-studio
Cleanup and improvements to Android Studio
This commit is contained in:
commit
14bf4b5b1c
|
@ -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();
|
||||
|
|
|
@ -123,11 +123,6 @@
|
|||
android:screenOrientation="sensorLandscape"
|
||||
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
|
||||
|
||||
<service
|
||||
android:name=".emu.EmuService"
|
||||
android:configChanges="orientation"
|
||||
android:enabled="true"
|
||||
android:exported="true" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ; i<attributes.length ; i++)
|
||||
if(egl.eglGetConfigAttrib(display,config,attributes[i],value))
|
||||
LOGI(String.format(Locale.getDefault(), " %s: %d\n",names[i],value[0]));
|
||||
else
|
||||
while(egl.eglGetError()!=EGL14.EGL_SUCCESS);
|
||||
}
|
||||
for(int i=0 ; i<attributes.length ; i++)
|
||||
if(EGL14.eglGetConfigAttrib(display, config, attributes[i], value,0))
|
||||
LOGI(String.format(Locale.getDefault(), " %s: %d\n",names[i],value[0]));
|
||||
else
|
||||
while(EGL14.eglGetError() != EGL14.EGL_SUCCESS);
|
||||
}
|
||||
|
||||
public EGLSurface createWindowSurface(EGLDisplay display, EGLConfig config, Window window) {
|
||||
EGLSurface eglSurface = EGL14.eglCreateWindowSurface(display, config, window, null, 0);
|
||||
return eglSurface;
|
||||
}
|
||||
|
||||
public void destroySurface(EGLDisplay display, EGLSurface window) {
|
||||
EGL14.eglDestroySurface(display, window);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,8 +8,8 @@ public final class JNIdc
|
|||
public static native void config(String dirName);
|
||||
public static native void init(String fileName);
|
||||
public static native void run(Object track);
|
||||
public static native void stop();
|
||||
public static native void terminate();
|
||||
public static native void pause();
|
||||
public static native void destroy();
|
||||
|
||||
public static native int send(int cmd, int opt);
|
||||
public static native int data(int cmd, byte[] data);
|
||||
|
|
|
@ -25,8 +25,8 @@ extern "C"
|
|||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_config(JNIEnv *env,jobject obj,jstring dirName) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_init(JNIEnv *env,jobject obj,jstring fileName) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_run(JNIEnv *env,jobject obj,jobject emu_thread) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_stop(JNIEnv *env,jobject obj) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_terminate(JNIEnv *env,jobject obj) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_pause(JNIEnv *env,jobject obj) __attribute__((visibility("default")));
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_destroy(JNIEnv *env,jobject obj) __attribute__((visibility("default")));
|
||||
|
||||
JNIEXPORT jint JNICALL Java_com_reicast_emulator_emu_JNIdc_send(JNIEnv *env,jobject obj,jint id, jint v) __attribute__((visibility("default")));
|
||||
JNIEXPORT jint JNICALL Java_com_reicast_emulator_emu_JNIdc_data(JNIEnv *env,jobject obj,jint id, jbyteArray d) __attribute__((visibility("default")));
|
||||
|
@ -165,7 +165,7 @@ void egl_stealcntx();
|
|||
void SetApplicationPath(wchar *path);
|
||||
int dc_init(int argc,wchar* argv[]);
|
||||
void dc_run();
|
||||
//void dc_stop();
|
||||
void dc_pause();
|
||||
void dc_term();
|
||||
void mcfg_Create(MapleDeviceType type,u32 bus,u32 port);
|
||||
|
||||
|
@ -376,12 +376,12 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setupVmu(JNIEnv *env,
|
|||
//jpix=env->NewByteArray(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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue