smarter gl config selection

This commit is contained in:
Chloe committed 2025-01-20 15:19:05 -07:00
1 parent 6991598fcb
commit bd502b56c2
1 file changed
+80 -19
@@ -5,6 +5,7 @@ import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.opengl.GLSurfaceView
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
@@ -39,6 +40,9 @@ import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
import javax.microedition.khronos.egl.EGL10
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.egl.EGLDisplay
enum class DisplayMode { enum class DisplayMode {
DEFAULT, LIMITED, FULLSCREEN; DEFAULT, LIMITED, FULLSCREEN;
@@ -61,7 +65,6 @@ fun ratioForPreference(value: String) = when (value) {
class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperListener, GeodeUtils.CapabilityListener { class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperListener, GeodeUtils.CapabilityListener {
private var mGLSurfaceView: Cocos2dxGLSurfaceView? = null private var mGLSurfaceView: Cocos2dxGLSurfaceView? = null
private val sTag = GeometryDashActivity::class.simpleName
private var mIsRunning = false private var mIsRunning = false
private var mIsOnPause = false private var mIsOnPause = false
private var mHasWindowFocus = false private var mHasWindowFocus = false
@@ -419,11 +422,7 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
} }
glSurfaceView.setEGLContextClientVersion(2) glSurfaceView.setEGLContextClientVersion(2)
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8) glSurfaceView.setEGLConfigChooser(EGLConfigChooser())
if (isAndroidEmulator()) {
glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0)
}
glSurfaceView.initView() glSurfaceView.initView()
@@ -567,18 +566,6 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
TODO("Not yet implemented") TODO("Not yet implemented")
} }
private fun isAndroidEmulator(): Boolean {
Log.d(sTag, "model=" + Build.MODEL)
val product = Build.PRODUCT
Log.d(sTag, "product=$product")
var isEmulator = false
if (product != null) {
isEmulator = product == "sdk" || product.contains("_sdk") || product.contains("sdk_")
}
Log.d(sTag, "isEmulator=$isEmulator")
return isEmulator
}
override fun onCapabilityAdded(capability: String): Boolean { override fun onCapabilityAdded(capability: String): Boolean {
return when (capability) { return when (capability) {
GeodeUtils.CAPABILITY_EXTENDED_INPUT -> { GeodeUtils.CAPABILITY_EXTENDED_INPUT -> {
@@ -602,7 +589,7 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
val modListing = try { val modListing = try {
assets.list(internalModBase) assets.list(internalModBase)
} catch (ioe: IOException) { } catch (_: IOException) {
emptyArray<String>() emptyArray<String>()
} }
@@ -624,4 +611,78 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
} }
} }
} }
class EGLConfigChooser : GLSurfaceView.EGLConfigChooser {
// this comes from EGL14, but is unavailable on EGL10
// also EGL14 is incompatible with EGL10. so whatever
private var EGL_OPENGL_ES2_BIT: Int = 0x04
private data class ConfigValues(
val redSize: Int,
val greenSize: Int,
val blueSize: Int,
val alphaSize: Int,
val depthSize: Int,
val stencilSize: Int,
)
private fun getAttribValue(egl: EGL10, display: EGLDisplay, config: EGLConfig, attrib: Int): Int {
val value = IntArray(1)
egl.eglGetConfigAttrib(display, config, attrib, value)
return value[0]
}
private fun testConfig(egl: EGL10, display: EGLDisplay, attrib: ConfigValues): EGLConfig? {
val attribList = intArrayOf(
EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL10.EGL_RED_SIZE, attrib.redSize,
EGL10.EGL_GREEN_SIZE, attrib.greenSize,
EGL10.EGL_BLUE_SIZE, attrib.blueSize,
EGL10.EGL_ALPHA_SIZE, attrib.alphaSize,
EGL10.EGL_DEPTH_SIZE, attrib.depthSize,
EGL10.EGL_STENCIL_SIZE, attrib.stencilSize,
EGL10.EGL_NONE
)
val configs = arrayOfNulls<EGLConfig>(1)
val numConfigs = IntArray(1)
val res = egl.eglChooseConfig(display, attribList, configs, configs.size, numConfigs)
if (res && numConfigs[0] > 0 && configs[0] != null) {
return configs[0]
}
return null
}
private fun printConfig(egl: EGL10, display: EGLDisplay, config: EGLConfig) {
val id = getAttribValue(egl, display, config, EGL10.EGL_CONFIG_ID)
val red = getAttribValue(egl, display, config, EGL10.EGL_RED_SIZE)
val green = getAttribValue(egl, display, config, EGL10.EGL_GREEN_SIZE)
val blue = getAttribValue(egl, display, config, EGL10.EGL_BLUE_SIZE)
val alpha = getAttribValue(egl, display, config, EGL10.EGL_ALPHA_SIZE)
val depth = getAttribValue(egl, display, config, EGL10.EGL_DEPTH_SIZE)
val stencil = getAttribValue(egl, display, config, EGL10.EGL_STENCIL_SIZE)
println("EGLConfig $id: (red = $red, green = $green, blue = $blue, alpha = $alpha, depth = $depth, stencil = $stencil)")
}
override fun chooseConfig(egl: EGL10, display: EGLDisplay): EGLConfig {
val configs = listOf(
ConfigValues(8, 8, 8, 8, 16, 8),
ConfigValues(8, 8, 8, 0, 16, 8),
ConfigValues(5, 6, 5, 0, 16, 8),
ConfigValues(0, 0, 0, 0, 0, 0),
)
return configs.firstNotNullOf {
val config = testConfig(egl, display, it)
if (config != null) {
printConfig(egl, display, config)
}
config
}
}
}
} }