在Zenfone Deluxe 2上使用setEGLConfigChooser时,OpenGL应用程序崩溃

时间:2017-10-13 08:56:04

标签: android opengl-es opengl-es-2.0 glsurfaceview

我有一个使用GLSurfaceView进行渲染的Android应用程序。该应用程序适用于我们的所有设备,除了一个:我们的Zenfone Deluxe 2.在我的GLSurfaceView构造函数中我做

setEGLConfigChooser(
    8, 8, 8, 8, // rgba
    24,         // depth
    8);         // stencil

除了Zenfone Deluxe 2崩溃之外总是有效,给出了以下堆栈跟踪:

10-13 10:37:07.975 10066-10066/com.my.company.demo V/Monotype: SetAppTypeFace- try to flip, app = com.my.company.demo
10-13 10:37:07.975 10066-10066/com.my.company.demo V/Monotype:     Typeface getFontPathFlipFont - systemFont = default#default
10-13 10:37:08.045 10066-10066/com.my.company.demo W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
10-13 10:37:08.065 10066-10066/com.my.company.demo V/Monotype: SetAppTypeFace- try to flip, app = com.my.company.demo
10-13 10:37:08.065 10066-10066/com.my.company.demo V/Monotype:     Typeface getFontPathFlipFont - systemFont = default#default
10-13 10:37:08.335 10066-10107/com.my.company.demo D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
10-13 10:37:08.405 10066-10107/com.my.company.demo I/OpenGLRenderer: Initialized EGL, version 1.4
10-13 10:37:08.405 10066-10107/com.my.company.demo W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
10-13 10:37:08.415 10066-10105/com.my.company.demo E/AndroidRuntime: FATAL EXCEPTION: GLThread 1298
    Process: com.my.company.demo, PID: 10066
    java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG
        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1196)
        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1187)
        at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1037)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1404)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1243)

然后,我只是取消注释对setEGLConfigChooser的调用,然后应用程序运行正常。然后OpenGL为RGBA提供(8, 8, 8, 0),为深度缓冲提供24,为模板缓冲提供8。好的,那么我在setEGLConfigChooser中设置了这些值,但是应用程序仍然以相同的输出崩溃。

我不知道该怎么做或如何解决它。 setEGLConfigChooser州的documentation

  

安装一个配置选择器,它将选择至少包含指定的depthSize和stencilSize的配置,以及指定的redSize,greenSize,blueSize和alphaSize。

     

如果调用此方法,则必须在调用setRenderer(Renderer)之前调用它。

     

如果没有调用setEGLConfigChooser方法,那么默认情况下,视图将选择深度缓冲深度至少为16位的RGB_888曲面。

在这个问题上没有多大帮助。可能是什么问题?我非常希望能够以更通用的方式呼叫setEGLConfigChooser以定位所有设备。

更多设备信息:

Zenfone Deluxe 2是一款带有PowerVR Rogue G6430 GPU的x86设备。我已经下载并安装了最新的软件更新。

  • gl10.glGetString(GL10.GL_VENDOR);提供"Imagination Technologies"
  • gl10.glGetString(GL10.GL_RENDERER);提供"PowerVR Rogue G6430"
  • gl10.glGetString(GL10.GL_VERSION);提供"OpenGL ES 3.1 build 1.5@3830101"
  • gl10.glGetString(GL10.GL_EXTENSIONS);给出了

    GL_EXT_debug_marker
    GL_EXT_blend_minmax
    GL_EXT_color_buffer_float
    GL_EXT_copy_image
    GL_EXT_discard_framebuffer
    GL_EXT_draw_buffers
    GL_EXT_draw_buffers_indexed
    GL_EXT_geometry_shader
    GL_EXT_geometry_point_size
    GL_EXT_gpu_shader5
    GL_EXT_multi_draw_arrays
    GL_EXT_multisampled_render_to_texture
    GL_EXT_occlusion_query_boolean
    GL_EXT_primitive_bounding_box
    GL_EXT_pvrtc_sRGB
    GL_EXT_read_format_bgra
    GL_EXT_robustness
    GL_EXT_separate_shader_objects
    GL_EXT_shader_framebuffer_fetch
    GL_EXT_shader_io_blocks
    GL_EXT_shader_pixel_local_storage
    GL_EXT_shader_texture_lod
    GL_EXT_shadow_samplers
    GL_EXT_tessellation_shader
    GL_EXT_tessellation_point_size
    GL_EXT_texture_border_clamp
    GL_EXT_texture_buffer
    GL_EXT_texture_cube_map_array
    GL_EXT_texture_filter_anisotropic
    GL_EXT_texture_format_BGRA8888
    GL_EXT_texture_rg
    GL_EXT_texture_sRGB_decode
    GL_IMG_multisampled_render_to_texture
    GL_IMG_program_binary
    GL_IMG_read_format
    GL_IMG_shader_binary
    GL_IMG_texture_compression_pvrtc
    GL_IMG_texture_compression_pvrtc2
    GL_IMG_texture_format_BGRA8888
    GL_IMG_texture_npot
    GL_KHR_blend_equation_advanced
    GL_KHR_blend_equation_advanced_coherent
    GL_KHR_debug
    GL_OES_compressed_ETC1_RGB8_texture
    GL_OES_depth24
    GL_OES_depth_texture
    GL_OES_EGL_image
    GL_OES_EGL_image_external
    GL_OES_EGL_image_external_essl3
    GL_OES_EGL_sync
    GL_OES_element_index_uint
    GL_OES_fragment_precision_high
    GL_OES_draw_buffers_indexed
    GL_OES_get_program_binary
    GL_OES_mapbuffer
    GL_OES_packed_depth_stencil
    GL_OES_required_internalformat
    GL_OES_rgb8_rgba8
    GL_OES_sample_shading
    GL_OES_sample_variables
    GL_OES_shader_image_atomic
    GL_OES_shader_multisample_interpolation
    GL_OES_standard_derivatives
    GL_OES_surfaceless_context
    GL_OES_texture_float
    GL_OES_texture_half_float
    GL_OES_texture_npot
    GL_OES_texture_stencil8
    GL_OES_texture_storage_multisample_2d_array
    GL_OES_vertex_array_object
    GL_OES_vertex_half_float
    

2 个答案:

答案 0 :(得分:0)

如果你看一下好的旧MultisampleConfigChooser,深度只有16位,模板只有1.此外,在EGL 1.4 specification循环后,我没有找到关于最小值的任何陈述支持模板,深度和颜色缓冲区大小。

你可以尝试使用较低的数字,但如果你想选择最好的数字,你可能需要让它更复杂。

答案 1 :(得分:0)

崩溃的原因是因为我在 setEGLConfigChooser()之前致电setEGLContextClientVersion() 。删除崩溃后移动呼叫,它仍可在其他设备上运行。有关崩溃原因的更多信息,请参阅this答案。