0x3009
android
runtime_error
ai_generated
partial
E/EGL_emulation: tid XXXX: eglSurfaceAttrib(1234): error 0x3009 (EGL_BAD_MATCH)
ID: android/surfaceview-out-of-order-egl
80%Fix Rate
83%Confidence
1Evidence
2023-05-12First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Android 10 (API 29) | active | — | — | — |
| Android 11 (API 30) | active | — | — | — |
| Android 12 (API 31) | active | — | — | — |
| Android Emulator 31.0.0 | active | — | — | — |
Root Cause
An EGL surface operation (like eglSurfaceAttrib) is called on a surface that is not properly initialized or has been destroyed, often due to threading issues in SurfaceView or TextureView rendering.
generic中文
在未正确初始化或已销毁的表面上调用 EGL 表面操作(如 eglSurfaceAttrib),通常是由于 SurfaceView 或 TextureView 渲染中的线程问题。
Official Documentation
https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglSurfaceAttrib.xhtmlWorkarounds
-
85% success Ensure that all EGL operations are performed on the same thread that created the EGL surface, typically the rendering thread. Use a Handler or GLSurfaceView.Renderer to synchronize.
Ensure that all EGL operations are performed on the same thread that created the EGL surface, typically the rendering thread. Use a Handler or GLSurfaceView.Renderer to synchronize.
-
80% success Check that the surface has been created before calling eglSurfaceAttrib. In SurfaceView, override surfaceCreated() and set a flag; only call EGL operations after the flag is set.
Check that the surface has been created before calling eglSurfaceAttrib. In SurfaceView, override surfaceCreated() and set a flag; only call EGL operations after the flag is set.
-
70% success If using the Android Emulator, try updating the emulator to the latest version or switch to a different graphics backend (e.g., SwiftShader instead of ANGLE).
If using the Android Emulator, try updating the emulator to the latest version or switch to a different graphics backend (e.g., SwiftShader instead of ANGLE).
中文步骤
确保所有 EGL 操作在与创建 EGL 表面的同一线程上执行,通常是渲染线程。使用 Handler 或 GLSurfaceView.Renderer 进行同步。
在调用 eglSurfaceAttrib 之前检查表面是否已创建。在 SurfaceView 中,重写 surfaceCreated() 并设置标志;仅在标志设置后才调用 EGL 操作。
如果使用 Android 模拟器,尝试更新模拟器到最新版本,或切换到不同的图形后端(例如使用 SwiftShader 代替 ANGLE)。
Dead Ends
Common approaches that don't work:
-
70% fail
The error can cause rendering artifacts or crashes on other devices or under specific conditions, and it may indicate a latent bug.
-
95% fail
This does not address the underlying surface state mismatch and may cause undefined behavior.