diff options
Diffstat (limited to 'content/common/gpu/image_transport_surface.cc')
-rw-r--r-- | content/common/gpu/image_transport_surface.cc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/content/common/gpu/image_transport_surface.cc b/content/common/gpu/image_transport_surface.cc index 5bb016e..d0dfee1 100644 --- a/content/common/gpu/image_transport_surface.cc +++ b/content/common/gpu/image_transport_surface.cc @@ -14,6 +14,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, @@ -56,6 +62,7 @@ bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { OnBuffersSwappedACK) IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, OnNewSurfaceACK) + IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -91,6 +98,13 @@ void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( 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) @@ -99,6 +113,13 @@ void ImageTransportHelper::SetScheduled(bool is_scheduled) { scheduler->SetScheduled(is_scheduled); } +void ImageTransportHelper::DeferToFence(base::Closure task) { + gpu::GpuScheduler* scheduler = Scheduler(); + DCHECK(scheduler); + + scheduler->DeferToFence(task); +} + void ImageTransportHelper::OnBuffersSwappedACK() { surface_->OnBuffersSwappedACK(); } @@ -109,8 +130,38 @@ void ImageTransportHelper::OnNewSurfaceACK( 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() { @@ -146,4 +197,47 @@ gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { 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) |