Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 11428091: Migrate the Android compositor to cc::Layer classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "cc/font_atlas.h"
15 #include "cc/input_handler.h"
16 #include "cc/layer.h"
17 #include "cc/layer_tree_host.h"
18 #include "cc/thread_impl.h"
14 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" 19 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
15 #include "content/browser/gpu/gpu_surface_tracker.h" 20 #include "content/browser/gpu/gpu_surface_tracker.h"
16 #include "content/browser/renderer_host/image_transport_factory_android.h" 21 #include "content/browser/renderer_host/image_transport_factory_android.h"
17 #include "content/common/gpu/client/gl_helper.h" 22 #include "content/common/gpu/client/gl_helper.h"
18 #include "content/common/gpu/client/gpu_channel_host.h" 23 #include "content/common/gpu/client/gpu_channel_host.h"
19 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 24 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
20 #include "content/common/gpu/gpu_process_launch_causes.h" 25 #include "content/common/gpu/gpu_process_launch_causes.h"
21 #include "content/public/common/content_switches.h" 26 #include "content/public/common/content_switches.h"
22 #include "third_party/khronos/GLES2/gl2.h" 27 #include "third_party/khronos/GLES2/gl2.h"
23 #include "third_party/khronos/GLES2/gl2ext.h" 28 #include "third_party/khronos/GLES2/gl2ext.h"
24 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutput Surface.h" 29 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutput Surface.h"
25 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h" 30 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h"
26 #include "third_party/WebKit/Source/Platform/chromium/public/WebSolidColorLayer. h"
27 #include "ui/gfx/android/java_bitmap.h" 31 #include "ui/gfx/android/java_bitmap.h"
28 #include "webkit/compositor_bindings/web_compositor_support_impl.h"
29 #include "webkit/glue/webthread_impl.h" 32 #include "webkit/glue/webthread_impl.h"
30 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" 33 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h"
31 34
32 using webkit::WebCompositorSupportImpl;
33
34 namespace gfx { 35 namespace gfx {
35 class JavaBitmap; 36 class JavaBitmap;
36 } 37 }
37 38
38 namespace { 39 namespace {
39 40
40 static bool g_initialized = false; 41 static bool g_initialized = false;
41 static base::LazyInstance<WebCompositorSupportImpl> g_compositor_support = 42 static webkit_glue::WebThreadImpl* g_impl_thread = NULL;
42 LAZY_INSTANCE_INITIALIZER;
43 static WebKit::WebThread* g_impl_thread = NULL;
44 static bool g_use_direct_gl = false; 43 static bool g_use_direct_gl = false;
45 44
46 // Adapts a pure WebGraphicsContext3D into a WebCompositorOutputSurface. 45 // Adapts a pure WebGraphicsContext3D into a WebCompositorOutputSurface.
47 class WebGraphicsContextToOutputSurfaceAdapter : 46 class WebGraphicsContextToOutputSurfaceAdapter :
48 public WebKit::WebCompositorOutputSurface { 47 public WebKit::WebCompositorOutputSurface {
49 public: 48 public:
50 explicit WebGraphicsContextToOutputSurfaceAdapter( 49 explicit WebGraphicsContextToOutputSurfaceAdapter(
51 WebKit::WebGraphicsContext3D* context) 50 WebKit::WebGraphicsContext3D* context)
52 : m_context3D(context) 51 : m_context3D(context)
53 , m_client(0) 52 , m_client(0)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 namespace content { 89 namespace content {
91 90
92 // static 91 // static
93 Compositor* Compositor::Create(Client* client) { 92 Compositor* Compositor::Create(Client* client) {
94 return client ? new CompositorImpl(client) : NULL; 93 return client ? new CompositorImpl(client) : NULL;
95 } 94 }
96 95
97 // static 96 // static
98 void Compositor::Initialize() { 97 void Compositor::Initialize() {
99 DCHECK(!CompositorImpl::IsInitialized()); 98 DCHECK(!CompositorImpl::IsInitialized());
100 g_compositor_support.Get().initialize(g_impl_thread);
101 g_initialized = true; 99 g_initialized = true;
102 } 100 }
103 101
104 // static 102 // static
105 void Compositor::InitializeWithFlags(uint32 flags) { 103 void Compositor::InitializeWithFlags(uint32 flags) {
106 g_use_direct_gl = flags & DIRECT_CONTEXT_ON_DRAW_THREAD; 104 g_use_direct_gl = flags & DIRECT_CONTEXT_ON_DRAW_THREAD;
107 if (flags & ENABLE_COMPOSITOR_THREAD) 105 if (flags & ENABLE_COMPOSITOR_THREAD) {
106 TRACE_EVENT_INSTANT0("test_gpu", "ThreadedCompositingInitialization");
108 g_impl_thread = new webkit_glue::WebThreadImpl("Browser Compositor"); 107 g_impl_thread = new webkit_glue::WebThreadImpl("Browser Compositor");
108 }
109 Compositor::Initialize(); 109 Compositor::Initialize();
110 } 110 }
111 111
112 // static 112 // static
113 WebCompositorSupportImpl* CompositorImpl::CompositorSupport() {
114 DCHECK(g_initialized);
115 return g_compositor_support.Pointer();
116 }
117
118 // static
119 bool CompositorImpl::IsInitialized() { 113 bool CompositorImpl::IsInitialized() {
120 return g_initialized; 114 return g_initialized;
121 } 115 }
122 116
123 // static 117 // static
118 bool CompositorImpl::IsThreadingEnabled() {
119 return g_impl_thread;
120 }
121
122 // static
124 bool CompositorImpl::UsesDirectGL() { 123 bool CompositorImpl::UsesDirectGL() {
125 return g_use_direct_gl; 124 return g_use_direct_gl;
126 } 125 }
127 126
128 CompositorImpl::CompositorImpl(Compositor::Client* client) 127 CompositorImpl::CompositorImpl(Compositor::Client* client)
129 : window_(NULL), 128 : root_layer_(cc::Layer::create()),
129 window_(NULL),
130 surface_id_(0), 130 surface_id_(0),
131 client_(client), 131 client_(client),
132 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 132 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
133 DCHECK(client); 133 DCHECK(client);
134 root_layer_.reset(g_compositor_support.Get().createLayer());
135 } 134 }
136 135
137 CompositorImpl::~CompositorImpl() { 136 CompositorImpl::~CompositorImpl() {
138 } 137 }
139 138
140 void CompositorImpl::Composite() { 139 void CompositorImpl::Composite() {
141 if (host_.get()) 140 if (host_.get())
142 host_->composite(); 141 host_->composite();
143 } 142 }
144 143
145 void CompositorImpl::SetRootLayer(WebKit::WebLayer* root_layer) { 144 void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) {
146 root_layer_->removeAllChildren(); 145 root_layer_->removeAllChildren();
147 root_layer_->addChild(root_layer); 146 root_layer_->addChild(root_layer);
148 } 147 }
149 148
150 void CompositorImpl::SetWindowSurface(ANativeWindow* window) { 149 void CompositorImpl::SetWindowSurface(ANativeWindow* window) {
151 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); 150 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get();
152 151
153 if (window_) { 152 if (window_) {
154 tracker->RemoveSurface(surface_id_); 153 tracker->RemoveSurface(surface_id_);
155 ANativeWindow_release(window_); 154 ANativeWindow_release(window_);
(...skipping 10 matching lines...) Expand all
166 surface_id_, 165 surface_id_,
167 gfx::GLSurfaceHandle(gfx::kDummyPluginWindow, false)); 166 gfx::GLSurfaceHandle(gfx::kDummyPluginWindow, false));
168 SetVisible(true); 167 SetVisible(true);
169 } 168 }
170 } 169 }
171 170
172 void CompositorImpl::SetVisible(bool visible) { 171 void CompositorImpl::SetVisible(bool visible) {
173 if (!visible) { 172 if (!visible) {
174 host_.reset(); 173 host_.reset();
175 } else if (!host_.get()) { 174 } else if (!host_.get()) {
176 WebKit::WebLayerTreeView::Settings settings; 175 cc::LayerTreeSettings settings;
177 settings.refreshRate = 60.0; 176 settings.refreshRate = 60.0;
178 host_.reset(g_compositor_support.Get().createLayerTreeView( 177
179 this, *root_layer_, settings)); 178 scoped_ptr<cc::Thread> impl_thread;
179 if (g_impl_thread)
180 impl_thread = cc::ThreadImpl::createForDifferentThread(
181 g_impl_thread->message_loop()->message_loop_proxy());
182
183 host_ = cc::LayerTreeHost::create(this, settings, impl_thread.Pass());
184 host_->setRootLayer(root_layer_);
185
180 host_->setVisible(true); 186 host_->setVisible(true);
181 host_->setSurfaceReady(); 187 host_->setSurfaceReady();
182 host_->setViewportSize(size_); 188 host_->setViewportSize(size_, size_);
183 } 189 }
184 } 190 }
185 191
186 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { 192 void CompositorImpl::SetWindowBounds(const gfx::Size& size) {
187 if (size_ == size) 193 if (size_ == size)
188 return; 194 return;
189 195
190 size_ = size; 196 size_ = size;
191 if (host_) 197 if (host_)
192 host_->setViewportSize(size); 198 host_->setViewportSize(size, size);
193 root_layer_->setBounds(size); 199 root_layer_->setBounds(size);
194 } 200 }
195 201
196 bool CompositorImpl::CompositeAndReadback(void *pixels, const gfx::Rect& rect) { 202 bool CompositorImpl::CompositeAndReadback(void *pixels, const gfx::Rect& rect) {
197 if (host_.get()) 203 if (host_.get())
198 return host_->compositeAndReadback(pixels, rect); 204 return host_->compositeAndReadback(pixels, rect);
199 else 205 else
200 return false; 206 return false;
201 } 207 }
202 208
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 } 261 }
256 262
257 void CompositorImpl::CopyTextureToBitmap(WebKit::WebGLId texture_id, 263 void CompositorImpl::CopyTextureToBitmap(WebKit::WebGLId texture_id,
258 gfx::JavaBitmap& bitmap) { 264 gfx::JavaBitmap& bitmap) {
259 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); 265 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper();
260 helper->ReadbackTextureSync(texture_id, 266 helper->ReadbackTextureSync(texture_id,
261 bitmap.size(), 267 bitmap.size(),
262 static_cast<unsigned char*> (bitmap.pixels())); 268 static_cast<unsigned char*> (bitmap.pixels()));
263 } 269 }
264 270
265 void CompositorImpl::updateAnimations(double frameBeginTime) { 271 void CompositorImpl::animate(double monotonicFrameBeginTime) {
266 } 272 }
267 273
268 void CompositorImpl::layout() { 274 void CompositorImpl::layout() {
269 } 275 }
270 276
271 void CompositorImpl::applyScrollAndScale(const WebKit::WebSize& scrollDelta, 277 void CompositorImpl::applyScrollAndScale(gfx::Vector2d scrollDelta,
272 float scaleFactor) { 278 float pageScale) {
273 } 279 }
274 280
275 WebKit::WebCompositorOutputSurface* CompositorImpl::createOutputSurface() { 281 scoped_ptr<WebKit::WebCompositorOutputSurface>
282 CompositorImpl::createOutputSurface() {
276 if (g_use_direct_gl) { 283 if (g_use_direct_gl) {
277 WebKit::WebGraphicsContext3D::Attributes attrs; 284 WebKit::WebGraphicsContext3D::Attributes attrs;
278 attrs.shareResources = false; 285 attrs.shareResources = false;
279 attrs.noAutomaticFlushes = true; 286 attrs.noAutomaticFlushes = true;
280 scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessImpl> context( 287 scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessImpl> context(
281 webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWindow( 288 webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWindow(
282 attrs, 289 attrs,
283 window_, 290 window_,
284 NULL)); 291 NULL));
285 return new WebGraphicsContextToOutputSurfaceAdapter(context.release()); 292 return scoped_ptr<WebKit::WebCompositorOutputSurface>(
293 new WebGraphicsContextToOutputSurfaceAdapter(context.release()));
286 } else { 294 } else {
287 DCHECK(window_ && surface_id_); 295 DCHECK(window_ && surface_id_);
288 WebKit::WebGraphicsContext3D::Attributes attrs; 296 WebKit::WebGraphicsContext3D::Attributes attrs;
289 attrs.shareResources = true; 297 attrs.shareResources = true;
290 attrs.noAutomaticFlushes = true; 298 attrs.noAutomaticFlushes = true;
291 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); 299 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance();
292 GURL url("chrome://gpu/Compositor::createContext3D"); 300 GURL url("chrome://gpu/Compositor::createContext3D");
293 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( 301 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context(
294 new WebGraphicsContext3DCommandBufferImpl(surface_id_, 302 new WebGraphicsContext3DCommandBufferImpl(surface_id_,
295 url, 303 url,
296 factory, 304 factory,
297 weak_factory_.GetWeakPtr())); 305 weak_factory_.GetWeakPtr()));
298 if (!context->Initialize( 306 if (!context->Initialize(
299 attrs, 307 attrs,
300 false, 308 false,
301 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) { 309 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) {
302 LOG(ERROR) << "Failed to create 3D context for compositor."; 310 LOG(ERROR) << "Failed to create 3D context for compositor.";
303 return NULL; 311 return scoped_ptr<WebKit::WebCompositorOutputSurface>();
304 } 312 }
305 return new WebGraphicsContextToOutputSurfaceAdapter(context.release()); 313 return scoped_ptr<WebKit::WebCompositorOutputSurface>(
314 new WebGraphicsContextToOutputSurfaceAdapter(context.release()));
306 } 315 }
307 } 316 }
308 317
318 scoped_ptr<cc::InputHandler> CompositorImpl::createInputHandler() {
319 return scoped_ptr<cc::InputHandler>();
320 }
321
309 void CompositorImpl::didRecreateOutputSurface(bool success) { 322 void CompositorImpl::didRecreateOutputSurface(bool success) {
310 } 323 }
311 324
312 void CompositorImpl::didCommit() { 325 void CompositorImpl::didCommit() {
313 } 326 }
314 327
315 void CompositorImpl::didCommitAndDrawFrame() { 328 void CompositorImpl::didCommitAndDrawFrame() {
316 } 329 }
317 330
318 void CompositorImpl::didCompleteSwapBuffers() { 331 void CompositorImpl::didCompleteSwapBuffers() {
319 client_->OnSwapBuffersCompleted(); 332 client_->OnSwapBuffersCompleted();
320 } 333 }
321 334
322 void CompositorImpl::scheduleComposite() { 335 void CompositorImpl::scheduleComposite() {
323 client_->ScheduleComposite(); 336 client_->ScheduleComposite();
324 } 337 }
325 338
339 scoped_ptr<cc::FontAtlas> CompositorImpl::createFontAtlas() {
340 return scoped_ptr<cc::FontAtlas>();
341 }
342
326 void CompositorImpl::OnViewContextSwapBuffersPosted() { 343 void CompositorImpl::OnViewContextSwapBuffersPosted() {
327 TRACE_EVENT0("compositor", "CompositorImpl::OnViewContextSwapBuffersPosted"); 344 TRACE_EVENT0("compositor", "CompositorImpl::OnViewContextSwapBuffersPosted");
328 } 345 }
329 346
330 void CompositorImpl::OnViewContextSwapBuffersComplete() { 347 void CompositorImpl::OnViewContextSwapBuffersComplete() {
331 TRACE_EVENT0("compositor", 348 TRACE_EVENT0("compositor",
332 "CompositorImpl::OnViewContextSwapBuffersComplete"); 349 "CompositorImpl::OnViewContextSwapBuffersComplete");
333 client_->OnSwapBuffersCompleted(); 350 client_->OnSwapBuffersCompleted();
334 } 351 }
335 352
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 case ANDROID_BITMAP_FORMAT_RGBA_8888: 399 case ANDROID_BITMAP_FORMAT_RGBA_8888:
383 return GL_UNSIGNED_BYTE; 400 return GL_UNSIGNED_BYTE;
384 break; 401 break;
385 case ANDROID_BITMAP_FORMAT_RGB_565: 402 case ANDROID_BITMAP_FORMAT_RGB_565:
386 default: 403 default:
387 return GL_UNSIGNED_SHORT_5_6_5; 404 return GL_UNSIGNED_SHORT_5_6_5;
388 } 405 }
389 } 406 }
390 407
391 } // namespace content 408 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698