diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-22 23:25:23 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-22 23:25:23 +0000 |
commit | 290fc49d46142b94f9c7754c8c3cf36408b9a269 (patch) | |
tree | d42113d9b5be8c7e8e7ef94dbdb6d949a5325d69 /content/common/gpu/image_transport_surface.cc | |
parent | 5902f29b579cba7f1a11b2b6d02b5d3a1f4516cf (diff) | |
download | chromium_src-290fc49d46142b94f9c7754c8c3cf36408b9a269.zip chromium_src-290fc49d46142b94f9c7754c8c3cf36408b9a269.tar.gz chromium_src-290fc49d46142b94f9c7754c8c3cf36408b9a269.tar.bz2 |
Reland 110355 - Use shared D3D9 texture to transport the compositor's backing buffer to the browser process for presentation.
Implemented ImageTransportSurface for Linux (without texture sharing), XP, Vista and 7. XP. The non-texture sharing Linux and XP paths just present directly to the compositing child window owned by the browser process as before.
PassThroughImageTransportSurface still needs a proper name. I will move it into its own file once that is decided.
I moved AcceleratedSurfaceBuffersSwapped outside of the platform specific ifdefs and made the signature the same on all platforms for greater consistency.
I removed the code related to sharing surfaces between processes and synchronizing resize and swapping out of GpuCommandBufferStub. It is all now in ImageTransportSurface implementations.
Original Review URL: http://codereview.chromium.org/8060045
Review URL: http://codereview.chromium.org/8622004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111246 0039d316-1c4b-4281-b951-d872f2087c98
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) |