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