| Index: content/common/gpu/image_transport_surface.cc | 
| =================================================================== | 
| --- content/common/gpu/image_transport_surface.cc	(revision 108480) | 
| +++ content/common/gpu/image_transport_surface.cc	(working copy) | 
| @@ -13,6 +13,12 @@ | 
| #include "content/common/gpu/gpu_messages.h" | 
| #include "gpu/command_buffer/service/gpu_scheduler.h" | 
|  | 
| +ImageTransportSurface::ImageTransportSurface() { | 
| +} | 
| + | 
| +ImageTransportSurface::~ImageTransportSurface() { | 
| +} | 
| + | 
| ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, | 
| GpuChannelManager* manager, | 
| int32 render_view_id, | 
| @@ -55,6 +61,7 @@ | 
| OnBuffersSwappedACK) | 
| IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 
| OnNewSurfaceACK) | 
| +    IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | 
| IPC_MESSAGE_UNHANDLED(handled = false) | 
| IPC_END_MESSAGE_MAP() | 
| return handled; | 
| @@ -90,6 +97,13 @@ | 
| manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 
| } | 
|  | 
| +void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | 
| +  manager_->Send(new GpuHostMsg_ResizeView(renderer_id_, | 
| +                                           render_view_id_, | 
| +                                           route_id_, | 
| +                                           size)); | 
| +} | 
| + | 
| void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 
| gpu::GpuScheduler* scheduler = Scheduler(); | 
| if (!scheduler) | 
| @@ -98,6 +112,13 @@ | 
| scheduler->SetScheduled(is_scheduled); | 
| } | 
|  | 
| +void ImageTransportHelper::DeferToFence(base::Closure task) { | 
| +  gpu::GpuScheduler* scheduler = Scheduler(); | 
| +  DCHECK(scheduler); | 
| + | 
| +  scheduler->DeferToFence(task); | 
| +} | 
| + | 
| void ImageTransportHelper::OnBuffersSwappedACK() { | 
| surface_->OnBuffersSwappedACK(); | 
| } | 
| @@ -108,10 +129,40 @@ | 
| surface_->OnNewSurfaceACK(surface_id, shm_handle); | 
| } | 
|  | 
| +void ImageTransportHelper::OnResizeViewACK() { | 
| +  surface_->OnResizeViewACK(); | 
| +} | 
| + | 
| void ImageTransportHelper::Resize(gfx::Size size) { | 
| +  // On windows, the surface is recreated and, in case the newly allocated | 
| +  // surface happens to have the same address, it should be invalidated on the | 
| +  // decoder so that future calls to MakeCurrent do not early out on the | 
| +  // assumption that neither the context or surface have actually changed. | 
| +#if defined(OS_WIN) | 
| +  Decoder()->ReleaseCurrent(); | 
| +#endif | 
| + | 
| surface_->OnResize(size); | 
| + | 
| +#if defined(OS_WIN) | 
| +  Decoder()->MakeCurrent(); | 
| +  SetSwapInterval(); | 
| +#endif | 
| } | 
|  | 
| +void ImageTransportHelper::SetSwapInterval() { | 
| +  GpuChannel* channel = manager_->LookupChannel(renderer_id_); | 
| +  if (!channel) | 
| +    return; | 
| + | 
| +  GpuCommandBufferStub* stub = | 
| +      channel->LookupCommandBuffer(command_buffer_id_); | 
| +  if (!stub) | 
| +    return; | 
| + | 
| +  stub->SetSwapInterval(); | 
| +} | 
| + | 
| bool ImageTransportHelper::MakeCurrent() { | 
| gpu::gles2::GLES2Decoder* decoder = Decoder(); | 
| if (!decoder) | 
| @@ -145,4 +196,47 @@ | 
| return stub->decoder(); | 
| } | 
|  | 
| +PassThroughImageTransportSurface::PassThroughImageTransportSurface( | 
| +    GpuChannelManager* manager, | 
| +    int32 render_view_id, | 
| +    int32 renderer_id, | 
| +    int32 command_buffer_id, | 
| +    gfx::GLSurface* surface) : GLSurfaceAdapter(surface) { | 
| +  helper_.reset(new ImageTransportHelper(this, | 
| +                                         manager, | 
| +                                         render_view_id, | 
| +                                         renderer_id, | 
| +                                         command_buffer_id, | 
| +                                         gfx::kNullPluginWindow)); | 
| +} | 
| + | 
| +PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { | 
| +} | 
| + | 
| +bool PassThroughImageTransportSurface::Initialize() { | 
| +  // The surface is assumed to have already been initialized. | 
| +  return helper_->Initialize(); | 
| +} | 
| + | 
| +void PassThroughImageTransportSurface::Destroy() { | 
| +  helper_->Destroy(); | 
| +  GLSurfaceAdapter::Destroy(); | 
| +} | 
| + | 
| +void PassThroughImageTransportSurface::OnNewSurfaceACK( | 
| +    uint64 surface_id, TransportDIB::Handle surface_handle) { | 
| +} | 
| + | 
| +void PassThroughImageTransportSurface::OnBuffersSwappedACK() { | 
| +} | 
| + | 
| +void PassThroughImageTransportSurface::OnResizeViewACK() { | 
| +  helper_->SetScheduled(true); | 
| +} | 
| + | 
| +void PassThroughImageTransportSurface::OnResize(gfx::Size size) { | 
| +  helper_->SendResizeView(size); | 
| +  helper_->SetScheduled(false); | 
| +} | 
| + | 
| #endif  // defined(ENABLE_GPU) | 
|  |