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)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/win/shell.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportSurface::ImageTransportSurface() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportSurface::~ImageTransportSurface() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface(
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GpuChannelManager* manager,
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GpuCommandBufferStub* stub,
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::GLSurfaceHandle& handle) {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<gfx::GLSurface> surface;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (handle.transport_type == gfx::TEXTURE_TRANSPORT)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface = new TextureImageTransportSurface(manager, stub, handle);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    surface = CreateNativeSurface(manager, stub, handle);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!surface.get() || !surface->Initialize())
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return surface;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           GpuChannelManager* manager,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           GpuCommandBufferStub* stub,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           gfx::PluginWindowHandle handle)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_(surface),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_(manager),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stub_(stub->AsWeakPtr()),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handle_(handle) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  route_id_ = manager_->GenerateRouteID();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddRoute(route_id_, this);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportHelper::~ImageTransportHelper() {
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (stub_.get()) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    stub_->SetLatencyInfoCallback(
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Callback<void(const std::vector<ui::LatencyInfo>&)>());
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveRoute(route_id_);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::Initialize() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder = Decoder();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder->SetResizeCallback(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ImageTransportHelper::Resize, base::Unretained(this)));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  stub_->SetLatencyInfoCallback(
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&ImageTransportHelper::SetLatencyInfo,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceInitialized(
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      stub_->surface_id(), route_id_));
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::Destroy() {}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnBufferPresented)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_WakeUpGpu, OnWakeUpGpu);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TRACE_EVENT for gpu tests:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers",
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       TRACE_EVENT_SCOPE_THREAD,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "GLImpl", static_cast<int>(gfx::GetGLImplementation()),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "width", params.size.width());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.route_id = route_id_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.route_id = route_id_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ImageTransportHelper::SendAcceleratedSurfaceRelease() {
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GpuHostMsg_AcceleratedSurfaceRelease_Params params;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = stub_->surface_id();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SendUpdateVSyncParameters(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeTicks timebase, base::TimeDelta interval) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      timebase,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      interval));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ImageTransportHelper::SendLatencyInfo(
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->Send(new GpuHostMsg_FrameDrawn(latency_info));
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SetScheduled(bool is_scheduled) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler = Scheduler();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!scheduler)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler->SetScheduled(is_scheduled);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::DeferToFence(base::Closure task) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler = Scheduler();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(scheduler);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler->DeferToFence(task);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageTransportHelper::SetPreemptByFlag(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<gpu::PreemptionFlag> preemption_flag) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  stub_->channel()->SetPreemptByFlag(preemption_flag);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageTransportHelper::MakeCurrent() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder = Decoder();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return decoder->MakeCurrent();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::SetSwapInterval(gfx::GLContext* context) {
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If Aero Glass is enabled, then the renderer will handle ratelimiting and
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // there's no tearing, so waiting for vsync is unnecessary.
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ui::win::IsAeroGlassEnabled()) {
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    context->SetSwapInterval(0);
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync))
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->SetSwapInterval(0);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->SetSwapInterval(1);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageTransportHelper::Suspend() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id()));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::GpuScheduler* ImageTransportHelper::Scheduler() {
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!stub_.get())
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stub_->scheduler();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() {
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!stub_.get())
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stub_->decoder();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageTransportHelper::OnBufferPresented(
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  surface_->OnBufferPresented(params);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ImageTransportHelper::OnWakeUpGpu() {
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  surface_->WakeUpGpu();
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ImageTransportHelper::Resize(gfx::Size size, float scale_factor) {
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  surface_->OnResize(size, scale_factor);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->gpu_memory_manager()->ScheduleManage(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GpuMemoryManager::kScheduleManageNow);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ImageTransportHelper::SetLatencyInfo(
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  surface_->SetLatencyInfo(latency_info);
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PassThroughImageTransportSurface::PassThroughImageTransportSurface(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuChannelManager* manager,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuCommandBufferStub* stub,
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gfx::GLSurface* surface)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : GLSurfaceAdapter(surface),
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      did_set_swap_interval_(false) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.reset(new ImageTransportHelper(this,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         manager,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         stub,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         gfx::kNullPluginWindow));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::Initialize() {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The surface is assumed to have already been initialized.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return helper_->Initialize();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::Destroy() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->Destroy();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLSurfaceAdapter::Destroy();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PassThroughImageTransportSurface::SetLatencyInfo(
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<ui::LatencyInfo>& latency_info) {
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < latency_info.size(); i++)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    latency_info_.push_back(latency_info[i]);
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::SwapBuffers() {
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetVsyncValues before SwapBuffers to work around Mali driver bug:
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // crbug.com/223558.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendVSyncUpdateIfAvailable();
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result = gfx::GLSurfaceAdapter::SwapBuffers();
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < latency_info_.size(); i++) {
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    latency_info_[i].AddLatencyNumber(
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  helper_->SendLatencyInfo(latency_info_);
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency_info_.clear();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::PostSubBuffer(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, int width, int height) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendVSyncUpdateIfAvailable();
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height);
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < latency_info_.size(); i++) {
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    latency_info_[i].AddLatencyNumber(
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  helper_->SendLatencyInfo(latency_info_);
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency_info_.clear();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!did_set_swap_interval_) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageTransportHelper::SetSwapInterval(context);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_set_swap_interval_ = true;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::OnBufferPresented(
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AcceleratedSurfaceMsg_BufferPresented_Params& /* params */) {
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NOTREACHED();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PassThroughImageTransportSurface::OnResize(gfx::Size size,
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                float scale_factor) {
2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Resize(size);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size PassThroughImageTransportSurface::GetSize() {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GLSurfaceAdapter::GetSize();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PassThroughImageTransportSurface::WakeUpGpu() {
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NOTIMPLEMENTED();
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::VSyncProvider* vsync_provider = GetVSyncProvider();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (vsync_provider) {
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    vsync_provider->GetVSyncParameters(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 helper_->AsWeakPtr()));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
312