From 97d6afdde90c1d28fd1d0e9d202615b1e3afdce6 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 23 Dec 2014 03:56:06 -0600 Subject: [Android] Add a few helper functions to EGLHelper. Let's us check for extension support and OpenGL version. --- .../org/dolphinemu/dolphinemu/utils/EGLHelper.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'Source/Android/src') diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java b/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java index c908a7631f..4eef5f6a3d 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java @@ -354,6 +354,29 @@ public final class EGLHelper return GLES30.glGetStringi(glEnum, index); } + public boolean SupportsExtension(String extension) + { + int[] num_ext = new int[1]; + GLES30.glGetIntegerv(GLES30.GL_NUM_EXTENSIONS, num_ext, 0); + + for (int i = 0; i < num_ext[0]; ++i) + { + String ext = GLES30.glGetStringi(GLES30.GL_EXTENSIONS, i); + if (ext.equals(extension)) + return true; + } + return false; + } + + public int GetVersion() + { + int[] major = new int[1]; + int[] minor = new int[1]; + GLES30.glGetIntegerv(GLES30.GL_MAJOR_VERSION, major, 0); + GLES30.glGetIntegerv(GLES30.GL_MINOR_VERSION, minor, 0); + return major[0] * 100 + minor[0] * 10; + } + /** * Simplified call to {@link GL10#glGetIntegerv(int, int[], int) * -- cgit v1.2.3 From 859e103ce6d65c0a08ed1912b2fbe3248d193543 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 23 Dec 2014 03:58:16 -0600 Subject: [Android] Add support for sterescopy configuration. This menu allows us to configure the stereoscopy video settings if the device supports it. This menu is only enabled if the hardware supports everything needed to use the feature. --- .../dolphinemu/settings/UserPreferences.java | 19 +++++ .../settings/video/VideoSettingsFragment.java | 9 ++ .../dolphinemu/utils/SliderPreference.java | 97 ++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java (limited to 'Source/Android/src') diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java index d2ae56b40f..710ebca7ee 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java @@ -57,6 +57,10 @@ public final class UserPreferences editor.putBoolean("disableFog", getConfig("gfx_opengl.ini", "Settings", "DisableFog", "False").equals("True")); editor.putBoolean("skipEFBAccess", getConfig("gfx_opengl.ini", "Hacks", "EFBAccessEnable", "False").equals("True")); editor.putBoolean("ignoreFormatChanges", getConfig("gfx_opengl.ini", "Hacks", "EFBEmulateFormatChanges", "False").equals("False")); + editor.putString("stereoscopyMode", getConfig("gfx_opengl.ini", "Enhancements", "StereoMode", "0")); + editor.putBoolean("stereoSwapEyes", getConfig("gfx_opengl.ini", "Enhancements", "StereoSwapEyes", "False").equals("True")); + editor.putString("stereoDepth", getConfig("gfx_opengl.ini", "Enhancements", "StereoDepth", "20")); + editor.putString("stereoConvergence", getConfig("gfx_opengl.ini", "Enhancements", "StereoConvergence", "20")); String efbCopyOn = getConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "True"); String efbToTexture = getConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "True"); @@ -182,6 +186,17 @@ public final class UserPreferences // Whether or not fog is disabled. boolean fogIsDisabled = prefs.getBoolean("disableFog", false); + // Stereoscopy setting + String stereoscopyMode = prefs.getString("stereoscopyMode", "0"); + + // Stereoscopy swap eyes + boolean stereoscopyEyeSwap = prefs.getBoolean("stereoSwapEyes", false); + + // Stereoscopy separation + String stereoscopySeparation = prefs.getString("stereoDepth", "20"); + + // Stereoscopy convergence + String stereoscopyConvergence = prefs.getString("stereoConvergence", "20"); // CPU related Settings NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUCore", currentEmuCore); @@ -251,5 +266,9 @@ public final class UserPreferences NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "EnablePixelLighting", usingPerPixelLighting ? "True" : "False"); NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "ForceFiltering", isForcingTextureFiltering ? "True" : "False"); NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "DisableFog", fogIsDisabled ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoMode", stereoscopyMode); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoSwapEyes", stereoscopyEyeSwap ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoDepth", stereoscopySeparation); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoConvergence", stereoscopyConvergence); } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java index e5444e8c3b..214612f895 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java @@ -121,6 +121,15 @@ public final class VideoSettingsFragment extends PreferenceFragment mainScreen.getPreference(0).setEnabled(true); mainScreen.getPreference(1).setEnabled(true); mainScreen.getPreference(3).setEnabled(true); + + // Check if we support stereo + // If we support desktop GL then we must support at least OpenGL 3.2 + // If we only support OpenGLES then we need both OpenGLES 3.1 and AEP + if ((eglHelper.supportsOpenGL() && eglHelper.GetVersion() >= 320) || + (eglHelper.supportsGLES3() && eglHelper.GetVersion() >= 310 && eglHelper.SupportsExtension("GL_ANDROID_extension_pack_es31a"))) + mainScreen.findPreference("StereoscopyScreen").setEnabled(true); + else + mainScreen.findPreference("StereoscopyScreen").setEnabled(false); } // Also set a listener, so that if someone changes the video backend, it will disable diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java b/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java new file mode 100644 index 0000000000..b5b394ed83 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java @@ -0,0 +1,97 @@ +package org.dolphinemu.dolphinemu.utils; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import org.dolphinemu.dolphinemu.R; + +public class SliderPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener, View.OnClickListener +{ + private static final String androidns = "http://schemas.android.com/apk/res/android"; + + private Context m_context; + + // SeekBar + private int m_max, m_value; + private SeekBar m_seekbar; + + // TextView + private TextView m_textview; + + public SliderPreference(Context context, AttributeSet attrs) + { + super(context,attrs); + m_context = context; + + // Seekbar values + m_value = attrs.getAttributeIntValue(androidns, "defaultValue", 0); + m_max = attrs.getAttributeIntValue(androidns, "max", 100); + } + + @Override + protected View onCreateDialogView() + { + LayoutInflater inflater = LayoutInflater.from(m_context); + LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.slider_layout, null, false); + + m_seekbar = (SeekBar)layout.getChildAt(0); + m_textview = (TextView)layout.getChildAt(1); + + if (shouldPersist()) + m_value = Integer.valueOf(getPersistedString(Integer.toString(m_value))); + + m_seekbar.setMax(m_max); + m_seekbar.setProgress(m_value); + setProgressText(m_value); + m_seekbar.setOnSeekBarChangeListener(this); + + return layout; + } + + // SeekBar overrides + @Override + public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) + { + m_value = value; + setProgressText(value); + } + + @Override + public void onStartTrackingTouch(SeekBar seek) {} + @Override + public void onStopTrackingTouch(SeekBar seek) {} + + void setProgressText(int value) + { + m_textview.setText(String.valueOf(value)); + } + + @Override + public void showDialog(Bundle state) { + + super.showDialog(state); + + Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); + positiveButton.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + if (shouldPersist()) + { + persistString(Integer.toString(m_seekbar.getProgress())); + callChangeListener(m_seekbar.getProgress()); + } + ((AlertDialog) getDialog()).dismiss(); + } +} -- cgit v1.2.3