Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
index e4dda2d44d30bc75380860dbd2ec25774ddf4a81..e868b8595f91092046a8db7985760f8f472b5381 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
@@ -1209,6 +1209,8 @@ void WebGLRenderingContextBase::initializeNewContext() { |
m_readBufferOfDefaultFramebuffer = GL_BACK; |
+ m_surfaceHandle = 0; |
+ |
m_defaultVertexArrayObject = WebGLVertexArrayObject::create( |
this, WebGLVertexArrayObjectBase::VaoTypeDefault); |
@@ -7658,6 +7660,35 @@ void WebGLRenderingContextBase::setBackDrawBuffer(GLenum buf) { |
m_backDrawBuffer = buf; |
} |
+void WebGLRenderingContextBase::setSurfaceHandle(int handle) { |
+ if (handle == m_surfaceHandle) |
+ return; |
+ |
+ if (isContextLost()) |
+ return; |
+ |
+ // LOG(INFO) << "klausw:WebGLRenderingContextBase::setSurfaceHandle(" << |
+ // handle << ") isBoundForDraw=" << DrawingBufferClientIsBoundForDraw(); |
+ m_surfaceHandle = handle; |
+ |
+ // Rebind to the drawing buffer first before releasing the surface, |
+ // but only if we're currently using the default framebuffer. If |
+ // we're drawing elsewhere, this will be rebound in a future |
+ // bindFramebuffer call at the appropriate time. |
+ if (drawingBuffer() && DrawingBufferClientIsBoundForDraw() && !handle) { |
+ drawingBuffer()->bind(GL_FRAMEBUFFER); |
+ } |
+ |
+ contextGL()->SetSurfaceHandleCHROMIUM(m_surfaceHandle); |
+ contextGL()->Flush(); |
+ contextGL()->Finish(); |
+ |
+ // Bind to the surface once it's set up. |
+ if (DrawingBufferClientIsBoundForDraw() && handle) { |
+ contextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); |
+ } |
+} |
+ |
void WebGLRenderingContextBase::setFramebuffer(GLenum target, |
WebGLFramebuffer* buffer) { |
if (buffer) |
@@ -7668,8 +7699,12 @@ void WebGLRenderingContextBase::setFramebuffer(GLenum target, |
applyStencilTest(); |
} |
if (!buffer) { |
- // Instead of binding fb 0, bind the drawing buffer. |
- drawingBuffer()->bind(target); |
+ if (m_surfaceHandle) { |
+ contextGL()->BindFramebuffer(target, 0); |
+ } else { |
+ // Instead of binding fb 0, bind the drawing buffer. |
+ drawingBuffer()->bind(target); |
+ } |
} else { |
contextGL()->BindFramebuffer(target, buffer->object()); |
} |