aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2016-12-15 09:35:19 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-15 15:32:01 +0000
commit625cd9e0c9379b45c7f3100677eefcf5e241d032 (patch)
tree3cfed5bc9f4644f1d1b33cc082a4d18f88ceaf67 /src
parent82c263f6e4452227334c349430f85ea662962a2b (diff)
Workaround freeze on Mac Chrome when checking read pixel config support.
Chromium may ask us to read back from locked IOSurfaces. Calling the command buffer's glGetIntegerv() with GL_IMPLEMENTATION_COLOR_READ_FORMAT/_TYPE causes the command buffer to make a call to check the framebuffer status which can hang the driver. So in Mac Chromium we always use a temporary surface to test for glReadPixels format/type support. BUG=chromium:662802 Change-Id: I034e24faf3d780b6243f95af66d03dd68e12633c Reviewed-on: https://skia-review.googlesource.com/6113 Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLGpu.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index bbbcf4c671..80c7f612a4 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -2309,6 +2309,16 @@ static bool read_pixels_pays_for_y_flip(GrSurfaceOrigin origin, const GrGLCaps&
}
bool GrGLGpu::readPixelsSupported(GrRenderTarget* target, GrPixelConfig readConfig) {
+#ifdef SK_BUILD_FOR_MAC
+ // Chromium may ask us to read back from locked IOSurfaces. Calling the command buffer's
+ // glGetIntegerv() with GL_IMPLEMENTATION_COLOR_READ_FORMAT/_TYPE causes the command buffer
+ // to make a call to check the framebuffer status which can hang the driver. So in Mac Chromium
+ // we always use a temporary surface to test for read pixels support.
+ // https://www.crbug.com/662802
+ if (this->glContext().driver() == kChromium_GrGLDriver) {
+ return this->readPixelsSupported(target->config(), readConfig);
+ }
+#endif
auto bindRenderTarget = [this, target]() -> bool {
this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkIRect::EmptyIRect());
return true;