15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/image_transport_surface.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_channel.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_channel_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_command_buffer_stub.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/gpu/sync_point_manager.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/gpu/texture_image_transport_surface.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_scheduler.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/vsync_provider.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportSurface::ImageTransportSurface() {}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportSurface::~ImageTransportSurface() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface(
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GpuChannelManager* manager,
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GpuCommandBufferStub* stub,
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::GLSurfaceHandle& handle) {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<gfx::GLSurface> surface;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (handle.transport_type == gfx::TEXTURE_TRANSPORT)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface = new TextureImageTransportSurface(manager, stub, handle);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface = CreateNativeSurface(manager, stub, handle);
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!surface.get() || !surface->Initialize())
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return surface;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           GpuChannelManager* manager,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           GpuCommandBufferStub* stub,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           gfx::PluginWindowHandle handle)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_(surface),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_(manager),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stub_(stub->AsWeakPtr()),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handle_(handle) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  route_id_ = manager_->GenerateRouteID();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddRoute(route_id_, this);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportHelper::~ImageTransportHelper() {
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (stub_.get()) {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    stub_->SetLatencyInfoCallback(
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Callback<void(const ui::LatencyInfo&)>());
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveRoute(route_id_);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::Initialize() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder = Decoder();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder->SetResizeCallback(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ImageTransportHelper::Resize, base::Unretained(this)));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  stub_->SetLatencyInfoCallback(
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&ImageTransportHelper::SetLatencyInfo,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceInitialized(
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      stub_->surface_id(), route_id_));
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::Destroy() {}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnBufferPresented)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_WakeUpGpu, OnWakeUpGpu);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TRACE_EVENT for gpu tests:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers",
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       TRACE_EVENT_SCOPE_THREAD,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "GLImpl", static_cast<int>(gfx::GetGLImplementation()),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "width", params.size.width());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.route_id = route_id_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.route_id = route_id_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfaceRelease() {
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GpuHostMsg_AcceleratedSurfaceRelease_Params params;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendResizeView(const gfx::Size& size) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           route_id_,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           size));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendUpdateVSyncParameters(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeTicks timebase, base::TimeDelta interval) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      timebase,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      interval));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ImageTransportHelper::SendLatencyInfo(
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const ui::LatencyInfo& latency_info) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->Send(new GpuHostMsg_FrameDrawn(latency_info));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SetScheduled(bool is_scheduled) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler = Scheduler();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!scheduler)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler->SetScheduled(is_scheduled);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::DeferToFence(base::Closure task) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler = Scheduler();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(scheduler);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler->DeferToFence(task);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageTransportHelper::SetPreemptByFlag(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<gpu::PreemptionFlag> preemption_flag) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  stub_->channel()->SetPreemptByFlag(preemption_flag);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::MakeCurrent() {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder = Decoder();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return decoder->MakeCurrent();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SetSwapInterval(gfx::GLContext* context) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->SetSwapInterval(0);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->SetSwapInterval(1);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::Suspend() {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id()));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::GpuScheduler* ImageTransportHelper::Scheduler() {
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!stub_.get())
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stub_->scheduler();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() {
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!stub_.get())
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stub_->decoder();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageTransportHelper::OnBufferPresented(
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  surface_->OnBufferPresented(params);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::OnResizeViewACK() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_->OnResizeViewACK();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ImageTransportHelper::OnWakeUpGpu() {
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  surface_->WakeUpGpu();
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ImageTransportHelper::Resize(gfx::Size size, float scale_factor) {
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  surface_->OnResize(size, scale_factor);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->gpu_memory_manager()->ScheduleManage(
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GpuMemoryManager::kScheduleManageNow);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ImageTransportHelper::SetLatencyInfo(
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const ui::LatencyInfo& latency_info) {
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  surface_->SetLatencyInfo(latency_info);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PassThroughImageTransportSurface::PassThroughImageTransportSurface(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuChannelManager* manager,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuCommandBufferStub* stub,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::GLSurface* surface,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool transport)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : GLSurfaceAdapter(surface),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_(transport),
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      did_set_swap_interval_(false),
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      did_unschedule_(false),
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_swap_buffers_pending_(false) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.reset(new ImageTransportHelper(this,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         manager,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         stub,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         gfx::kNullPluginWindow));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::Initialize() {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The surface is assumed to have already been initialized.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return helper_->Initialize();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::Destroy() {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->Destroy();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLSurfaceAdapter::Destroy();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PassThroughImageTransportSurface::DeferDraws() {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_swap_buffers_pending_) {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!did_unschedule_);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_unschedule_ = true;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_->SetScheduled(false);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PassThroughImageTransportSurface::SetLatencyInfo(
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const ui::LatencyInfo& latency_info) {
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  latency_info_ = latency_info;
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::SwapBuffers() {
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetVsyncValues before SwapBuffers to work around Mali driver bug:
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // crbug.com/223558.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendVSyncUpdateIfAvailable();
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result = gfx::GLSurfaceAdapter::SwapBuffers();
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  latency_info_.AddLatencyNumber(
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_) {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!is_swap_buffers_pending_);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_swap_buffers_pending_ = true;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Round trip to the browser UI thread, for throttling, by sending a dummy
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SwapBuffers message.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.surface_handle = 0;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params.latency_info = latency_info_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.size = surface()->GetSize();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->SendAcceleratedSurfaceBuffersSwapped(params);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    helper_->SendLatencyInfo(latency_info_);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::PostSubBuffer(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, int width, int height) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendVSyncUpdateIfAvailable();
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height);
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  latency_info_.AddLatencyNumber(
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_) {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!is_swap_buffers_pending_);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_swap_buffers_pending_ = true;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Round trip to the browser UI thread, for throttling, by sending a dummy
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // PostSubBuffer message.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.surface_handle = 0;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params.latency_info = latency_info_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.surface_size = surface()->GetSize();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.x = x;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.y = y;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.width = width;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.height = height;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->SendAcceleratedSurfacePostSubBuffer(params);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->SetScheduled(false);
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    helper_->SendLatencyInfo(latency_info_);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!did_set_swap_interval_) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageTransportHelper::SetSwapInterval(context);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_set_swap_interval_ = true;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::OnBufferPresented(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AcceleratedSurfaceMsg_BufferPresented_Params& /* params */) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transport_);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(is_swap_buffers_pending_);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_swap_buffers_pending_ = false;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (did_unschedule_) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_unschedule_ = false;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_->SetScheduled(true);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::OnResizeViewACK() {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transport_);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Resize(new_size_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TRACE_EVENT_ASYNC_END0("gpu", "OnResize", this);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->SetScheduled(true);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PassThroughImageTransportSurface::OnResize(gfx::Size size,
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                float scale_factor) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_size_ = size;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->SendResizeView(size);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->SetScheduled(false);
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN2("gpu", "OnResize", this,
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             "width", size.width(), "height", size.height());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Resize(new_size_);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size PassThroughImageTransportSurface::GetSize() {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GLSurfaceAdapter::GetSize();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PassThroughImageTransportSurface::WakeUpGpu() {
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NOTIMPLEMENTED();
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::VSyncProvider* vsync_provider = GetVSyncProvider();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (vsync_provider) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    vsync_provider->GetVSyncParameters(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 helper_->AsWeakPtr()));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
373