Chromium Code Reviews| Index: ui/gl/gl_surface_egl.cc |
| diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc |
| index 27bde64f6e28411f18fa7fbfc93abad010c33d04..70e59e7871d4ef2b5d18ba5b339149fe6d4ce3c8 100644 |
| --- a/ui/gl/gl_surface_egl.cc |
| +++ b/ui/gl/gl_surface_egl.cc |
| @@ -629,6 +629,7 @@ NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window) |
| enable_fixed_size_angle_(false), |
| surface_(NULL), |
| supports_post_sub_buffer_(false), |
| + supports_swap_buffer_with_damage_(false), |
| flips_vertically_(false), |
| swap_interval_(1) { |
| #if defined(OS_ANDROID) |
| @@ -721,6 +722,11 @@ bool NativeViewGLSurfaceEGL::Initialize( |
| supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE; |
| } |
| + supports_swap_buffer_with_damage_ = |
| + gfx::g_driver_egl.ext.b_EGL_KHR_swap_buffers_with_damage && |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableSwapBuffersWithDamage); |
| + |
| if (sync_provider) |
| vsync_provider_.reset(sync_provider.release()); |
| else if (g_egl_sync_control_supported) |
| @@ -861,7 +867,7 @@ EGLSurface NativeViewGLSurfaceEGL::GetHandle() { |
| } |
| bool NativeViewGLSurfaceEGL::SupportsPostSubBuffer() { |
| - return supports_post_sub_buffer_; |
| + return supports_post_sub_buffer_ || supports_swap_buffer_with_damage_; |
| } |
| bool NativeViewGLSurfaceEGL::FlipsVertically() const { |
| @@ -876,7 +882,7 @@ gfx::SwapResult NativeViewGLSurfaceEGL::PostSubBuffer(int x, |
| int y, |
| int width, |
| int height) { |
| - DCHECK(supports_post_sub_buffer_); |
| + DCHECK(supports_post_sub_buffer_ || supports_swap_buffer_with_damage_); |
|
piman
2016/09/02 18:25:47
Well, the semantics of eglPostSubBufferNV and of e
halliwell
2016/09/07 03:17:07
And yes, I understood the difference between this
|
| UpdateSwapInterval(); |
| if (!CommitAndClearPendingOverlays()) { |
| DVLOG(1) << "Failed to commit pending overlay planes."; |
| @@ -888,10 +894,20 @@ gfx::SwapResult NativeViewGLSurfaceEGL::PostSubBuffer(int x, |
| // bottom left. |
| y = GetSize().height() - y - height; |
| } |
| - if (!eglPostSubBufferNV(GetDisplay(), surface_, x, y, width, height)) { |
| - DVLOG(1) << "eglPostSubBufferNV failed with error " |
| - << GetLastEGLErrorString(); |
| - return gfx::SwapResult::SWAP_FAILED; |
| + |
| + if (supports_post_sub_buffer_) { |
| + if (!eglPostSubBufferNV(GetDisplay(), surface_, x, y, width, height)) { |
| + DVLOG(1) << "eglPostSubBufferNV failed with error " |
| + << GetLastEGLErrorString(); |
| + return gfx::SwapResult::SWAP_FAILED; |
| + } |
| + } else { |
| + EGLint damage_rect[4] = {x, y, width, height}; |
| + if (!eglSwapBuffersWithDamageKHR(GetDisplay(), surface_, damage_rect, 1)) { |
| + DVLOG(1) << "eglSwapBuffersWithDamageKHR failed with error " |
| + << GetLastEGLErrorString(); |
| + return gfx::SwapResult::SWAP_FAILED; |
| + } |
| } |
| return gfx::SwapResult::SWAP_ACK; |
| } |