Index: ui/gl/gl_surface_egl.cc |
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc |
index 694129de07e26d2bfc4563fe8c2193ee395cf34f..9fb5082ebcf33221d19fc2785222294c8de13141 100644 |
--- a/ui/gl/gl_surface_egl.cc |
+++ b/ui/gl/gl_surface_egl.cc |
@@ -638,6 +638,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) |
@@ -730,6 +731,11 @@ bool NativeViewGLSurfaceEGL::Initialize( |
supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE; |
} |
+ supports_swap_buffer_with_damage_ = |
+ 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) |
@@ -869,6 +875,10 @@ EGLSurface NativeViewGLSurfaceEGL::GetHandle() { |
return surface_; |
} |
+bool NativeViewGLSurfaceEGL::SupportsSwapBuffersWithDamage() { |
+ return supports_swap_buffer_with_damage_; |
+} |
+ |
bool NativeViewGLSurfaceEGL::SupportsPostSubBuffer() { |
return supports_post_sub_buffer_; |
} |
@@ -881,6 +891,32 @@ bool NativeViewGLSurfaceEGL::BuffersFlipped() const { |
return g_use_direct_composition; |
} |
+gfx::SwapResult NativeViewGLSurfaceEGL::SwapBuffersWithDamage(int x, |
+ int y, |
+ int width, |
+ int height) { |
+ DCHECK(supports_swap_buffer_with_damage_); |
+ UpdateSwapInterval(); |
+ if (!CommitAndClearPendingOverlays()) { |
+ DVLOG(1) << "Failed to commit pending overlay planes."; |
+ return gfx::SwapResult::SWAP_FAILED; |
+ } |
+ if (flips_vertically_) { |
+ // With EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE the contents are rendered |
+ // inverted, but the damage rectangle is still measured from the |
+ // bottom left. |
+ y = GetSize().height() - y - height; |
+ } |
+ |
+ 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; |
+} |
+ |
gfx::SwapResult NativeViewGLSurfaceEGL::PostSubBuffer(int x, |
int y, |
int width, |