summaryrefslogtreecommitdiffstats
path: root/content/common/gpu/image_transport_surface.cc
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-22 23:25:23 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-22 23:25:23 +0000
commit290fc49d46142b94f9c7754c8c3cf36408b9a269 (patch)
treed42113d9b5be8c7e8e7ef94dbdb6d949a5325d69 /content/common/gpu/image_transport_surface.cc
parent5902f29b579cba7f1a11b2b6d02b5d3a1f4516cf (diff)
downloadchromium_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.cc94
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)