|
| 1 | +package com.apkupdater.util.play |
| 2 | + |
| 3 | +import android.opengl.GLES10 |
| 4 | +import android.text.TextUtils |
| 5 | +import javax.microedition.khronos.egl.EGL10 |
| 6 | +import javax.microedition.khronos.egl.EGLConfig |
| 7 | +import javax.microedition.khronos.egl.EGLContext |
| 8 | +import javax.microedition.khronos.egl.EGLDisplay |
| 9 | + |
| 10 | + |
| 11 | +object EglExtensionProvider { |
| 12 | + @JvmStatic |
| 13 | + val eglExtensions: List<String> |
| 14 | + get() { |
| 15 | + val glExtensions: MutableSet<String> = HashSet() |
| 16 | + val egl10 = EGLContext.getEGL() as EGL10 |
| 17 | + val display = egl10.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY) |
| 18 | + egl10.eglInitialize(display, IntArray(2)) |
| 19 | + val cf = IntArray(1) |
| 20 | + if (egl10.eglGetConfigs(display, null, 0, cf)) { |
| 21 | + val configs = arrayOfNulls<EGLConfig>(cf[0]) |
| 22 | + if (egl10.eglGetConfigs(display, configs, cf[0], cf)) { |
| 23 | + val a1 = intArrayOf(EGL10.EGL_WIDTH, EGL10.EGL_PBUFFER_BIT, EGL10.EGL_HEIGHT, EGL10.EGL_PBUFFER_BIT, EGL10.EGL_NONE) |
| 24 | + val a2 = intArrayOf(12440, EGL10.EGL_PIXMAP_BIT, EGL10.EGL_NONE) |
| 25 | + val a3 = IntArray(1) |
| 26 | + for (i in 0 until cf[0]) { |
| 27 | + egl10.eglGetConfigAttrib(display, configs[i], EGL10.EGL_CONFIG_CAVEAT, a3) |
| 28 | + if (a3[0] != EGL10.EGL_SLOW_CONFIG) { |
| 29 | + egl10.eglGetConfigAttrib(display, configs[i], EGL10.EGL_SURFACE_TYPE, a3) |
| 30 | + if (1 and a3[0] != 0) { |
| 31 | + egl10.eglGetConfigAttrib(display, configs[i], EGL10.EGL_RENDERABLE_TYPE, a3) |
| 32 | + if (1 and a3[0] != 0) { |
| 33 | + addExtensionsForConfig(egl10, display, configs[i], a1, null, glExtensions) |
| 34 | + } |
| 35 | + if (4 and a3[0] != 0) { |
| 36 | + addExtensionsForConfig(egl10, display, configs[i], a1, a2, glExtensions) |
| 37 | + } |
| 38 | + } |
| 39 | + } |
| 40 | + } |
| 41 | + } |
| 42 | + } |
| 43 | + egl10.eglTerminate(display) |
| 44 | + return ArrayList(glExtensions).sorted() |
| 45 | + } |
| 46 | + |
| 47 | + private fun addExtensionsForConfig( |
| 48 | + egl10: EGL10, |
| 49 | + eglDisplay: EGLDisplay, |
| 50 | + eglConfig: EGLConfig?, |
| 51 | + ai: IntArray, |
| 52 | + ai1: IntArray?, |
| 53 | + set: MutableSet<String> |
| 54 | + ) { |
| 55 | + val eglContext = egl10.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, ai1) |
| 56 | + if (eglContext === EGL10.EGL_NO_CONTEXT) { |
| 57 | + return |
| 58 | + } |
| 59 | + val eglSurface = egl10.eglCreatePbufferSurface(eglDisplay, eglConfig, ai) |
| 60 | + if (eglSurface === EGL10.EGL_NO_SURFACE) { |
| 61 | + egl10.eglDestroyContext(eglDisplay, eglContext) |
| 62 | + } else { |
| 63 | + egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) |
| 64 | + val s = GLES10.glGetString(7939) |
| 65 | + if (!TextUtils.isEmpty(s)) { |
| 66 | + val split = s.split(" ".toRegex()).toTypedArray() |
| 67 | + val i = split.size |
| 68 | + set.addAll(listOf(*split).subList(0, i)) |
| 69 | + } |
| 70 | + egl10.eglMakeCurrent( |
| 71 | + eglDisplay, |
| 72 | + EGL10.EGL_NO_SURFACE, |
| 73 | + EGL10.EGL_NO_SURFACE, |
| 74 | + EGL10.EGL_NO_CONTEXT |
| 75 | + ) |
| 76 | + egl10.eglDestroySurface(eglDisplay, eglSurface) |
| 77 | + egl10.eglDestroyContext(eglDisplay, eglContext) |
| 78 | + } |
| 79 | + } |
| 80 | +} |
0 commit comments