aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl
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/gpu/gl
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/gpu/gl')
-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;