1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/renderer_host/compositor_impl_android.h"
7 #include <android/native_window_jni.h>
10 #include "base/logging.h"
11 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
12 #include "content/browser/gpu/gpu_surface_tracker.h"
13 #include "content/browser/renderer_host/image_transport_factory_android.h"
14 #include "content/common/gpu/client/gpu_channel_host.h"
15 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
16 #include "content/common/gpu/gpu_process_launch_causes.h"
17 #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h"
18 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorSupport.h"
19 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutputSurface.h"
23 static bool g_initialized
= false;
25 // Adapts a pure WebGraphicsContext3D into a WebCompositorOutputSurface.
26 class WebGraphicsContextToOutputSurfaceAdapter
:
27 public WebKit::WebCompositorOutputSurface
{
29 explicit WebGraphicsContextToOutputSurfaceAdapter(
30 WebKit::WebGraphicsContext3D
* context
)
31 : m_context3D(context
)
36 virtual bool bindToClient(
37 WebKit::WebCompositorOutputSurfaceClient
* client
) OVERRIDE
40 if (!m_context3D
->makeContextCurrent())
46 virtual const Capabilities
& capabilities() const OVERRIDE
48 return m_capabilities
;
51 virtual WebKit::WebGraphicsContext3D
* context3D() const OVERRIDE
53 return m_context3D
.get();
56 virtual void sendFrameToParentCompositor(
57 const WebKit::WebCompositorFrame
&) OVERRIDE
62 scoped_ptr
<WebKit::WebGraphicsContext3D
> m_context3D
;
63 Capabilities m_capabilities
;
64 WebKit::WebCompositorOutputSurfaceClient
* m_client
;
67 } // anonymous namespace
72 Compositor
* Compositor::Create() {
73 return new CompositorImpl();
77 void Compositor::Initialize() {
79 WebKit::Platform::current()->compositorSupport()->initialize(NULL
);
83 bool CompositorImpl::IsInitialized() {
87 CompositorImpl::CompositorImpl()
91 WebKit::Platform::current()->compositorSupport()->createLayer());
94 CompositorImpl::~CompositorImpl() {
97 void CompositorImpl::OnSurfaceUpdated(
98 const SurfacePresentedCallback
& callback
) {
101 // TODO(sievers): Let RWHV do this
103 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
104 callback
.Run(sync_point
);
107 void CompositorImpl::SetRootLayer(WebKit::WebLayer
* root_layer
) {
108 root_layer_
->removeAllChildren();
109 root_layer_
->addChild(root_layer
);
112 void CompositorImpl::SetWindowSurface(ANativeWindow
* window
) {
113 GpuSurfaceTracker
* tracker
= GpuSurfaceTracker::Get();
116 tracker
->RemoveSurface(surface_id_
);
117 ANativeWindow_release(window_
);
125 ANativeWindow_acquire(window
);
126 surface_id_
= tracker
->AddSurfaceForNativeWidget(window
);
127 tracker
->SetSurfaceHandle(
129 gfx::GLSurfaceHandle(gfx::kDummyPluginWindow
, false));
131 WebKit::WebLayerTreeView::Settings settings
;
132 settings
.refreshRate
= 60.0;
133 WebKit::WebCompositorSupport
* compositor_support
=
134 WebKit::Platform::current()->compositorSupport();
136 compositor_support
->createLayerTreeView(this, *root_layer_
, settings
));
137 host_
->setVisible(true);
138 host_
->setSurfaceReady();
142 void CompositorImpl::SetWindowBounds(const gfx::Size
& size
) {
147 host_
->setViewportSize(size
);
148 root_layer_
->setBounds(size
);
151 void CompositorImpl::updateAnimations(double frameBeginTime
) {
154 void CompositorImpl::layout() {
157 void CompositorImpl::applyScrollAndScale(const WebKit::WebSize
& scrollDelta
,
161 WebKit::WebCompositorOutputSurface
* CompositorImpl::createOutputSurface() {
162 WebKit::WebGraphicsContext3D::Attributes attrs
;
163 attrs
.shareResources
= true;
164 GpuChannelHostFactory
* factory
= BrowserGpuChannelHostFactory::instance();
165 GURL
url("chrome://gpu/Compositor::createContext3D");
166 base::WeakPtr
<WebGraphicsContext3DSwapBuffersClient
> swap_client
;
167 scoped_ptr
<WebGraphicsContext3DCommandBufferImpl
> context(
168 new WebGraphicsContext3DCommandBufferImpl(
173 if (!context
->Initialize(
176 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE
)) {
177 LOG(ERROR
) << "Failed to create 3D context for compositor.";
181 return new WebGraphicsContextToOutputSurfaceAdapter(context
.release());
184 void CompositorImpl::didRecreateOutputSurface(bool success
) {
187 void CompositorImpl::didCommit() {
190 void CompositorImpl::didCommitAndDrawFrame() {
193 void CompositorImpl::didCompleteSwapBuffers() {
196 void CompositorImpl::scheduleComposite() {
199 } // namespace content