diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 21:23:11 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 21:23:11 +0000 |
commit | ba65b1f642d37bf33ed99c66498110007d249c65 (patch) | |
tree | 08baa793c615ec0622e3e3191339ffb47c193434 /chrome/browser/renderer_host | |
parent | 857bff35929a3af15166bd3e7f885e1d7113c050 (diff) | |
download | chromium_src-ba65b1f642d37bf33ed99c66498110007d249c65.zip chromium_src-ba65b1f642d37bf33ed99c66498110007d249c65.tar.gz chromium_src-ba65b1f642d37bf33ed99c66498110007d249c65.tar.bz2 |
Laying down the groundwork for GPU video layers.
This gets --enable-video-layering working when using the GPU backing store. No actual visuals yet, just IPC message passing and a lot of NOTIMPLEMENTED messages.
BUG=33329
TEST=try it out and see if you get lots of NOTIMPLEMENTED messages corresponding with video playback
Review URL: http://codereview.chromium.org/661344
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40434 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
-rw-r--r-- | chrome/browser/renderer_host/gpu_view_host.cc | 10 | ||||
-rw-r--r-- | chrome/browser/renderer_host/gpu_view_host.h | 5 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_gtk.cc | 7 | ||||
-rw-r--r-- | chrome/browser/renderer_host/video_layer_proxy.cc | 59 | ||||
-rw-r--r-- | chrome/browser/renderer_host/video_layer_proxy.h | 43 | ||||
-rw-r--r-- | chrome/browser/renderer_host/video_layer_x.h | 1 |
6 files changed, 123 insertions, 2 deletions
diff --git a/chrome/browser/renderer_host/gpu_view_host.cc b/chrome/browser/renderer_host/gpu_view_host.cc index 8fcb288..a81db6b 100644 --- a/chrome/browser/renderer_host/gpu_view_host.cc +++ b/chrome/browser/renderer_host/gpu_view_host.cc @@ -6,6 +6,7 @@ #include "chrome/browser/gpu_process_host.h" #include "chrome/browser/renderer_host/backing_store_proxy.h" +#include "chrome/browser/renderer_host/video_layer_proxy.h" #include "chrome/common/gpu_messages.h" GpuViewHost::GpuViewHost(RenderWidgetHost* widget, GpuNativeWindowHandle parent) @@ -31,6 +32,15 @@ BackingStore* GpuViewHost::CreateBackingStore(const gfx::Size& size) { process_, backing_store_routing_id); } +VideoLayer* GpuViewHost::CreateVideoLayer(const gfx::Size& size) { + int32 video_layer_routing_id = process_->GetNextRoutingId(); + process_->Send(new GpuMsg_NewVideoLayer(routing_id_, + video_layer_routing_id, + size)); + return new VideoLayerProxy(widget_, size, + process_, video_layer_routing_id); +} + void GpuViewHost::OnWindowPainted() { process_->Send(new GpuMsg_WindowPainted(routing_id_)); } diff --git a/chrome/browser/renderer_host/gpu_view_host.h b/chrome/browser/renderer_host/gpu_view_host.h index c6aa2d2..910c978 100644 --- a/chrome/browser/renderer_host/gpu_view_host.h +++ b/chrome/browser/renderer_host/gpu_view_host.h @@ -11,6 +11,7 @@ class BackingStore; class GpuProcessHost; class RenderWidgetHost; +class VideoLayer; namespace gfx { class Size; @@ -26,6 +27,10 @@ class GpuViewHost { // the new pointer to the caller. BackingStore* CreateBackingStore(const gfx::Size& size); + // Creates a new video layer in the GPU process and returns ownership of the + // new pointer to the caller. + VideoLayer* CreateVideoLayer(const gfx::Size& size); + // Notification that the RenderWidgetHost has been asked to paint the window. // Depending on the backing store, the GPU backing store may have to repaint // at this time. On Linux this is needed because the GPU process paints diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index c3f860b..30df540 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -642,8 +642,11 @@ BackingStore* RenderWidgetHostViewGtk::AllocBackingStore( VideoLayer* RenderWidgetHostViewGtk::AllocVideoLayer(const gfx::Size& size) { if (enable_gpu_rendering_) { - NOTIMPLEMENTED(); - return NULL; + // TODO(scherkus): is it possible for a video layer to be allocated before a + // backing store? + DCHECK(gpu_view_host_.get()) + << "AllocVideoLayer() called before AllocBackingStore()"; + return gpu_view_host_->CreateVideoLayer(size); } return new VideoLayerX(host_, size, diff --git a/chrome/browser/renderer_host/video_layer_proxy.cc b/chrome/browser/renderer_host/video_layer_proxy.cc new file mode 100644 index 0000000..0280def --- /dev/null +++ b/chrome/browser/renderer_host/video_layer_proxy.cc @@ -0,0 +1,59 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/renderer_host/video_layer_proxy.h" + +#include "base/gfx/rect.h" +#include "chrome/browser/gpu_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" +#include "chrome/common/gpu_messages.h" + +VideoLayerProxy::VideoLayerProxy(RenderWidgetHost* widget, + const gfx::Size& size, + GpuProcessHost* process, + int32 routing_id) + : VideoLayer(widget, size), + process_(process), + routing_id_(routing_id) { + process_->AddRoute(routing_id_, this); +} + +VideoLayerProxy::~VideoLayerProxy() { + process_->RemoveRoute(routing_id_); +} + +void VideoLayerProxy::CopyTransportDIB(RenderProcessHost* process, + TransportDIB::Id bitmap, + const gfx::Rect& bitmap_rect) { + base::ProcessId process_id; +#if defined(OS_WIN) + process_id = ::GetProcessId(process->GetHandle()); +#elif defined(OS_POSIX) + process_id = process->GetHandle(); +#endif + + if (process_->Send(new GpuMsg_PaintToVideoLayer( + routing_id_, process_id, bitmap, bitmap_rect))) { + } else { + // TODO(scherkus): what to do ?!?! + } +} + +void VideoLayerProxy::OnMessageReceived(const IPC::Message& msg) { + IPC_BEGIN_MESSAGE_MAP(VideoLayerProxy, msg) + IPC_MESSAGE_HANDLER(GpuHostMsg_PaintToVideoLayer_ACK, + OnPaintToVideoLayerACK) + IPC_END_MESSAGE_MAP_EX() +} + +void VideoLayerProxy::OnChannelConnected(int32 peer_pid) { +} + +void VideoLayerProxy::OnChannelError() { +} + +void VideoLayerProxy::OnPaintToVideoLayerACK() { + // TODO(scherkus): we may not need to ACK video layer updates at all. + NOTIMPLEMENTED(); +} diff --git a/chrome/browser/renderer_host/video_layer_proxy.h b/chrome/browser/renderer_host/video_layer_proxy.h new file mode 100644 index 0000000..637525e --- /dev/null +++ b/chrome/browser/renderer_host/video_layer_proxy.h @@ -0,0 +1,43 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_RENDERER_HOST_VIDEO_LAYER_PROXY_H_ +#define CHROME_BROWSER_RENDERER_HOST_VIDEO_LAYER_PROXY_H_ + +#include "chrome/browser/renderer_host/video_layer.h" +#include "ipc/ipc_channel.h" + +class GpuProcessHost; + +// Proxies YUV video layer data to the GPU process for rendering. +class VideoLayerProxy : public VideoLayer, public IPC::Channel::Listener { + public: + VideoLayerProxy(RenderWidgetHost* widget, const gfx::Size& size, + GpuProcessHost* process, int32 routing_id); + virtual ~VideoLayerProxy(); + + // VideoLayer implementation. + virtual void CopyTransportDIB(RenderProcessHost* process, + TransportDIB::Id bitmap, + const gfx::Rect& bitmap_rect); + + // IPC::Channel::Listener implementation. + virtual void OnMessageReceived(const IPC::Message& message); + virtual void OnChannelConnected(int32 peer_pid); + virtual void OnChannelError(); + + private: + // Called when GPU process has finished painting the video layer. + void OnPaintToVideoLayerACK(); + + // GPU process receiving our proxied requests. + GpuProcessHost* process_; + + // IPC routing ID to use when communicating with the GPU process. + int32 routing_id_; + + DISALLOW_COPY_AND_ASSIGN(VideoLayerProxy); +}; + +#endif // CHROME_BROWSER_RENDERER_HOST_VIDEO_LAYER_PROXY_H_ diff --git a/chrome/browser/renderer_host/video_layer_x.h b/chrome/browser/renderer_host/video_layer_x.h index fbe45cc..ef97f30 100644 --- a/chrome/browser/renderer_host/video_layer_x.h +++ b/chrome/browser/renderer_host/video_layer_x.h @@ -15,6 +15,7 @@ class VideoLayerX : public VideoLayer { int depth); virtual ~VideoLayerX(); + // VideoLayer implementation. virtual void CopyTransportDIB(RenderProcessHost* process, TransportDIB::Id bitmap, const gfx::Rect& bitmap_rect); |