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