Add workaround to ignore egl sync errors on qc (issue 892323002 by boliu@chromium.org)

49 views
Skip to first unread message

bo...@chromium.org

unread,
Feb 2, 2015, 5:27:44 PM2/2/15
to sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com
Reviewers: sievers,

Message:
ptal

this depends on https://codereview.chromium.org/898543002/

Description:
Add workaround to ignore EGL sync errors on qc

On android versions before 5.0, EGL sync objects are
incorrectly destroyed when the associated EGL context is
destroyed. The EGL sync objects error handling is tight to
prevent driver regressions from known issues. This combined
with this triggers DCHECk failures and crashes.

So add another workaround to ignore errors from EGL sync
object calls.

BUG=453857

Please review this at https://codereview.chromium.org/892323002/

Base URL: https://chromium.googlesource.com/chromium/src.git@master

Affected files (+42, -3 lines):
M gpu/command_buffer/service/feature_info.cc
M gpu/config/gpu_driver_bug_list_json.cc
M gpu/config/gpu_driver_bug_workaround_type.h
M ui/gl/gl_fence_egl.h
M ui/gl/gl_fence_egl.cc


Index: gpu/command_buffer/service/feature_info.cc
diff --git a/gpu/command_buffer/service/feature_info.cc
b/gpu/command_buffer/service/feature_info.cc
index
570608645d1e71b1acd38b3ac3b7d323bf3934bb..5aeecba5a7923b131de085bc664116d78c585d1e
100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -15,6 +15,7 @@
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/command_buffer/service/gpu_switches.h"
#include "ui/gl/gl_fence.h"
+#include "ui/gl/gl_fence_egl.h"
#include "ui/gl/gl_implementation.h"

namespace gpu {
@@ -1020,6 +1021,10 @@ void FeatureInfo::InitializeFeatures() {
texture_format_validators_[GL_RG_EXT].AddValue(GL_HALF_FLOAT_OES);
}
}
+
+ if (workarounds_.ignore_egl_sync_failures) {
+ gfx::GLFenceEGL::SetIgnoreFailures();
+ }
}

void FeatureInfo::AddExtensionString(const char* s) {
Index: gpu/config/gpu_driver_bug_list_json.cc
diff --git a/gpu/config/gpu_driver_bug_list_json.cc
b/gpu/config/gpu_driver_bug_list_json.cc
index
26be95284680f5600e6dfa263c066857ab233624..626f42e6fb8bc65efaeb5f01d003919179b539c0
100644
--- a/gpu/config/gpu_driver_bug_list_json.cc
+++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -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"
+ ]
}
]
}
Index: gpu/config/gpu_driver_bug_workaround_type.h
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h
b/gpu/config/gpu_driver_bug_workaround_type.h
index
77d721b9384a5b22cf2af5f567512b50ab782c28..f03b7a226ea95489a532dcb2bcfffa58df073cb1
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, \
Index: ui/gl/gl_fence_egl.cc
diff --git a/ui/gl/gl_fence_egl.cc b/ui/gl/gl_fence_egl.cc
index
277b631fff8c4cb073a11cbdc04be72a40369eb2..74f0a0171b6907a7b2943328af25e2360826070f
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);
}
}

Index: ui/gl/gl_fence_egl.h
diff --git a/ui/gl/gl_fence_egl.h b/ui/gl/gl_fence_egl.h
index
5c4defb2699987f4f64fac377af6f0e7971cd25e..5b6006c19721c556f6498329a9404c2671cc9661
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;



sie...@chromium.org

unread,
Feb 4, 2015, 3:11:22 PM2/4/15
to bo...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com

bo...@chromium.org

unread,
Feb 4, 2015, 4:30:32 PM2/4/15
to sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com
On 2015/02/04 20:11:21, sievers wrote:
> bump version

Oops, done.

https://codereview.chromium.org/892323002/

commi...@chromium.org

unread,
Feb 4, 2015, 4:31:50 PM2/4/15
to bo...@chromium.org, sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com

commi...@chromium.org

unread,
Feb 4, 2015, 5:20:35 PM2/4/15
to bo...@chromium.org, sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com

bo...@chromium.org

unread,
Feb 4, 2015, 5:23:51 PM2/4/15
to sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com

commi...@chromium.org

unread,
Feb 4, 2015, 5:29:23 PM2/4/15
to bo...@chromium.org, sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com

commi...@chromium.org

unread,
Feb 4, 2015, 6:42:00 PM2/4/15
to bo...@chromium.org, sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com
Committed patchset #3 (id:40001)

https://codereview.chromium.org/892323002/

commi...@chromium.org

unread,
Feb 4, 2015, 6:43:32 PM2/4/15
to bo...@chromium.org, sie...@chromium.org, chromium...@chromium.org, piman...@chromium.org, ozone-...@chromium.org, kalyan.k...@intel.com
Patchset 3 (id:??) landed as
https://crrev.com/0599e81b61d2ab266a68dcce9d2b3c27e275f879
Cr-Commit-Position: refs/heads/master@{#314678}

https://codereview.chromium.org/892323002/
Reply all
Reply to author
Forward
0 new messages