Index: content/common/gpu/gpu_channel_manager.cc |
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc |
index 899da86e45f047842ab902387c699c612cdb8844..acfcbc15c173056987219bb58cee7ca8388c7057 100644 |
--- a/content/common/gpu/gpu_channel_manager.cc |
+++ b/content/common/gpu/gpu_channel_manager.cc |
@@ -46,6 +46,9 @@ GpuChannelManager::GpuChannelManager(MessageRouter* router, |
DCHECK(router_); |
DCHECK(io_message_loop); |
DCHECK(shutdown_event); |
+#if defined(USE_X11) |
+ gfx::X11PixmapTracker::InitInstance(this); |
+#endif |
} |
GpuChannelManager::~GpuChannelManager() { |
@@ -158,6 +161,9 @@ void GpuChannelManager::OnCloseChannel( |
for (GpuChannelMap::iterator iter = gpu_channels_.begin(); |
iter != gpu_channels_.end(); ++iter) { |
if (iter->second->GetChannelName() == channel_handle.name) { |
+#if defined(USE_X11) |
+ RemoveAllPixmaps(iter->first); |
+#endif |
gpu_channels_.erase(iter); |
return; |
} |
@@ -183,28 +189,48 @@ void GpuChannelManager::OnCreateViewCommandBuffer( |
} |
void GpuChannelManager::CreateImage( |
- gfx::PluginWindowHandle window, int32 client_id, int32 image_id) { |
- gfx::Size size; |
- |
- GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); |
- if (iter != gpu_channels_.end()) { |
- iter->second->CreateImage(window, image_id, &size); |
+ const gfx::GpuMemoryBufferHandle& handle, |
+ const gfx::Size& size, |
+ unsigned internalformat, |
+ int32 client_id, |
+ int32 image_id) { |
+ switch (handle.type) { |
+#if defined(USE_X11) |
+ case gfx::X11_PIXMAP_BUFFER: |
+ AddPixmap(handle.pixmap, |
+ handle.global_id.primary_id, |
+ handle.global_id.secondary_id); |
+ break; |
+#endif |
+ default: |
+ NOTIMPLEMENTED(); |
+ break; |
} |
- Send(new GpuHostMsg_ImageCreated(size)); |
+ GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); |
+ Send(new GpuHostMsg_ImageCreated( |
+ iter != gpu_channels_.end() |
+ ? iter->second->CreateImage(handle, size, internalformat, image_id) |
+ : false)); |
} |
void GpuChannelManager::OnCreateImage( |
- gfx::PluginWindowHandle window, int32 client_id, int32 image_id) { |
+ const gfx::GpuMemoryBufferHandle& handle, |
+ const gfx::Size& size, |
+ unsigned internalformat, |
+ int32 client_id, |
+ int32 image_id) { |
DCHECK(image_id); |
if (image_operations_.empty()) { |
- CreateImage(window, client_id, image_id); |
+ CreateImage(handle, size, internalformat, client_id, image_id); |
} else { |
image_operations_.push_back( |
new ImageOperation(0, base::Bind(&GpuChannelManager::CreateImage, |
base::Unretained(this), |
- window, |
+ handle, |
+ size, |
+ internalformat, |
client_id, |
image_id))); |
} |
@@ -307,6 +333,9 @@ void GpuChannelManager::LoseAllContexts() { |
void GpuChannelManager::OnLoseAllContexts() { |
gpu_channels_.clear(); |
+#if defined(USE_X11) |
+ pixmaps_.clear(); |
+#endif |
} |
gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() { |
@@ -317,4 +346,33 @@ gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() { |
return default_offscreen_surface_.get(); |
} |
+#if defined(USE_X11) |
+XID GpuChannelManager::AcquirePixmap(int primary_id, int secondary_id) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ X11PixmapMapKey key(primary_id, secondary_id); |
+ X11PixmapMap::iterator it = pixmaps_.find(key); |
+ if (it == pixmaps_.end()) |
+ return 0; |
+ XID pixmap = it->second; |
+ pixmaps_.erase(it); |
+ return pixmap; |
+} |
+ |
+void GpuChannelManager::AddPixmap(XID pixmap, int pixmap_id, int client_id) { |
+ X11PixmapMapKey key(pixmap_id, client_id); |
+ DCHECK(pixmaps_.find(key) == pixmaps_.end()); |
+ pixmaps_[key] = pixmap; |
+} |
+ |
+void GpuChannelManager::RemoveAllPixmaps(int client_id) { |
+ X11PixmapMap::iterator it = pixmaps_.begin(); |
+ while (it != pixmaps_.end()) { |
+ if (it->first.second == client_id) |
+ pixmaps_.erase(it++); |
+ else |
+ ++it; |
+ } |
+} |
+#endif |
+ |
} // namespace content |