Chromium Code Reviews| Index: cc/output/output_surface.cc |
| diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc |
| index 1be41892a648a16d3ab2f6496bae61d0cc0d1f23..f78aaef460107014c9108e4528f79cb54e5e716c 100644 |
| --- a/cc/output/output_surface.cc |
| +++ b/cc/output/output_surface.cc |
| @@ -30,7 +30,9 @@ class OutputSurfaceCallbacks |
| public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback { |
| public: |
| explicit OutputSurfaceCallbacks(OutputSurfaceClient* client) |
| - : client_(client) {} |
| + : client_(client) { |
| + DCHECK(client_); |
| + } |
| // WK:WGC3D::WGSwapBuffersCompleteCallbackCHROMIUM implementation. |
| virtual void onSwapBuffersComplete() { client_->OnSwapBuffersComplete(); } |
| @@ -78,24 +80,60 @@ bool OutputSurface::ForcedDrawToSoftwareDevice() const { |
| bool OutputSurface::BindToClient( |
| cc::OutputSurfaceClient* client) { |
| DCHECK(client); |
| - if (context3d_ && !context3d_->makeContextCurrent()) |
| - return false; |
| client_ = client; |
| - if (!context3d_) |
| - return true; |
| - string extensions_string = UTF16ToASCII(context3d_->getString(GL_EXTENSIONS)); |
| + bool success = true; |
| + |
| + if (context3d_) { |
| + success = context3d_->makeContextCurrent(); |
| + if (success) |
| + SetContext3D(context3d_.Pass()); |
| + } |
| + |
| + if (!success) |
| + client_ = NULL; |
| + |
| + return success; |
| +} |
| + |
| +bool OutputSurface::InitializeAndSetContext3D( |
| + scoped_ptr<WebKit::WebGraphicsContext3D> context3d, |
| + scoped_refptr<ContextProvider> context_provider) { |
| + DCHECK(context3d); |
| + DCHECK(client_); |
| + |
| + scoped_ptr<OutputSurfaceCallbacks> original_callbacks = callbacks_.Pass(); |
| + scoped_ptr<WebKit::WebGraphicsContext3D> original_context3d = |
|
danakj
2013/06/07 14:26:09
mmm... so you already have a context3d, and now yo
boliu
2013/06/07 16:03:44
It should be null in webview, but I coded the unit
|
| + context3d_.Pass(); |
| + |
| + bool success = false; |
| + if (context3d->makeContextCurrent()) { |
| + SetContext3D(context3d.Pass()); |
| + if (client_->DeferredInitialize(context_provider)) |
| + success = true; |
| + } |
| + |
| + if (!success) |
| + SetContext3D(original_context3d.Pass()); |
| + |
| + return success; |
| +} |
| + |
| +void OutputSurface::SetContext3D( |
| + scoped_ptr<WebKit::WebGraphicsContext3D> context3d) { |
| + DCHECK(context3d); |
| + DCHECK(client_); |
| + |
| + string extensions_string = UTF16ToASCII(context3d->getString(GL_EXTENSIONS)); |
| vector<string> extensions_list; |
| base::SplitString(extensions_string, ' ', &extensions_list); |
| set<string> extensions(extensions_list.begin(), extensions_list.end()); |
| - |
| has_gl_discard_backbuffer_ = |
| extensions.count("GL_CHROMIUM_discard_backbuffer") > 0; |
| + context3d_ = context3d.Pass(); |
| callbacks_.reset(new OutputSurfaceCallbacks(client_)); |
| context3d_->setSwapBuffersCompleteCallbackCHROMIUM(callbacks_.get()); |
| context3d_->setContextLostCallback(callbacks_.get()); |
| - |
| - return true; |
| } |
| void OutputSurface::SendFrameToParentCompositor(CompositorFrame* frame) { |