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

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

Issue 12389061: Android: Add support for CompositorFrame swaps (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 9 months 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/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "cc/compositor_frame.h"
14 #include "cc/compositor_frame_ack.h"
13 #include "cc/layer.h" 15 #include "cc/layer.h"
14 #include "cc/texture_layer.h" 16 #include "cc/texture_layer.h"
15 #include "content/browser/android/content_view_core_impl.h" 17 #include "content/browser/android/content_view_core_impl.h"
16 #include "content/browser/gpu/gpu_surface_tracker.h" 18 #include "content/browser/gpu/gpu_surface_tracker.h"
17 #include "content/browser/renderer_host/compositor_impl_android.h" 19 #include "content/browser/renderer_host/compositor_impl_android.h"
18 #include "content/browser/renderer_host/image_transport_factory_android.h" 20 #include "content/browser/renderer_host/image_transport_factory_android.h"
19 #include "content/browser/renderer_host/render_widget_host_impl.h" 21 #include "content/browser/renderer_host/render_widget_host_impl.h"
20 #include "content/browser/renderer_host/surface_texture_transport_client_android .h" 22 #include "content/browser/renderer_host/surface_texture_transport_client_android .h"
21 #include "content/common/gpu/client/gl_helper.h" 23 #include "content/common/gpu/client/gl_helper.h"
22 #include "content/common/gpu/gpu_messages.h" 24 #include "content/common/gpu/gpu_messages.h"
23 #include "content/common/view_messages.h" 25 #include "content/common/view_messages.h"
24 #include "third_party/khronos/GLES2/gl2.h" 26 #include "third_party/khronos/GLES2/gl2.h"
25 #include "third_party/khronos/GLES2/gl2ext.h" 27 #include "third_party/khronos/GLES2/gl2ext.h"
26 #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" 28 #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h"
27 #include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureL ayer.h" 29 #include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureL ayer.h"
28 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" 30 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h"
29 #include "ui/gfx/android/device_display_info.h" 31 #include "ui/gfx/android/device_display_info.h"
30 #include "ui/gfx/android/java_bitmap.h" 32 #include "ui/gfx/android/java_bitmap.h"
31 #include "ui/gfx/display.h" 33 #include "ui/gfx/display.h"
32 #include "ui/gfx/screen.h" 34 #include "ui/gfx/screen.h"
33 #include "ui/gfx/size_conversions.h" 35 #include "ui/gfx/size_conversions.h"
34 #include "webkit/compositor_bindings/web_compositor_support_impl.h" 36 #include "webkit/compositor_bindings/web_compositor_support_impl.h"
35 37
36 namespace content { 38 namespace content {
37 39
40 namespace {
41
42 void InsertSyncPointAndAckForGpu(
43 int gpu_host_id, int route_id, const std::string& return_mailbox) {
44 uint32 sync_point =
45 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
46 AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
47 ack_params.mailbox_name = return_mailbox;
48 ack_params.sync_point = sync_point;
49 RenderWidgetHostImpl::AcknowledgeBufferPresent(
50 route_id, gpu_host_id, ack_params);
51 }
52
53 void InsertSyncPointAndAckForCompositor(
54 int renderer_host_id,
55 int route_id,
56 const gpu::Mailbox& return_mailbox,
57 const gfx::Size& return_size) {
Sami 2013/03/05 17:44:42 Nit: size by value.
no sievers 2013/03/05 21:58:05 Done.
58 cc::CompositorFrameAck ack;
59 ack.gl_frame_data.reset(new cc::GLFrameData());
60 if (!return_mailbox.IsZero()) {
61 ack.gl_frame_data->mailbox = return_mailbox;
62 ack.gl_frame_data->size = return_size;
63 ack.gl_frame_data->sync_point =
64 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
65 }
66 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
67 route_id, renderer_host_id, ack);
68 }
69
70 } // anonymous namespace
71
38 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 72 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
39 RenderWidgetHostImpl* widget_host, 73 RenderWidgetHostImpl* widget_host,
40 ContentViewCoreImpl* content_view_core) 74 ContentViewCoreImpl* content_view_core)
41 : host_(widget_host), 75 : host_(widget_host),
42 is_layer_attached_(true), 76 is_layer_attached_(true),
43 content_view_core_(NULL), 77 content_view_core_(NULL),
44 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 78 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
45 cached_background_color_(SK_ColorWHITE), 79 cached_background_color_(SK_ColorWHITE),
46 texture_id_in_layer_(0) { 80 texture_id_in_layer_(0) {
47 if (CompositorImpl::UsesDirectGL()) { 81 if (CompositorImpl::UsesDirectGL()) {
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 const gfx::Rect& target_rect, const SkBitmap& zoomed_bitmap) { 472 const gfx::Rect& target_rect, const SkBitmap& zoomed_bitmap) {
439 if (!content_view_core_) 473 if (!content_view_core_)
440 return; 474 return;
441 475
442 content_view_core_->ShowDisambiguationPopup(target_rect, zoomed_bitmap); 476 content_view_core_->ShowDisambiguationPopup(target_rect, zoomed_bitmap);
443 } 477 }
444 478
445 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { 479 void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() {
446 } 480 }
447 481
482 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
483 const cc::CompositorFrame& frame) {
484 if (!frame.gl_frame_data || frame.gl_frame_data->mailbox.IsZero())
485 return;
486
487 base::Closure callback = base::Bind(&InsertSyncPointAndAckForCompositor,
488 host_->GetProcess()->GetID(),
489 host_->GetRoutingID(),
490 current_mailbox_,
491 texture_size_in_layer_);
492 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint(
493 frame.gl_frame_data->sync_point);
494 BuffersSwapped(
495 frame.gl_frame_data->mailbox, frame.gl_frame_data->size, callback);
496
Sami 2013/03/05 17:44:42 Maybe I'm missing something but why not call Inser
497 }
498
448 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( 499 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped(
449 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, 500 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
450 int gpu_host_id) { 501 int gpu_host_id) {
502 if (params.mailbox_name.empty())
503 return;
504
505 std::string return_mailbox;
506 if (!current_mailbox_.IsZero()) {
507 return_mailbox.assign(
508 reinterpret_cast<const char*>(current_mailbox_.name),
509 sizeof(current_mailbox_.name));
510 }
511
512 base::Closure callback = base::Bind(&InsertSyncPointAndAckForGpu,
513 gpu_host_id, params.route_id,
514 return_mailbox);
515
516 gpu::Mailbox mailbox;
517 std::copy(params.mailbox_name.data(),
518 params.mailbox_name.data() + params.mailbox_name.length(),
519 reinterpret_cast<char*>(mailbox.name));
520
521 BuffersSwapped(mailbox, params.size, callback);
Sami 2013/03/05 17:44:42 Same Q about closure usage.
522 }
523
524 void RenderWidgetHostViewAndroid::BuffersSwapped(
525 const gpu::Mailbox& mailbox,
526 const gfx::Size& size,
527 const base::Closure& ack_callback) {
451 ImageTransportFactoryAndroid* factory = 528 ImageTransportFactoryAndroid* factory =
452 ImageTransportFactoryAndroid::GetInstance(); 529 ImageTransportFactoryAndroid::GetInstance();
453 530
454 if (params.mailbox_name.empty())
455 return;
456
457 // TODO(sievers): When running the impl thread in the browser we 531 // TODO(sievers): When running the impl thread in the browser we
458 // need to delay the ACK until after commit and use more than a single 532 // need to delay the ACK until after commit and use more than a single
459 // texture. 533 // texture.
460 DCHECK(!CompositorImpl::IsThreadingEnabled()); 534 DCHECK(!CompositorImpl::IsThreadingEnabled());
461 535
462 if (texture_id_in_layer_) { 536 if (texture_id_in_layer_) {
463 DCHECK(!current_mailbox_name_.empty()); 537 DCHECK(!current_mailbox_.IsZero());
464 ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( 538 ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture(
465 texture_id_in_layer_, 539 texture_id_in_layer_, current_mailbox_.name);
466 reinterpret_cast<const signed char*>(
467 current_mailbox_name_.data()));
468 } else { 540 } else {
469 texture_id_in_layer_ = factory->CreateTexture(); 541 texture_id_in_layer_ = factory->CreateTexture();
470 texture_layer_->setTextureId(texture_id_in_layer_); 542 texture_layer_->setTextureId(texture_id_in_layer_);
471 } 543 }
472 544
473 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 545 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
474 texture_id_in_layer_, 546 texture_id_in_layer_, mailbox.name);
475 reinterpret_cast<const signed char*>(
476 params.mailbox_name.data()));
477 547
478 // We need to tell ContentViewCore about the new frame before calling 548 // We need to tell ContentViewCore about the new frame before calling
479 // setNeedsDisplay() below so that it has the needed information schedule the 549 // setNeedsDisplay() below so that it has the needed information schedule the
480 // next compositor frame. 550 // next compositor frame.
481 if (content_view_core_) 551 if (content_view_core_)
482 content_view_core_->DidProduceRendererFrame(); 552 content_view_core_->DidProduceRendererFrame();
483 553
484 texture_layer_->setNeedsDisplay(); 554 texture_layer_->setNeedsDisplay();
485 texture_layer_->setBounds(params.size); 555 texture_layer_->setBounds(size);
486 texture_size_in_layer_ = params.size; 556 texture_size_in_layer_ = size;
487 557 current_mailbox_ = mailbox;
488 uint32 sync_point = 558 ack_callback.Run();
489 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
490
491 AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
492 ack_params.mailbox_name = current_mailbox_name_;
493 ack_params.sync_point = sync_point;
494 RenderWidgetHostImpl::AcknowledgeBufferPresent(
495 params.route_id, gpu_host_id, ack_params);
496 current_mailbox_name_ = params.mailbox_name;
497 } 559 }
498 560
499 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( 561 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
500 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 562 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
501 int gpu_host_id) { 563 int gpu_host_id) {
502 NOTREACHED(); 564 NOTREACHED();
503 } 565 }
504 566
505 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { 567 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() {
506 NOTREACHED(); 568 NOTREACHED();
507 } 569 }
508 570
509 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { 571 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() {
510 // This tells us we should free the frontbuffer. 572 // This tells us we should free the frontbuffer.
511 if (texture_id_in_layer_) { 573 if (texture_id_in_layer_) {
512 texture_layer_->setTextureId(0); 574 texture_layer_->setTextureId(0);
513 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( 575 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
514 texture_id_in_layer_); 576 texture_id_in_layer_);
515 texture_id_in_layer_ = 0; 577 texture_id_in_layer_ = 0;
516 current_mailbox_name_.clear(); 578 current_mailbox_ = gpu::Mailbox();
517 } 579 }
518 } 580 }
519 581
520 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( 582 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface(
521 const gfx::Size& desired_size) { 583 const gfx::Size& desired_size) {
522 NOTREACHED(); 584 NOTREACHED();
523 return false; 585 return false;
524 } 586 }
525 587
526 void RenderWidgetHostViewAndroid::GetScreenInfo(WebKit::WebScreenInfo* result) { 588 void RenderWidgetHostViewAndroid::GetScreenInfo(WebKit::WebScreenInfo* result) {
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 // RenderWidgetHostView, public: 743 // RenderWidgetHostView, public:
682 744
683 // static 745 // static
684 RenderWidgetHostView* 746 RenderWidgetHostView*
685 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 747 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
686 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 748 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
687 return new RenderWidgetHostViewAndroid(rwhi, NULL); 749 return new RenderWidgetHostViewAndroid(rwhi, NULL);
688 } 750 }
689 751
690 } // namespace content 752 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698