summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 15:03:20 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 15:03:20 +0000
commit538195fb9b4d4adf1e1727d195c73eea2188ecef (patch)
tree812186ce4f826983be988974493ba8a34b5e89ec
parentc9b773fc3fa283674623e2d2b274821e708559e2 (diff)
downloadchromium_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.cc8
-rw-r--r--content/common/gpu/gpu_channel_manager.h2
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.cc6
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.h4
-rw-r--r--content/common/gpu/image_transport_surface_linux.cc297
-rw-r--r--content/common/gpu/image_transport_surface_linux.h75
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_