Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/input_handler.h" | |
| 15 #include "cc/layer.h" | |
| 16 #include "cc/layer_tree_host.h" | |
| 17 #include "cc/thread_impl.h" | |
| 14 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 18 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
| 15 #include "content/browser/gpu/gpu_surface_tracker.h" | 19 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 16 #include "content/browser/renderer_host/image_transport_factory_android.h" | 20 #include "content/browser/renderer_host/image_transport_factory_android.h" |
| 17 #include "content/common/gpu/client/gl_helper.h" | 21 #include "content/common/gpu/client/gl_helper.h" |
| 18 #include "content/common/gpu/client/gpu_channel_host.h" | 22 #include "content/common/gpu/client/gpu_channel_host.h" |
| 19 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" | 23 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
| 20 #include "content/common/gpu/gpu_process_launch_causes.h" | 24 #include "content/common/gpu/gpu_process_launch_causes.h" |
| 21 #include "content/public/common/content_switches.h" | 25 #include "content/public/common/content_switches.h" |
| 22 #include "third_party/khronos/GLES2/gl2.h" | 26 #include "third_party/khronos/GLES2/gl2.h" |
| 23 #include "third_party/khronos/GLES2/gl2ext.h" | 27 #include "third_party/khronos/GLES2/gl2ext.h" |
| 24 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutput Surface.h" | 28 #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutput Surface.h" |
| 25 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h" | 29 #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" | 30 #include "ui/gfx/android/java_bitmap.h" |
| 28 #include "webkit/compositor_bindings/web_compositor_support_impl.h" | |
| 29 #include "webkit/glue/webthread_impl.h" | 31 #include "webkit/glue/webthread_impl.h" |
| 30 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" | 32 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" |
| 31 | 33 |
| 32 using webkit::WebCompositorSupportImpl; | |
| 33 | |
| 34 namespace gfx { | 34 namespace gfx { |
| 35 class JavaBitmap; | 35 class JavaBitmap; |
| 36 } | 36 } |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 static bool g_initialized = false; | 40 static bool g_initialized = false; |
| 41 static base::LazyInstance<WebCompositorSupportImpl> g_compositor_support = | 41 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; | 42 static bool g_use_direct_gl = false; |
| 45 | 43 |
| 46 // Adapts a pure WebGraphicsContext3D into a WebCompositorOutputSurface. | 44 // Adapts a pure WebGraphicsContext3D into a WebCompositorOutputSurface. |
| 47 class WebGraphicsContextToOutputSurfaceAdapter : | 45 class WebGraphicsContextToOutputSurfaceAdapter : |
| 48 public WebKit::WebCompositorOutputSurface { | 46 public WebKit::WebCompositorOutputSurface { |
| 49 public: | 47 public: |
| 50 explicit WebGraphicsContextToOutputSurfaceAdapter( | 48 explicit WebGraphicsContextToOutputSurfaceAdapter( |
| 51 WebKit::WebGraphicsContext3D* context) | 49 WebKit::WebGraphicsContext3D* context) |
| 52 : m_context3D(context) | 50 : m_context3D(context) |
| 53 , m_client(0) | 51 , m_client(0) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 namespace content { | 88 namespace content { |
| 91 | 89 |
| 92 // static | 90 // static |
| 93 Compositor* Compositor::Create(Client* client) { | 91 Compositor* Compositor::Create(Client* client) { |
| 94 return client ? new CompositorImpl(client) : NULL; | 92 return client ? new CompositorImpl(client) : NULL; |
| 95 } | 93 } |
| 96 | 94 |
| 97 // static | 95 // static |
| 98 void Compositor::Initialize() { | 96 void Compositor::Initialize() { |
| 99 DCHECK(!CompositorImpl::IsInitialized()); | 97 DCHECK(!CompositorImpl::IsInitialized()); |
| 100 g_compositor_support.Get().initialize(g_impl_thread); | |
| 101 g_initialized = true; | 98 g_initialized = true; |
| 102 } | 99 } |
| 103 | 100 |
| 104 // static | 101 // static |
| 105 void Compositor::InitializeWithFlags(uint32 flags) { | 102 void Compositor::InitializeWithFlags(uint32 flags) { |
| 106 g_use_direct_gl = flags & DIRECT_CONTEXT_ON_DRAW_THREAD; | 103 g_use_direct_gl = flags & DIRECT_CONTEXT_ON_DRAW_THREAD; |
| 107 if (flags & ENABLE_COMPOSITOR_THREAD) | 104 if (flags & ENABLE_COMPOSITOR_THREAD) { |
| 105 TRACE_EVENT_INSTANT0("test_gpu", "ThreadedCompositingInitialization"); | |
| 108 g_impl_thread = new webkit_glue::WebThreadImpl("Browser Compositor"); | 106 g_impl_thread = new webkit_glue::WebThreadImpl("Browser Compositor"); |
| 107 } | |
| 109 Compositor::Initialize(); | 108 Compositor::Initialize(); |
| 110 } | 109 } |
| 111 | 110 |
| 112 // static | 111 // static |
| 113 WebCompositorSupportImpl* CompositorImpl::CompositorSupport() { | |
| 114 DCHECK(g_initialized); | |
| 115 return g_compositor_support.Pointer(); | |
| 116 } | |
| 117 | |
| 118 // static | |
| 119 bool CompositorImpl::IsInitialized() { | 112 bool CompositorImpl::IsInitialized() { |
| 120 return g_initialized; | 113 return g_initialized; |
| 121 } | 114 } |
| 122 | 115 |
| 123 // static | 116 // static |
| 117 bool CompositorImpl::IsThreadingEnabled() { | |
| 118 return g_impl_thread; | |
| 119 } | |
| 120 | |
| 121 // static | |
| 124 bool CompositorImpl::UsesDirectGL() { | 122 bool CompositorImpl::UsesDirectGL() { |
| 125 return g_use_direct_gl; | 123 return g_use_direct_gl; |
| 126 } | 124 } |
| 127 | 125 |
| 128 CompositorImpl::CompositorImpl(Compositor::Client* client) | 126 CompositorImpl::CompositorImpl(Compositor::Client* client) |
| 129 : window_(NULL), | 127 : root_layer_(cc::Layer::create()), |
| 128 window_(NULL), | |
| 130 surface_id_(0), | 129 surface_id_(0), |
| 131 client_(client), | 130 client_(client), |
| 132 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 131 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 133 DCHECK(client); | 132 DCHECK(client); |
| 134 root_layer_.reset(g_compositor_support.Get().createLayer()); | |
| 135 } | 133 } |
| 136 | 134 |
| 137 CompositorImpl::~CompositorImpl() { | 135 CompositorImpl::~CompositorImpl() { |
| 138 } | 136 } |
| 139 | 137 |
| 140 void CompositorImpl::Composite() { | 138 void CompositorImpl::Composite() { |
| 141 if (host_.get()) | 139 if (host_.get()) |
| 142 host_->composite(); | 140 host_->composite(); |
| 143 } | 141 } |
| 144 | 142 |
| 145 void CompositorImpl::SetRootLayer(WebKit::WebLayer* root_layer) { | 143 void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) { |
| 146 root_layer_->removeAllChildren(); | 144 root_layer_->removeAllChildren(); |
| 147 root_layer_->addChild(root_layer); | 145 root_layer_->addChild(root_layer); |
| 148 } | 146 } |
| 149 | 147 |
| 150 void CompositorImpl::SetWindowSurface(ANativeWindow* window) { | 148 void CompositorImpl::SetWindowSurface(ANativeWindow* window) { |
| 151 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); | 149 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); |
| 152 | 150 |
| 153 if (window_) { | 151 if (window_) { |
| 154 tracker->RemoveSurface(surface_id_); | 152 tracker->RemoveSurface(surface_id_); |
| 155 ANativeWindow_release(window_); | 153 ANativeWindow_release(window_); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 166 surface_id_, | 164 surface_id_, |
| 167 gfx::GLSurfaceHandle(gfx::kDummyPluginWindow, false)); | 165 gfx::GLSurfaceHandle(gfx::kDummyPluginWindow, false)); |
| 168 SetVisible(true); | 166 SetVisible(true); |
| 169 } | 167 } |
| 170 } | 168 } |
| 171 | 169 |
| 172 void CompositorImpl::SetVisible(bool visible) { | 170 void CompositorImpl::SetVisible(bool visible) { |
| 173 if (!visible) { | 171 if (!visible) { |
| 174 host_.reset(); | 172 host_.reset(); |
| 175 } else if (!host_.get()) { | 173 } else if (!host_.get()) { |
| 176 WebKit::WebLayerTreeView::Settings settings; | 174 cc::LayerTreeSettings settings; |
| 177 settings.refreshRate = 60.0; | 175 settings.refreshRate = 60.0; |
| 178 host_.reset(g_compositor_support.Get().createLayerTreeView( | 176 |
| 179 this, *root_layer_, settings)); | 177 scoped_ptr<cc::Thread> impl_thread; |
| 178 if (g_impl_thread) | |
| 179 impl_thread = cc::ThreadImpl::createForDifferentThread( | |
| 180 g_impl_thread->message_loop()->message_loop_proxy()); | |
| 181 | |
| 182 host_ = cc::LayerTreeHost::create(this, settings, impl_thread.Pass()); | |
| 183 host_->setRootLayer(root_layer_); | |
| 184 | |
| 180 host_->setVisible(true); | 185 host_->setVisible(true); |
| 181 host_->setSurfaceReady(); | 186 host_->setSurfaceReady(); |
| 182 host_->setViewportSize(size_); | 187 host_->setViewportSize(size_, size_); |
| 183 } | 188 } |
| 184 } | 189 } |
| 185 | 190 |
| 186 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { | 191 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { |
| 187 if (size_ == size) | 192 if (size_ == size) |
| 188 return; | 193 return; |
| 189 | 194 |
| 190 size_ = size; | 195 size_ = size; |
| 191 if (host_) | 196 if (host_) |
| 192 host_->setViewportSize(size); | 197 host_->setViewportSize(size, size); |
| 193 root_layer_->setBounds(size); | 198 root_layer_->setBounds(size); |
| 194 } | 199 } |
| 195 | 200 |
| 196 bool CompositorImpl::CompositeAndReadback(void *pixels, const gfx::Rect& rect) { | 201 bool CompositorImpl::CompositeAndReadback(void *pixels, const gfx::Rect& rect) { |
| 197 if (host_.get()) | 202 if (host_.get()) |
| 198 return host_->compositeAndReadback(pixels, rect); | 203 return host_->compositeAndReadback(pixels, rect); |
| 199 else | 204 else |
| 200 return false; | 205 return false; |
| 201 } | 206 } |
| 202 | 207 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 } | 260 } |
| 256 | 261 |
| 257 void CompositorImpl::CopyTextureToBitmap(WebKit::WebGLId texture_id, | 262 void CompositorImpl::CopyTextureToBitmap(WebKit::WebGLId texture_id, |
| 258 gfx::JavaBitmap& bitmap) { | 263 gfx::JavaBitmap& bitmap) { |
| 259 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); | 264 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
| 260 helper->ReadbackTextureSync(texture_id, | 265 helper->ReadbackTextureSync(texture_id, |
| 261 bitmap.size(), | 266 bitmap.size(), |
| 262 static_cast<unsigned char*> (bitmap.pixels())); | 267 static_cast<unsigned char*> (bitmap.pixels())); |
| 263 } | 268 } |
| 264 | 269 |
| 265 void CompositorImpl::updateAnimations(double frameBeginTime) { | 270 void CompositorImpl::animate(double monotonicFrameBeginTime) { |
| 266 } | 271 } |
| 267 | 272 |
| 268 void CompositorImpl::layout() { | 273 void CompositorImpl::layout() { |
| 269 } | 274 } |
| 270 | 275 |
| 271 void CompositorImpl::applyScrollAndScale(const WebKit::WebSize& scrollDelta, | 276 void CompositorImpl::applyScrollAndScale(gfx::Vector2d scrollDelta, |
| 272 float scaleFactor) { | 277 float pageScale) { |
| 273 } | 278 } |
| 274 | 279 |
| 275 WebKit::WebCompositorOutputSurface* CompositorImpl::createOutputSurface() { | 280 scoped_ptr<WebKit::WebCompositorOutputSurface> |
| 281 CompositorImpl::createOutputSurface() { | |
| 276 if (g_use_direct_gl) { | 282 if (g_use_direct_gl) { |
| 277 WebKit::WebGraphicsContext3D::Attributes attrs; | 283 WebKit::WebGraphicsContext3D::Attributes attrs; |
| 278 attrs.shareResources = false; | 284 attrs.shareResources = false; |
| 279 attrs.noAutomaticFlushes = true; | 285 attrs.noAutomaticFlushes = true; |
| 280 scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessImpl> context( | 286 scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessImpl> context( |
| 281 webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWindow( | 287 webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWindow( |
| 282 attrs, | 288 attrs, |
| 283 window_, | 289 window_, |
| 284 NULL)); | 290 NULL)); |
| 285 return new WebGraphicsContextToOutputSurfaceAdapter(context.release()); | 291 return scoped_ptr<WebKit::WebCompositorOutputSurface>( |
| 292 new WebGraphicsContextToOutputSurfaceAdapter(context.release())); | |
| 286 } else { | 293 } else { |
| 287 DCHECK(window_ && surface_id_); | 294 DCHECK(window_ && surface_id_); |
| 288 WebKit::WebGraphicsContext3D::Attributes attrs; | 295 WebKit::WebGraphicsContext3D::Attributes attrs; |
| 289 attrs.shareResources = true; | 296 attrs.shareResources = true; |
| 290 attrs.noAutomaticFlushes = true; | 297 attrs.noAutomaticFlushes = true; |
| 291 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); | 298 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); |
| 292 GURL url("chrome://gpu/Compositor::createContext3D"); | 299 GURL url("chrome://gpu/Compositor::createContext3D"); |
| 293 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( | 300 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
| 294 new WebGraphicsContext3DCommandBufferImpl(surface_id_, | 301 new WebGraphicsContext3DCommandBufferImpl(surface_id_, |
| 295 url, | 302 url, |
| 296 factory, | 303 factory, |
| 297 weak_factory_.GetWeakPtr())); | 304 weak_factory_.GetWeakPtr())); |
| 298 if (!context->Initialize( | 305 if (!context->Initialize( |
| 299 attrs, | 306 attrs, |
| 300 false, | 307 false, |
| 301 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) { | 308 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) { |
| 302 LOG(ERROR) << "Failed to create 3D context for compositor."; | 309 LOG(ERROR) << "Failed to create 3D context for compositor."; |
| 303 return NULL; | 310 return scoped_ptr<WebKit::WebCompositorOutputSurface>(); |
| 304 } | 311 } |
| 305 return new WebGraphicsContextToOutputSurfaceAdapter(context.release()); | 312 return scoped_ptr<WebKit::WebCompositorOutputSurface>( |
| 313 new WebGraphicsContextToOutputSurfaceAdapter(context.release())); | |
| 306 } | 314 } |
| 307 } | 315 } |
| 308 | 316 |
| 317 scoped_ptr<cc::InputHandler> CompositorImpl::createInputHandler() { | |
| 318 scoped_ptr<cc::InputHandler> ret; | |
| 319 return ret.Pass(); | |
|
joth
2012/11/29 21:19:38
wrong indent
I think just "return scoped_ptr<cc::
Leandro GraciĆ” Gil
2012/11/30 12:11:11
Done.
| |
| 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() { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 case ANDROID_BITMAP_FORMAT_RGBA_8888: | 395 case ANDROID_BITMAP_FORMAT_RGBA_8888: |
| 383 return GL_UNSIGNED_BYTE; | 396 return GL_UNSIGNED_BYTE; |
| 384 break; | 397 break; |
| 385 case ANDROID_BITMAP_FORMAT_RGB_565: | 398 case ANDROID_BITMAP_FORMAT_RGB_565: |
| 386 default: | 399 default: |
| 387 return GL_UNSIGNED_SHORT_5_6_5; | 400 return GL_UNSIGNED_SHORT_5_6_5; |
| 388 } | 401 } |
| 389 } | 402 } |
| 390 | 403 |
| 391 } // namespace content | 404 } // namespace content |
| OLD | NEW |