Chromium Code Reviews| Index: content/browser/renderer_host/compositor_impl_android.cc |
| diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
| index 94ab1393c847f00e27463f931fdf3503a3250741..d57e7c0c8be80b359afdfa529c3881b83aa12990 100644 |
| --- a/content/browser/renderer_host/compositor_impl_android.cc |
| +++ b/content/browser/renderer_host/compositor_impl_android.cc |
| @@ -48,8 +48,9 @@ namespace { |
| // Used for drawing directly to the screen. Bypasses resizing and swaps. |
| class DirectOutputSurface : public cc::OutputSurface { |
| public: |
| - DirectOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) |
| - : cc::OutputSurface(context3d.Pass()) { |
| + DirectOutputSurface( |
| + const scoped_refptr<cc::ContextProvider>& context_provider) |
| + : cc::OutputSurface(context_provider) { |
| capabilities_.adjust_deadline_for_parent = false; |
| } |
| @@ -57,28 +58,31 @@ class DirectOutputSurface : public cc::OutputSurface { |
| surface_size_ = size; |
| } |
| virtual void SwapBuffers(cc::CompositorFrame*) OVERRIDE { |
| - context3d()->shallowFlushCHROMIUM(); |
| + context_provider_->Context3d()->shallowFlushCHROMIUM(); |
| } |
| }; |
| // Used to override capabilities_.adjust_deadline_for_parent to false |
| class OutputSurfaceWithoutParent : public cc::OutputSurface { |
| public: |
| - OutputSurfaceWithoutParent(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) |
| - : cc::OutputSurface(context3d.Pass()) { |
| + OutputSurfaceWithoutParent( |
| + const scoped_refptr<ContextProviderCommandBuffer>& context_provider) |
| + : cc::OutputSurface(context_provider), |
| + command_buffer_context_(context_provider->Context3d()) { |
| capabilities_.adjust_deadline_for_parent = false; |
| } |
| virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE { |
| - content::WebGraphicsContext3DCommandBufferImpl* command_buffer = |
| - static_cast<content::WebGraphicsContext3DCommandBufferImpl*>(context3d()); |
| content::CommandBufferProxyImpl* command_buffer_proxy = |
| - command_buffer->GetCommandBufferProxy(); |
| + command_buffer_context_->GetCommandBufferProxy(); |
| DCHECK(command_buffer_proxy); |
| command_buffer_proxy->SetLatencyInfo(frame->metadata.latency_info); |
| OutputSurface::SwapBuffers(frame); |
| } |
| + |
| + private: |
| + WebGraphicsContext3DCommandBufferImpl* command_buffer_context_; |
| }; |
| static bool g_initialized = false; |
| @@ -358,6 +362,46 @@ bool CompositorImpl::CopyTextureToBitmap(WebKit::WebGLId texture_id, |
| return true; |
| } |
| +static scoped_ptr<WebKit::WebGraphicsContext3D> CreateInProcessViewContext( |
| + const WebKit::WebGraphicsContext3D::Attributes attributes |
| + ANativeWindow* window) { |
| + using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl; |
| + return WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext( |
| + attributes, window).PassAs<WebKit::WebGraphicsContext3D>(); |
| +} |
| + |
| +static scoped_ptr<WebKit::WebGraphicsContext3D> CreateGpuProcessViewContext( |
| + const WebKit::WebGraphicsContext3D::Attributes attributes |
| + int surface_id) { |
| + GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); |
| + GURL url("chrome://gpu/Compositor::createContext3D"); |
| + scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
| + new WebGraphicsContext3DCommandBufferImpl(surface_id_, |
| + url, |
| + factory, |
| + weak_factory_.GetWeakPtr())); |
| + static const size_t kBytesPerPixel = 4; |
| + gfx::DeviceDisplayInfo display_info; |
| + size_t full_screen_texture_size_in_bytes = |
| + display_info.GetDisplayHeight() * |
| + display_info.GetDisplayWidth() * |
| + kBytesPerPixel; |
| + if (!context->Initialize( |
| + attrs, |
| + false, |
| + CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE, |
| + 64 * 1024, // command buffer size |
| + std::min(full_screen_texture_size_in_bytes, |
| + kDefaultStartTransferBufferSize), |
| + kDefaultMinTransferBufferSize, |
| + std::min(3 * full_screen_texture_size_in_bytes, |
| + kDefaultMaxTransferBufferSize))) { |
| + LOG(ERROR) << "Failed to create 3D context for compositor."; |
| + return scoped_ptr<WebKit::WebGraphicsContext3D>(); |
| + } |
| + return context.PassAs<WebKit::WebGraphicsContext3D>(); |
| +} |
| + |
| scoped_ptr<cc::OutputSurface> CompositorImpl::CreateOutputSurface( |
| bool fallback) { |
| WebKit::WebGraphicsContext3D::Attributes attrs; |
| @@ -365,47 +409,29 @@ scoped_ptr<cc::OutputSurface> CompositorImpl::CreateOutputSurface( |
| attrs.noAutomaticFlushes = true; |
| if (g_use_direct_gl) { |
| - scoped_ptr<WebKit::WebGraphicsContext3D> context( |
| - webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl:: |
| - CreateViewContext(attrs, window_)); |
| - if (!window_) { |
| - return scoped_ptr<cc::OutputSurface>( |
| - new DirectOutputSurface(context.Pass())); |
| - } |
| + scoped_refptr<webkit::gpu::ContextProviderInProcess> context_provider = |
| + webkit::gpu::ContextProviderInProcess::Create( |
| + base::Bind(&CreateInProcessViewContext, attrs, window_)); |
| + |
| + scoped_ptr<cc::OutputSurface> output_surface; |
| + if (!window_) |
| + output_surface.reset(new DirectOutputSurface(context_provider)); |
| + else |
| + output_surface.reset(new cc::OutputSurface(context_provider)); |
| + return output_surface.Pass(); |
| + } |
| - return make_scoped_ptr(new cc::OutputSurface(context.Pass())); |
| - } else { |
| - DCHECK(window_ && surface_id_); |
| - GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); |
| - GURL url("chrome://gpu/Compositor::createContext3D"); |
| - scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
| - new WebGraphicsContext3DCommandBufferImpl(surface_id_, |
| - url, |
| - factory, |
| - weak_factory_.GetWeakPtr())); |
| - static const size_t kBytesPerPixel = 4; |
| - gfx::DeviceDisplayInfo display_info; |
| - size_t full_screen_texture_size_in_bytes = |
| - display_info.GetDisplayHeight() * |
| - display_info.GetDisplayWidth() * |
| - kBytesPerPixel; |
| - if (!context->Initialize( |
| - attrs, |
| - false, |
| - CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE, |
| - 64 * 1024, // command buffer size |
| - std::min(full_screen_texture_size_in_bytes, |
| - kDefaultStartTransferBufferSize), |
| - kDefaultMinTransferBufferSize, |
| - std::min(3 * full_screen_texture_size_in_bytes, |
| - kDefaultMaxTransferBufferSize))) { |
| - LOG(ERROR) << "Failed to create 3D context for compositor."; |
| - return scoped_ptr<cc::OutputSurface>(); |
| - } |
| - return scoped_ptr<cc::OutputSurface>( |
| - new OutputSurfaceWithoutParent( |
| - context.PassAs<WebKit::WebGraphicsContext3D>())); |
| + DCHECK(window_ && surface_id_); |
|
aelias_OOO_until_Jul13
2013/08/14 21:44:10
nit: split into two DCHECKs
danakj
2013/08/14 21:46:07
Absolutely.
|
| + |
| + scoped_refptr<ContextProviderCommandBuffer> context_provider = |
| + ContextProviderCommandBuffer::Create( |
| + base::Bind(&CreateGpuProcessViewContext, attrs, surface_id_)); |
| + if (!context_provider.get()) { |
| + LOG(ERROR) << "Failed to create 3D context for compositor."; |
| + return scoped_ptr<cc::OutputSurface>(); |
| } |
| + return scoped_ptr<cc::OutputSurface>( |
| + new OutputSurfaceWithoutParent(context_provider)); |
| } |
| void CompositorImpl::OnLostResources() { |