| Index: content/browser/renderer_host/render_widget_host_view_android.cc
|
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
|
| index d90c933774cebe2eaa5b4571d348403463de9edc..1514c5ac77e3378b2c97fbcc7bdd9fe016855769 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
|
| @@ -10,6 +10,8 @@
|
| #include "base/logging.h"
|
| #include "base/message_loop.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "cc/compositor_frame.h"
|
| +#include "cc/compositor_frame_ack.h"
|
| #include "cc/layer.h"
|
| #include "cc/texture_layer.h"
|
| #include "content/browser/android/content_view_core_impl.h"
|
| @@ -35,6 +37,38 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +void InsertSyncPointAndAckForGpu(
|
| + int gpu_host_id, int route_id, const std::string& return_mailbox) {
|
| + uint32 sync_point =
|
| + ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
|
| + AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
|
| + ack_params.mailbox_name = return_mailbox;
|
| + ack_params.sync_point = sync_point;
|
| + RenderWidgetHostImpl::AcknowledgeBufferPresent(
|
| + route_id, gpu_host_id, ack_params);
|
| +}
|
| +
|
| +void InsertSyncPointAndAckForCompositor(
|
| + int renderer_host_id,
|
| + int route_id,
|
| + const gpu::Mailbox& return_mailbox,
|
| + const gfx::Size return_size) {
|
| + cc::CompositorFrameAck ack;
|
| + ack.gl_frame_data.reset(new cc::GLFrameData());
|
| + if (!return_mailbox.IsZero()) {
|
| + ack.gl_frame_data->mailbox = return_mailbox;
|
| + ack.gl_frame_data->size = return_size;
|
| + ack.gl_frame_data->sync_point =
|
| + ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
|
| + }
|
| + RenderWidgetHostImpl::SendSwapCompositorFrameAck(
|
| + route_id, renderer_host_id, ack);
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
|
| RenderWidgetHostImpl* widget_host,
|
| ContentViewCoreImpl* content_view_core)
|
| @@ -442,35 +476,71 @@ void RenderWidgetHostViewAndroid::ShowDisambiguationPopup(
|
| void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() {
|
| }
|
|
|
| +void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
|
| + const cc::CompositorFrame& frame) {
|
| + if (!frame.gl_frame_data || frame.gl_frame_data->mailbox.IsZero())
|
| + return;
|
| +
|
| + base::Closure callback = base::Bind(&InsertSyncPointAndAckForCompositor,
|
| + host_->GetProcess()->GetID(),
|
| + host_->GetRoutingID(),
|
| + current_mailbox_,
|
| + texture_size_in_layer_);
|
| + ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint(
|
| + frame.gl_frame_data->sync_point);
|
| + BuffersSwapped(
|
| + frame.gl_frame_data->mailbox, frame.gl_frame_data->size, callback);
|
| +
|
| +}
|
| +
|
| void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped(
|
| const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
|
| int gpu_host_id) {
|
| - ImageTransportFactoryAndroid* factory =
|
| - ImageTransportFactoryAndroid::GetInstance();
|
| -
|
| if (params.mailbox_name.empty())
|
| return;
|
|
|
| + std::string return_mailbox;
|
| + if (!current_mailbox_.IsZero()) {
|
| + return_mailbox.assign(
|
| + reinterpret_cast<const char*>(current_mailbox_.name),
|
| + sizeof(current_mailbox_.name));
|
| + }
|
| +
|
| + base::Closure callback = base::Bind(&InsertSyncPointAndAckForGpu,
|
| + gpu_host_id, params.route_id,
|
| + return_mailbox);
|
| +
|
| + gpu::Mailbox mailbox;
|
| + std::copy(params.mailbox_name.data(),
|
| + params.mailbox_name.data() + params.mailbox_name.length(),
|
| + reinterpret_cast<char*>(mailbox.name));
|
| +
|
| + BuffersSwapped(mailbox, params.size, callback);
|
| +}
|
| +
|
| +void RenderWidgetHostViewAndroid::BuffersSwapped(
|
| + const gpu::Mailbox& mailbox,
|
| + const gfx::Size size,
|
| + const base::Closure& ack_callback) {
|
| + ImageTransportFactoryAndroid* factory =
|
| + ImageTransportFactoryAndroid::GetInstance();
|
| +
|
| // TODO(sievers): When running the impl thread in the browser we
|
| // need to delay the ACK until after commit and use more than a single
|
| // texture.
|
| DCHECK(!CompositorImpl::IsThreadingEnabled());
|
|
|
| if (texture_id_in_layer_) {
|
| - DCHECK(!current_mailbox_name_.empty());
|
| + DCHECK(!current_mailbox_.IsZero());
|
| ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture(
|
| - texture_id_in_layer_,
|
| - reinterpret_cast<const signed char*>(
|
| - current_mailbox_name_.data()));
|
| + texture_id_in_layer_, current_mailbox_.name);
|
| } else {
|
| texture_id_in_layer_ = factory->CreateTexture();
|
| texture_layer_->setTextureId(texture_id_in_layer_);
|
| }
|
|
|
| ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
|
| - texture_id_in_layer_,
|
| - reinterpret_cast<const signed char*>(
|
| - params.mailbox_name.data()));
|
| + texture_id_in_layer_, mailbox.name);
|
|
|
| // We need to tell ContentViewCore about the new frame before calling
|
| // setNeedsDisplay() below so that it has the needed information schedule the
|
| @@ -479,18 +549,10 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped(
|
| content_view_core_->DidProduceRendererFrame();
|
|
|
| texture_layer_->setNeedsDisplay();
|
| - texture_layer_->setBounds(params.size);
|
| - texture_size_in_layer_ = params.size;
|
| -
|
| - uint32 sync_point =
|
| - ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
|
| -
|
| - AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
|
| - ack_params.mailbox_name = current_mailbox_name_;
|
| - ack_params.sync_point = sync_point;
|
| - RenderWidgetHostImpl::AcknowledgeBufferPresent(
|
| - params.route_id, gpu_host_id, ack_params);
|
| - current_mailbox_name_ = params.mailbox_name;
|
| + texture_layer_->setBounds(size);
|
| + texture_size_in_layer_ = size;
|
| + current_mailbox_ = mailbox;
|
| + ack_callback.Run();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
|
| @@ -510,7 +572,7 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() {
|
| ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
|
| texture_id_in_layer_);
|
| texture_id_in_layer_ = 0;
|
| - current_mailbox_name_.clear();
|
| + current_mailbox_ = gpu::Mailbox();
|
| }
|
| }
|
|
|
|
|