diff options
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 10 | ||||
-rw-r--r-- | gpu/config/gpu_driver_bug_list_json.cc | 18 | ||||
-rw-r--r-- | gpu/config/gpu_driver_bug_workaround_type.h | 2 | ||||
-rw-r--r-- | ui/gl/gl_fence_egl.cc | 20 | ||||
-rw-r--r-- | ui/gl/gl_fence_egl.h | 2 |
5 files changed, 48 insertions, 4 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 5706086..803b121 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -17,6 +17,10 @@ #include "ui/gl/gl_fence.h" #include "ui/gl/gl_implementation.h" +#if !defined(OS_MACOSX) +#include "ui/gl/gl_fence_egl.h" +#endif + namespace gpu { namespace gles2 { @@ -1020,6 +1024,12 @@ void FeatureInfo::InitializeFeatures() { texture_format_validators_[GL_RG_EXT].AddValue(GL_HALF_FLOAT_OES); } } + +#if !defined(OS_MACOSX) + if (workarounds_.ignore_egl_sync_failures) { + gfx::GLFenceEGL::SetIgnoreFailures(); + } +#endif } void FeatureInfo::AddExtensionString(const char* s) { diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc index 26be952..382bcba 100644 --- a/gpu/config/gpu_driver_bug_list_json.cc +++ b/gpu/config/gpu_driver_bug_list_json.cc @@ -19,7 +19,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST( { "name": "gpu driver bug list", // Please update the version number whenever you change this file. - "version": "7.14", + "version": "7.15", "entries": [ { "id": 1, @@ -1118,6 +1118,22 @@ LONG_STRING_CONST( "features": [ "use_non_zero_size_for_client_side_stream_buffers" ] + }, + { + "id": 99, + "description": "Qualcomm driver before Lollipop deletes egl sync objects after context destruction", + "cr_bugs": [453857], + "os": { + "type": "android", + "version": { + "op": "<", + "value": "5.0.0" + } + }, + "gl_vendor": "Qualcomm.*", + "features": [ + "ignore_egl_sync_failures" + ] } ] } diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h index 77d721b..f03b7a2 100644 --- a/gpu/config/gpu_driver_bug_workaround_type.h +++ b/gpu/config/gpu_driver_bug_workaround_type.h @@ -58,6 +58,8 @@ gl_begin_gl_end_on_fbo_change_to_backbuffer) \ GPU_OP(GL_CLEAR_BROKEN, \ gl_clear_broken) \ + GPU_OP(IGNORE_EGL_SYNC_FAILURES, \ + ignore_egl_sync_failures) \ GPU_OP(INIT_GL_POSITION_IN_VERTEX_SHADER, \ init_gl_position_in_vertex_shader) \ GPU_OP(INIT_TEXTURE_MAX_ANISOTROPY, \ diff --git a/ui/gl/gl_fence_egl.cc b/ui/gl/gl_fence_egl.cc index 277b631..74f0a01 100644 --- a/ui/gl/gl_fence_egl.cc +++ b/ui/gl/gl_fence_egl.cc @@ -9,6 +9,17 @@ namespace gfx { +namespace { + +bool g_ignore_egl_sync_failures = false; + +} // namespace + +// static +void GLFenceEGL::SetIgnoreFailures() { + g_ignore_egl_sync_failures = true; +} + GLFenceEGL::GLFenceEGL() { display_ = eglGetCurrentDisplay(); sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL); @@ -33,10 +44,12 @@ void GLFenceEGL::ClientWait() { EGLint flags = 0; EGLTimeKHR time = EGL_FOREVER_KHR; EGLint result = eglClientWaitSyncKHR(display_, sync_, flags, time); - DCHECK_NE(EGL_TIMEOUT_EXPIRED_KHR, result); + DCHECK_IMPLIES(!g_ignore_egl_sync_failures, + EGL_TIMEOUT_EXPIRED_KHR == result); if (result == EGL_FALSE) { - LOG(FATAL) << "Failed to wait for EGLSync. error:" + LOG(ERROR) << "Failed to wait for EGLSync. error:" << ui::GetLastEGLErrorString(); + CHECK(g_ignore_egl_sync_failures); } } @@ -47,8 +60,9 @@ void GLFenceEGL::ServerWait() { } EGLint flags = 0; if (eglWaitSyncKHR(display_, sync_, flags) == EGL_FALSE) { - LOG(FATAL) << "Failed to wait for EGLSync. error:" + LOG(ERROR) << "Failed to wait for EGLSync. error:" << ui::GetLastEGLErrorString(); + CHECK(g_ignore_egl_sync_failures); } } diff --git a/ui/gl/gl_fence_egl.h b/ui/gl/gl_fence_egl.h index 5c4defb..5b6006c 100644 --- a/ui/gl/gl_fence_egl.h +++ b/ui/gl/gl_fence_egl.h @@ -13,6 +13,8 @@ namespace gfx { class GL_EXPORT GLFenceEGL : public GLFence { public: + static void SetIgnoreFailures(); + GLFenceEGL(); ~GLFenceEGL() override; |