diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/egl/EGLConfigChooser.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/egl/EGLConfigChooser.java | 328 |
1 files changed, 0 insertions, 328 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/egl/EGLConfigChooser.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/egl/EGLConfigChooser.java deleted file mode 100644 index 178911b0ac..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/egl/EGLConfigChooser.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.mapbox.mapboxsdk.maps.renderer.egl; - -import android.opengl.GLSurfaceView; -import android.os.Build; -import android.support.annotation.NonNull; -import com.mapbox.mapboxsdk.constants.MapboxConstants; -import com.mapbox.mapboxsdk.log.Logger; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLDisplay; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static com.mapbox.mapboxsdk.utils.Compare.compare; -import static javax.microedition.khronos.egl.EGL10.EGL_ALPHA_MASK_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_ALPHA_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_BLUE_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_BUFFER_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_COLOR_BUFFER_TYPE; -import static javax.microedition.khronos.egl.EGL10.EGL_CONFIG_CAVEAT; -import static javax.microedition.khronos.egl.EGL10.EGL_DEPTH_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_GREEN_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_NONE; -import static javax.microedition.khronos.egl.EGL10.EGL_RED_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_RENDERABLE_TYPE; -import static javax.microedition.khronos.egl.EGL10.EGL_RGB_BUFFER; -import static javax.microedition.khronos.egl.EGL10.EGL_SAMPLES; -import static javax.microedition.khronos.egl.EGL10.EGL_SAMPLE_BUFFERS; -import static javax.microedition.khronos.egl.EGL10.EGL_STENCIL_SIZE; -import static javax.microedition.khronos.egl.EGL10.EGL_SURFACE_TYPE; -import static javax.microedition.khronos.egl.EGL10.EGL_WINDOW_BIT; - -/** - * Selects the right EGLConfig needed for `mapbox-gl-native` - */ -public class EGLConfigChooser implements GLSurfaceView.EGLConfigChooser { - - private static final String TAG = "Mbgl-EGLConfigChooser"; - - /** - * Requires API level 17 - * - * @see android.opengl.EGL14.EGL_CONFORMANT; - */ - @SuppressWarnings("JavadocReference") - private static final int EGL_CONFORMANT = 0x3042; - - /** - * Requires API level 17 - * - * @see android.opengl.EGL14.EGL_OPENGL_ES2_BIT; - */ - @SuppressWarnings("JavadocReference") - private static final int EGL_OPENGL_ES2_BIT = 0x0004; - - private boolean translucentSurface; - - public EGLConfigChooser() { - this(false); - } - - public EGLConfigChooser(boolean translucentSurface) { - super(); - this.translucentSurface = translucentSurface; - } - - @Override - public EGLConfig chooseConfig(@NonNull EGL10 egl, EGLDisplay display) { - int[] configAttribs = getConfigAttributes(); - - // Determine number of possible configurations - int[] numConfigs = getNumberOfConfigurations(egl, display, configAttribs); - if (numConfigs[0] < 1) { - Logger.e(TAG, "eglChooseConfig() returned no configs."); - throw new EGLConfigException("eglChooseConfig() failed"); - } - - // Get all possible configurations - EGLConfig[] possibleConfigurations = getPossibleConfigurations(egl, display, configAttribs, numConfigs); - - // Choose best match - EGLConfig config = chooseBestMatchConfig(egl, display, possibleConfigurations); - if (config == null) { - Logger.e(TAG, "No config chosen"); - throw new EGLConfigException("No config chosen"); - } - - return config; - } - - @NonNull - private int[] getNumberOfConfigurations(EGL10 egl, EGLDisplay display, int[] configAttributes) { - int[] numConfigs = new int[1]; - if (!egl.eglChooseConfig(display, configAttributes, null, 0, numConfigs)) { - Logger.e(TAG, String.format( - MapboxConstants.MAPBOX_LOCALE, "eglChooseConfig(NULL) returned error %d", egl.eglGetError()) - ); - throw new EGLConfigException("eglChooseConfig() failed"); - } - return numConfigs; - } - - @NonNull - private EGLConfig[] getPossibleConfigurations(EGL10 egl, EGLDisplay display, - int[] configAttributes, int[] numConfigs) { - EGLConfig[] configs = new EGLConfig[numConfigs[0]]; - if (!egl.eglChooseConfig(display, configAttributes, configs, numConfigs[0], numConfigs)) { - Logger.e(TAG, String.format( - MapboxConstants.MAPBOX_LOCALE, "eglChooseConfig() returned error %d", egl.eglGetError()) - ); - throw new EGLConfigException("eglChooseConfig() failed"); - } - return configs; - } - - // Quality - enum BufferFormat { - Format16Bit(3), - Format32BitNoAlpha(1), - Format32BitAlpha(2), - Format24Bit(0), - Unknown(4); - - int value; - - BufferFormat(int value) { - this.value = value; - } - } - - enum DepthStencilFormat { - Format16Depth8Stencil(1), - Format24Depth8Stencil(0); - - int value; - - DepthStencilFormat(int value) { - this.value = value; - } - } - - private EGLConfig chooseBestMatchConfig(@NonNull EGL10 egl, EGLDisplay display, EGLConfig[] configs) { - class Config implements Comparable<Config> { - private final BufferFormat bufferFormat; - private final DepthStencilFormat depthStencilFormat; - private final boolean isNotConformant; - private final boolean isCaveat; - private final int index; - private final EGLConfig config; - - public Config(BufferFormat bufferFormat, DepthStencilFormat depthStencilFormat, - boolean isNotConformant, boolean isCaveat, int index, EGLConfig config) { - this.bufferFormat = bufferFormat; - this.depthStencilFormat = depthStencilFormat; - this.isNotConformant = isNotConformant; - this.isCaveat = isCaveat; - this.index = index; - this.config = config; - } - - - @Override - public int compareTo(@NonNull Config other) { - int i = compare(bufferFormat.value, other.bufferFormat.value); - if (i != 0) { - return i; - } - - i = compare(depthStencilFormat.value, other.depthStencilFormat.value); - if (i != 0) { - return i; - } - - i = compare(isNotConformant, other.isNotConformant); - if (i != 0) { - return i; - } - - i = compare(isCaveat, other.isCaveat); - if (i != 0) { - return i; - } - - i = compare(index, other.index); - if (i != 0) { - return i; - } - - return 0; - } - } - - List<Config> matches = new ArrayList<>(); - - int i = 0; - for (EGLConfig config : configs) { - i++; - - int caveat = getConfigAttr(egl, display, config, EGL_CONFIG_CAVEAT); - int conformant = getConfigAttr(egl, display, config, EGL_CONFORMANT); - int bits = getConfigAttr(egl, display, config, EGL_BUFFER_SIZE); - int red = getConfigAttr(egl, display, config, EGL_RED_SIZE); - int green = getConfigAttr(egl, display, config, EGL_GREEN_SIZE); - int blue = getConfigAttr(egl, display, config, EGL_BLUE_SIZE); - int alpha = getConfigAttr(egl, display, config, EGL_ALPHA_SIZE); - int alphaMask = getConfigAttr(egl, display, config, EGL_ALPHA_MASK_SIZE); - int depth = getConfigAttr(egl, display, config, EGL_DEPTH_SIZE); - int stencil = getConfigAttr(egl, display, config, EGL_STENCIL_SIZE); - int sampleBuffers = getConfigAttr(egl, display, config, EGL_SAMPLE_BUFFERS); - int samples = getConfigAttr(egl, display, config, EGL_SAMPLES); - - boolean configOk = (depth == 24) || (depth == 16); - configOk &= stencil == 8; - configOk &= sampleBuffers == 0; - configOk &= samples == 0; - - // Filter our configs first for depth, stencil and anti-aliasing - if (configOk) { - // Work out the config's buffer format - BufferFormat bufferFormat; - if ((bits == 16) && (red == 5) && (green == 6) && (blue == 5) && (alpha == 0)) { - bufferFormat = BufferFormat.Format16Bit; - } else if ((bits == 32) && (red == 8) && (green == 8) && (blue == 8) && (alpha == 0)) { - bufferFormat = BufferFormat.Format32BitNoAlpha; - } else if ((bits == 32) && (red == 8) && (green == 8) && (blue == 8) && (alpha == 8)) { - bufferFormat = BufferFormat.Format32BitAlpha; - } else if ((bits == 24) && (red == 8) && (green == 8) && (blue == 8) && (alpha == 0)) { - bufferFormat = BufferFormat.Format24Bit; - } else { - bufferFormat = BufferFormat.Unknown; - } - - // Work out the config's depth stencil format - DepthStencilFormat depthStencilFormat; - if ((depth == 16) && (stencil == 8)) { - depthStencilFormat = DepthStencilFormat.Format16Depth8Stencil; - } else { - depthStencilFormat = DepthStencilFormat.Format24Depth8Stencil; - } - - boolean isNotConformant = (conformant & EGL_OPENGL_ES2_BIT) != EGL_OPENGL_ES2_BIT; - boolean isCaveat = caveat != EGL_NONE; - - // Ignore formats we don't recognise - if (bufferFormat != BufferFormat.Unknown) { - matches.add(new Config(bufferFormat, depthStencilFormat, isNotConformant, isCaveat, i, config)); - } - } - - } - - // Sort - Collections.sort(matches); - - if (matches.size() == 0) { - throw new EGLConfigException("No matching configurations after filtering"); - } - - Config bestMatch = matches.get(0); - - if (bestMatch.isCaveat) { - Logger.w(TAG, "Chosen config has a caveat."); - } - - if (bestMatch.isNotConformant) { - Logger.w(TAG, "Chosen config is not conformant."); - } - - return bestMatch.config; - } - - private int getConfigAttr(EGL10 egl, EGLDisplay display, EGLConfig config, int attributeName) { - int[] attributevalue = new int[1]; - if (!egl.eglGetConfigAttrib(display, config, attributeName, attributevalue)) { - Logger.e(TAG, String.format( - MapboxConstants.MAPBOX_LOCALE, "eglGetConfigAttrib(%d) returned error %d", attributeName, egl.eglGetError()) - ); - throw new EGLConfigException("eglGetConfigAttrib() failed"); - } - return attributevalue[0]; - } - - private int[] getConfigAttributes() { - boolean emulator = inEmulator() || inGenymotion(); - Logger.i(TAG, String.format("In emulator: %s", emulator)); - - // Get all configs at least RGB 565 with 16 depth and 8 stencil - return new int[] { - EGL_CONFIG_CAVEAT, EGL_NONE, - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_BUFFER_SIZE, 16, - EGL_RED_SIZE, 5, - EGL_GREEN_SIZE, 6, - EGL_BLUE_SIZE, 5, - EGL_ALPHA_SIZE, translucentSurface ? 8 : 0, - EGL_DEPTH_SIZE, 16, - EGL_STENCIL_SIZE, 8, - (emulator ? EGL_NONE : EGL_CONFORMANT), EGL_OPENGL_ES2_BIT, - (emulator ? EGL_NONE : EGL_COLOR_BUFFER_TYPE), EGL_RGB_BUFFER, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_NONE - }; - } - - /** - * Detect if we are in emulator. - */ - private boolean inEmulator() { - return Build.FINGERPRINT.startsWith("generic") - || Build.FINGERPRINT.startsWith("unknown") - || Build.MODEL.contains("google_sdk") - || Build.MODEL.contains("Emulator") - || Build.MODEL.contains("Android SDK built for x86") - || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) - || "google_sdk".equals(Build.PRODUCT) - || System.getProperty("ro.kernel.qemu") != null; - } - - /** - * Detect if we are in genymotion - */ - private boolean inGenymotion() { - return Build.MANUFACTURER.contains("Genymotion"); - } - -} |