diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-08 15:03:20 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-08 15:03:20 +0000 |
commit | 538195fb9b4d4adf1e1727d195c73eea2188ecef (patch) | |
tree | 812186ce4f826983be988974493ba8a34b5e89ec | |
parent | c9b773fc3fa283674623e2d2b274821e708559e2 (diff) | |
download | chromium_src-538195fb9b4d4adf1e1727d195c73eea2188ecef.zip chromium_src-538195fb9b4d4adf1e1727d195c73eea2188ecef.tar.gz chromium_src-538195fb9b4d4adf1e1727d195c73eea2188ecef.tar.bz2 |
ImageTransportSurface: Get rid of multiple inheritance.
This fixes a style guide violation where classes were inheriting from more than one non-pure interface. This refactoring is in preparation for having OSX use a similar code path.
Also some minor fixes to GLXImageTransportSurface:
- disable vsync in OnMakeCurrent because we are actually rendering offscreen via XComposite
- wait for SwapBuffersACK before processing more commands for flow control
BUG=none
TEST=3D CSS on TOUCH_UI build
Review URL: http://codereview.chromium.org/7839033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100145 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/common/gpu/gpu_channel_manager.cc | 8 | ||||
-rw-r--r-- | content/common/gpu/gpu_channel_manager.h | 2 | ||||
-rw-r--r-- | content/common/gpu/gpu_command_buffer_stub.cc | 6 | ||||
-rw-r--r-- | content/common/gpu/gpu_command_buffer_stub.h | 4 | ||||
-rw-r--r-- | content/common/gpu/image_transport_surface_linux.cc | 297 | ||||
-rw-r--r-- | content/common/gpu/image_transport_surface_linux.h | 75 |
6 files changed, 263 insertions, 129 deletions
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc index d9732fc..900e6eb 100644 --- a/content/common/gpu/gpu_channel_manager.cc +++ b/content/common/gpu/gpu_channel_manager.cc @@ -44,6 +44,14 @@ void GpuChannelManager::RemoveRoute(int32 routing_id) { gpu_child_thread_->RemoveRoute(routing_id); } +GpuChannel* GpuChannelManager::LookupChannel(int32 renderer_id) { + GpuChannelMap::const_iterator iter = gpu_channels_.find(renderer_id); + if (iter == gpu_channels_.end()) + return NULL; + else + return iter->second; +} + bool GpuChannelManager::OnMessageReceived(const IPC::Message& msg) { bool msg_is_ok = true; bool handled = true; diff --git a/content/common/gpu/gpu_channel_manager.h b/content/common/gpu/gpu_channel_manager.h index dd176aa..e650a9c 100644 --- a/content/common/gpu/gpu_channel_manager.h +++ b/content/common/gpu/gpu_channel_manager.h @@ -63,6 +63,8 @@ class GpuChannelManager : public IPC::Channel::Listener, void AddRoute(int32 routing_id, IPC::Channel::Listener* listener); void RemoveRoute(int32 routing_id); + GpuChannel* LookupChannel(int32 renderer_id); + private: // Message handlers. void OnEstablishChannel(int renderer_id); diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc index 645b95a..90c85da 100644 --- a/content/common/gpu/gpu_command_buffer_stub.cc +++ b/content/common/gpu/gpu_command_buffer_stub.cc @@ -153,7 +153,11 @@ void GpuCommandBufferStub::OnInitialize( scoped_refptr<gfx::GLSurface> surface; if (handle_) - surface = ImageTransportSurface::CreateSurface(this); + surface = ImageTransportSurface::CreateSurface( + channel_->gpu_channel_manager(), + render_view_id_, + renderer_id_, + route_id_); else surface = gfx::GLSurface::CreateOffscreenGLSurface(software_, gfx::Size(1, 1)); diff --git a/content/common/gpu/gpu_command_buffer_stub.h b/content/common/gpu/gpu_command_buffer_stub.h index d0319c6..c214aaa 100644 --- a/content/common/gpu/gpu_command_buffer_stub.h +++ b/content/common/gpu/gpu_command_buffer_stub.h @@ -12,6 +12,7 @@ #include <string> #include <vector> +#include "base/id_map.h" #include "base/memory/weak_ptr.h" #include "base/process.h" #include "base/task.h" @@ -60,9 +61,6 @@ class GpuCommandBufferStub // Get the GLContext associated with this object. gpu::GpuScheduler* scheduler() const { return scheduler_.get(); } - // Get the GpuChannel associated with this object. - GpuChannel* channel() const { return channel_; } - // Identifies the renderer process. int32 renderer_id() const { return renderer_id_; } diff --git a/content/common/gpu/image_transport_surface_linux.cc b/content/common/gpu/image_transport_surface_linux.cc index bc35cb5..c356160 100644 --- a/content/common/gpu/image_transport_surface_linux.cc +++ b/content/common/gpu/image_transport_surface_linux.cc @@ -34,7 +34,10 @@ namespace { class EGLImageTransportSurface : public ImageTransportSurface, public gfx::PbufferGLSurfaceEGL { public: - explicit EGLImageTransportSurface(GpuCommandBufferStub* stub); + EGLImageTransportSurface(GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id); // GLSurface implementation virtual bool Initialize() OVERRIDE; @@ -49,17 +52,19 @@ class EGLImageTransportSurface : public ImageTransportSurface, // ImageTransportSurface implementation virtual void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; virtual void OnBuffersSwappedACK() OVERRIDE; - virtual void Resize(gfx::Size size) OVERRIDE; + virtual void OnResize(gfx::Size size) OVERRIDE; private: virtual ~EGLImageTransportSurface() OVERRIDE; - void ReleaseSurface(scoped_refptr<AcceleratedSurface>& surface); + void ReleaseSurface(scoped_refptr<AcceleratedSurface>* surface); uint32 fbo_id_; scoped_refptr<AcceleratedSurface> back_surface_; scoped_refptr<AcceleratedSurface> front_surface_; + scoped_ptr<ImageTransportHelper> helper_; + DISALLOW_COPY_AND_ASSIGN(EGLImageTransportSurface); }; @@ -68,19 +73,23 @@ class EGLImageTransportSurface : public ImageTransportSurface, class GLXImageTransportSurface : public ImageTransportSurface, public gfx::NativeViewGLSurfaceGLX { public: - explicit GLXImageTransportSurface(GpuCommandBufferStub* stub); + GLXImageTransportSurface(GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id); // gfx::GLSurface implementation: virtual bool Initialize() OVERRIDE; virtual void Destroy() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; + virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE; protected: // ImageTransportSurface implementation: void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; void OnBuffersSwappedACK() OVERRIDE; - void Resize(gfx::Size size) OVERRIDE; + void OnResize(gfx::Size size) OVERRIDE; private: virtual ~GLXImageTransportSurface(); @@ -94,31 +103,45 @@ class GLXImageTransportSurface : public ImageTransportSurface, // Whether or not the image has been bound on the browser side. bool bound_; + // Whether or not we've set the swap interval on the associated context. + bool swap_interval_set_; + + scoped_ptr<ImageTransportHelper> helper_; + DISALLOW_COPY_AND_ASSIGN(GLXImageTransportSurface); }; -EGLImageTransportSurface::EGLImageTransportSurface(GpuCommandBufferStub* stub) - : ImageTransportSurface(stub), - gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)), - fbo_id_(0) { +EGLImageTransportSurface::EGLImageTransportSurface( + GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id) + : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)), + fbo_id_(0) { + helper_.reset(new ImageTransportHelper(this, + manager, + render_view_id, + renderer_id, + command_buffer_id)); } EGLImageTransportSurface::~EGLImageTransportSurface() { + Destroy(); } bool EGLImageTransportSurface::Initialize() { - if (!ImageTransportSurface::Initialize()) + if (!helper_->Initialize()) return false; return PbufferGLSurfaceEGL::Initialize(); } void EGLImageTransportSurface::Destroy() { if (back_surface_.get()) - ReleaseSurface(back_surface_); + ReleaseSurface(&back_surface_); if (front_surface_.get()) - ReleaseSurface(front_surface_); + ReleaseSurface(&front_surface_); - ImageTransportSurface::Destroy(); + helper_->Destroy(); PbufferGLSurfaceEGL::Destroy(); } @@ -132,7 +155,7 @@ void EGLImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { glGenFramebuffersEXT(1, &fbo_id_); glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_); - Resize(gfx::Size(1, 1)); + OnResize(gfx::Size(1, 1)); GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { @@ -145,21 +168,18 @@ unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() { } void EGLImageTransportSurface::ReleaseSurface( - scoped_refptr<AcceleratedSurface>& surface) { - if (surface.get()) { + scoped_refptr<AcceleratedSurface>* surface) { + if (surface->get()) { GpuHostMsg_AcceleratedSurfaceRelease_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); - params.identifier = back_surface_->pixmap(); - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); - surface = NULL; + params.identifier = (*surface)->pixmap(); + helper_->SendAcceleratedSurfaceRelease(params); + *surface = NULL; } } -void EGLImageTransportSurface::Resize(gfx::Size size) { +void EGLImageTransportSurface::OnResize(gfx::Size size) { if (back_surface_.get()) - ReleaseSurface(back_surface_); + ReleaseSurface(&back_surface_); back_surface_ = new AcceleratedSurface(size); glFramebufferTexture2DEXT(GL_FRAMEBUFFER, @@ -170,15 +190,12 @@ void EGLImageTransportSurface::Resize(gfx::Size size) { glFlush(); GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); params.width = size.width(); params.height = size.height(); params.identifier = back_surface_->pixmap(); - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); + helper_->SendAcceleratedSurfaceSetIOSurface(params); - scheduler()->SetScheduled(false); + helper_->SetScheduled(false); } bool EGLImageTransportSurface::SwapBuffers() { @@ -187,15 +204,12 @@ bool EGLImageTransportSurface::SwapBuffers() { glFlush(); GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); params.surface_id = front_surface_->pixmap(); - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); + helper_->SendAcceleratedSurfaceBuffersSwapped(params); gfx::Size expected_size = front_surface_->size(); if (!back_surface_.get() || back_surface_->size() != expected_size) { - Resize(expected_size); + OnResize(expected_size); } else { glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, @@ -203,7 +217,7 @@ bool EGLImageTransportSurface::SwapBuffers() { back_surface_->texture(), 0); } - scheduler()->SetScheduled(false); + helper_->SetScheduled(false); return true; } @@ -214,22 +228,32 @@ gfx::Size EGLImageTransportSurface::GetSize() { void EGLImageTransportSurface::OnSetSurfaceACK( uint64 surface_id) { DCHECK_EQ(back_surface_->pixmap(), surface_id); - scheduler()->SetScheduled(true); + helper_->SetScheduled(true); } void EGLImageTransportSurface::OnBuffersSwappedACK() { - scheduler()->SetScheduled(true); + helper_->SetScheduled(true); } -GLXImageTransportSurface::GLXImageTransportSurface(GpuCommandBufferStub* stub) - : ImageTransportSurface(stub), - gfx::NativeViewGLSurfaceGLX(), - dummy_parent_(0), - size_(1, 1), - bound_(false) { +GLXImageTransportSurface::GLXImageTransportSurface( + GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id) + : gfx::NativeViewGLSurfaceGLX(), + dummy_parent_(0), + size_(1, 1), + bound_(false), + swap_interval_set_(false) { + helper_.reset(new ImageTransportHelper(this, + manager, + render_view_id, + renderer_id, + command_buffer_id)); } GLXImageTransportSurface::~GLXImageTransportSurface() { + Destroy(); } bool GLXImageTransportSurface::Initialize() { @@ -268,9 +292,9 @@ bool GLXImageTransportSurface::Initialize() { } // Manual setting must be used to avoid unnecessary rendering by server. XCompositeRedirectWindow(dpy, window_, CompositeRedirectManual); - Resize(size_); + OnResize(size_); - if (!ImageTransportSurface::Initialize()) + if (!helper_->Initialize()) return false; return gfx::NativeViewGLSurfaceGLX::Initialize(); } @@ -285,21 +309,18 @@ void GLXImageTransportSurface::Destroy() { XDestroyWindow(dpy, dummy_parent_); } - ImageTransportSurface::Destroy(); + helper_->Destroy(); gfx::NativeViewGLSurfaceGLX::Destroy(); } void GLXImageTransportSurface::ReleaseSurface() { DCHECK(bound_); GpuHostMsg_AcceleratedSurfaceRelease_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); params.identifier = window_; - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); + helper_->SendAcceleratedSurfaceRelease(params); } -void GLXImageTransportSurface::Resize(gfx::Size size) { +void GLXImageTransportSurface::OnResize(gfx::Size size) { size_ = size; if (bound_) { ReleaseSurface(); @@ -311,15 +332,12 @@ void GLXImageTransportSurface::Resize(gfx::Size size) { XFlush(dpy); GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); params.width = size_.width(); params.height = size_.height(); params.identifier = window_; - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); + helper_->SendAcceleratedSurfaceSetIOSurface(params); - scheduler()->SetScheduled(false); + helper_->SetScheduled(false); } bool GLXImageTransportSurface::SwapBuffers() { @@ -327,12 +345,10 @@ bool GLXImageTransportSurface::SwapBuffers() { glFlush(); GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; - params.renderer_id = stub()->renderer_id(); - params.render_view_id = stub()->render_view_id(); params.surface_id = window_; - params.route_id = route_id(); - Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); + helper_->SendAcceleratedSurfaceBuffersSwapped(params); + helper_->SetScheduled(false); return true; } @@ -340,45 +356,96 @@ gfx::Size GLXImageTransportSurface::GetSize() { return size_; } +void GLXImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { + if (!swap_interval_set_) { + context->SetSwapInterval(0); + swap_interval_set_ = true; + } +} + void GLXImageTransportSurface::OnSetSurfaceACK( uint64 surface_id) { DCHECK(!bound_); bound_ = true; - scheduler()->SetScheduled(true); + helper_->SetScheduled(true); } void GLXImageTransportSurface::OnBuffersSwappedACK() { + helper_->SetScheduled(true); } } // namespace -ImageTransportSurface::ImageTransportSurface(GpuCommandBufferStub* stub) - : stub_(stub) { - GpuChannelManager* gpu_channel_manager - = stub_->channel()->gpu_channel_manager(); - route_id_ = gpu_channel_manager->GenerateRouteID(); - gpu_channel_manager->AddRoute(route_id_, this); +// static +scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( + GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id) { + scoped_refptr<gfx::GLSurface> surface; + switch (gfx::GetGLImplementation()) { + case gfx::kGLImplementationDesktopGL: + surface = new GLXImageTransportSurface(manager, + render_view_id, + renderer_id, + command_buffer_id); + break; + case gfx::kGLImplementationEGLGLES2: + surface = new EGLImageTransportSurface(manager, + render_view_id, + renderer_id, + command_buffer_id); + break; + default: + NOTREACHED(); + return NULL; + } + if (surface->Initialize()) + return surface; + else + return NULL; +} + +ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, + GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id) + : surface_(surface), + manager_(manager), + render_view_id_(render_view_id), + renderer_id_(renderer_id), + command_buffer_id_(command_buffer_id) { + route_id_ = manager_->GenerateRouteID(); + manager_->AddRoute(route_id_, this); } -ImageTransportSurface::~ImageTransportSurface() { - GpuChannelManager* gpu_channel_manager - = stub_->channel()->gpu_channel_manager(); - gpu_channel_manager->RemoveRoute(route_id_); +ImageTransportHelper::~ImageTransportHelper() { + manager_->RemoveRoute(route_id_); } -bool ImageTransportSurface::Initialize() { - scheduler()->SetResizeCallback( - NewCallback(this, &ImageTransportSurface::Resize)); +bool ImageTransportHelper::Initialize() { + gpu::GpuScheduler* scheduler = Scheduler(); + if (!scheduler) + return false; + + scheduler->SetResizeCallback( + NewCallback(this, &ImageTransportHelper::Resize)); + return true; } -void ImageTransportSurface::Destroy() { - scheduler()->SetResizeCallback(NULL); +void ImageTransportHelper::Destroy() { + gpu::GpuScheduler* scheduler = Scheduler(); + if (!scheduler) + return; + + scheduler->SetResizeCallback(NULL); } -bool ImageTransportSurface::OnMessageReceived(const IPC::Message& message) { +bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { bool handled = true; - IPC_BEGIN_MESSAGE_MAP(ImageTransportSurface, message) + IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_SetSurfaceACK, OnSetSurfaceACK) IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, @@ -388,35 +455,61 @@ bool ImageTransportSurface::OnMessageReceived(const IPC::Message& message) { return handled; } -bool ImageTransportSurface::Send(IPC::Message* message) { - GpuChannelManager* gpu_channel_manager = - stub_->channel()->gpu_channel_manager(); - return gpu_channel_manager->Send(message); +void ImageTransportHelper::SendAcceleratedSurfaceRelease( + GpuHostMsg_AcceleratedSurfaceRelease_Params params) { + params.renderer_id = renderer_id_; + params.render_view_id = render_view_id_; + params.route_id = route_id_; + manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); } -gpu::GpuScheduler* ImageTransportSurface::scheduler() { - return stub_->scheduler(); +void ImageTransportHelper::SendAcceleratedSurfaceSetIOSurface( + GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params) { + params.renderer_id = renderer_id_; + params.render_view_id = render_view_id_; + params.route_id = route_id_; + manager_->Send(new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); } -// static -scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( - GpuCommandBufferStub* stub) { - scoped_refptr<gfx::GLSurface> surface; - switch (gfx::GetGLImplementation()) { - case gfx::kGLImplementationDesktopGL: - surface = new GLXImageTransportSurface(stub); - break; - case gfx::kGLImplementationEGLGLES2: - surface = new EGLImageTransportSurface(stub); - break; - default: - NOTREACHED(); - return NULL; - } - if (surface->Initialize()) - return surface; - else +void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( + GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { + params.renderer_id = renderer_id_; + params.render_view_id = render_view_id_; + params.route_id = route_id_; + manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); +} + +void ImageTransportHelper::SetScheduled(bool is_scheduled) { + gpu::GpuScheduler* scheduler = Scheduler(); + if (!scheduler) + return; + + scheduler->SetScheduled(is_scheduled); +} + +void ImageTransportHelper::OnSetSurfaceACK(uint64 surface_id) { + surface_->OnSetSurfaceACK(surface_id); +} + +void ImageTransportHelper::OnBuffersSwappedACK() { + surface_->OnBuffersSwappedACK(); +} + +void ImageTransportHelper::Resize(gfx::Size size) { + surface_->OnResize(size); +} + +gpu::GpuScheduler* ImageTransportHelper::Scheduler() { + GpuChannel* channel = manager_->LookupChannel(renderer_id_); + if (!channel) return NULL; + + GpuCommandBufferStub* stub = + channel->LookupCommandBuffer(command_buffer_id_); + if (!stub) + return NULL; + + return stub->scheduler(); } #endif // defined(USE_GPU) diff --git a/content/common/gpu/image_transport_surface_linux.h b/content/common/gpu/image_transport_surface_linux.h index 6ad1d0b..ef25655 100644 --- a/content/common/gpu/image_transport_surface_linux.h +++ b/content/common/gpu/image_transport_surface_linux.h @@ -13,7 +13,11 @@ #include "ipc/ipc_message.h" #include "ui/gfx/size.h" -class GpuCommandBufferStub; +class GpuChannelManager; + +struct GpuHostMsg_AcceleratedSurfaceRelease_Params; +struct GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params; +struct GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params; namespace gfx { class GLSurface; @@ -23,12 +27,29 @@ namespace gpu { class GpuScheduler; } -class ImageTransportSurface : public IPC::Channel::Listener, - public IPC::Message::Sender { +class ImageTransportSurface { public: - // Creates the appropriate surface depending on the GL implementation + virtual void OnSetSurfaceACK(uint64 surface_id) = 0; + virtual void OnBuffersSwappedACK() = 0; + virtual void OnResize(gfx::Size size) = 0; + + // Creates the appropriate surface depending on the GL implementation. static scoped_refptr<gfx::GLSurface> - CreateSurface(GpuCommandBufferStub* stub); + CreateSurface(GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id); +}; + +class ImageTransportHelper : public IPC::Channel::Listener { + public: + // Takes weak pointers to objects that outlive the helper. + ImageTransportHelper(ImageTransportSurface* surface, + GpuChannelManager* manager, + int32 render_view_id, + int32 renderer_id, + int32 command_buffer_id); + ~ImageTransportHelper(); bool Initialize(); void Destroy(); @@ -36,32 +57,40 @@ class ImageTransportSurface : public IPC::Channel::Listener, // IPC::Channel::Listener implementation: virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; - // IPC::Message::Sender implementation: - virtual bool Send(IPC::Message* msg) OVERRIDE; + // Helper send functions. Caller fills in the surface specific params + // like size and surface id. The helper fills in the rest. + void SendAcceleratedSurfaceRelease( + GpuHostMsg_AcceleratedSurfaceRelease_Params params); + void SendAcceleratedSurfaceSetIOSurface( + GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params); + void SendAcceleratedSurfaceBuffersSwapped( + GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params); - protected: - explicit ImageTransportSurface(GpuCommandBufferStub* stub); - ~ImageTransportSurface(); + // Whether or not we should execute more commands. + void SetScheduled(bool is_scheduled); - // IPC::Message handlers - virtual void OnSetSurfaceACK(uint64 surface_id) = 0; - virtual void OnBuffersSwappedACK() = 0; + private: + gpu::GpuScheduler* Scheduler(); - // Resize the backbuffer - virtual void Resize(gfx::Size size) = 0; + // IPC::Message handlers. + void OnSetSurfaceACK(uint64 surface_id); + void OnBuffersSwappedACK(); - GpuCommandBufferStub* stub() { return stub_; } - gpu::GpuScheduler* scheduler(); - int32 route_id() { return route_id_; } + // Backbuffer resize callback. + void Resize(gfx::Size size); - private: - // Weak pointer. The stub outlives this surface. - GpuCommandBufferStub* stub_; + // Weak pointers that to objects that outlive this helper. + ImageTransportSurface* surface_; + GpuChannelManager* manager_; + + int32 render_view_id_; + int32 renderer_id_; + int32 command_buffer_id_; int32 route_id_; - DISALLOW_COPY_AND_ASSIGN(ImageTransportSurface); + DISALLOW_COPY_AND_ASSIGN(ImageTransportHelper); }; #endif // defined(ENABLE_GPU) -#endif // CONTENT_COMMON_GPU_EGL_IMAGE_TRANSPORT_SURFACE_LINUX_H_ +#endif // CONTENT_COMMON_GPU_IMAGE_TRANSPORT_SURFACE_LINUX_H_ |