Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/common/gpu/gpu_channel_manager.h" | 5 #include "content/common/gpu/gpu_channel_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/lazy_instance.h" | |
| 9 #include "content/common/gpu/gpu_channel.h" | 10 #include "content/common/gpu/gpu_channel.h" |
| 10 #include "content/common/gpu/gpu_memory_manager.h" | 11 #include "content/common/gpu/gpu_memory_manager.h" |
| 11 #include "content/common/gpu/gpu_messages.h" | 12 #include "content/common/gpu/gpu_messages.h" |
| 12 #include "content/common/gpu/sync_point_manager.h" | 13 #include "content/common/gpu/sync_point_manager.h" |
| 13 #include "content/common/message_router.h" | 14 #include "content/common/message_router.h" |
| 14 #include "gpu/command_buffer/service/feature_info.h" | 15 #include "gpu/command_buffer/service/feature_info.h" |
| 15 #include "gpu/command_buffer/service/gpu_switches.h" | 16 #include "gpu/command_buffer/service/gpu_switches.h" |
| 16 #include "gpu/command_buffer/service/mailbox_manager.h" | 17 #include "gpu/command_buffer/service/mailbox_manager.h" |
| 17 #include "gpu/command_buffer/service/memory_program_cache.h" | 18 #include "gpu/command_buffer/service/memory_program_cache.h" |
| 18 #include "gpu/command_buffer/service/shader_translator_cache.h" | 19 #include "gpu/command_buffer/service/shader_translator_cache.h" |
| 19 #include "ui/gl/gl_bindings.h" | 20 #include "ui/gl/gl_bindings.h" |
| 20 #include "ui/gl/gl_share_group.h" | 21 #include "ui/gl/gl_share_group.h" |
| 21 | 22 |
| 23 #if defined(USE_X11) | |
| 24 #include "ui/gl/x11_pixmap_tracker.h" | |
| 25 #endif | |
| 26 | |
| 22 namespace content { | 27 namespace content { |
| 28 namespace { | |
| 29 | |
| 30 #if defined(USE_X11) | |
| 31 class X11PixmapTrackerImpl : public gfx::X11PixmapTracker { | |
| 32 public: | |
| 33 // Overridden from gfx::X11PixmapTracker: | |
| 34 virtual XID AcquirePixmap(int primary_id, int secondary_id) OVERRIDE { | |
| 35 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 36 X11PixmapMapKey key(primary_id, secondary_id); | |
| 37 X11PixmapMap::iterator it = pixmaps_.find(key); | |
| 38 if (it == pixmaps_.end()) | |
| 39 return 0; | |
| 40 XID pixmap = it->second; | |
| 41 pixmaps_.erase(it); | |
| 42 return pixmap; | |
| 43 } | |
| 44 | |
| 45 void AddPixmap(XID pixmap, int pixmap_id, int child_process_id) { | |
| 46 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 47 X11PixmapMapKey key(pixmap_id, child_process_id); | |
| 48 DCHECK(pixmaps_.find(key) == pixmaps_.end()); | |
| 49 pixmaps_[key] = pixmap; | |
| 50 } | |
| 51 | |
| 52 void RemoveAllPixmaps(int child_process_id) { | |
| 53 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 54 X11PixmapMap::iterator it = pixmaps_.begin(); | |
| 55 while (it != pixmaps_.end()) { | |
| 56 if (it->first.second == child_process_id) | |
| 57 pixmaps_.erase(it++); | |
| 58 else | |
| 59 ++it; | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 private: | |
| 64 typedef std::pair<int, int> X11PixmapMapKey; | |
| 65 typedef base::hash_map<X11PixmapMapKey, XID> X11PixmapMap; | |
| 66 X11PixmapMap pixmaps_; | |
| 67 base::ThreadChecker thread_checker_; | |
| 68 }; | |
| 69 base::LazyInstance<X11PixmapTrackerImpl> g_x11_pixmap_tracker = | |
| 70 LAZY_INSTANCE_INITIALIZER; | |
|
piman
2014/06/13 17:14:21
Why not simply making it a member of GpuChannelMan
reveman
2014/06/13 18:50:34
No other reason than hiding as much as possible in
| |
| 71 #endif | |
| 72 | |
| 73 } // namespace | |
| 23 | 74 |
| 24 GpuChannelManager::ImageOperation::ImageOperation( | 75 GpuChannelManager::ImageOperation::ImageOperation( |
| 25 int32 sync_point, base::Closure callback) | 76 int32 sync_point, base::Closure callback) |
| 26 : sync_point(sync_point), | 77 : sync_point(sync_point), |
| 27 callback(callback) { | 78 callback(callback) { |
| 28 } | 79 } |
| 29 | 80 |
| 30 GpuChannelManager::ImageOperation::~ImageOperation() { | 81 GpuChannelManager::ImageOperation::~ImageOperation() { |
| 31 } | 82 } |
| 32 | 83 |
| 33 GpuChannelManager::GpuChannelManager(MessageRouter* router, | 84 GpuChannelManager::GpuChannelManager(MessageRouter* router, |
| 34 GpuWatchdog* watchdog, | 85 GpuWatchdog* watchdog, |
| 35 base::MessageLoopProxy* io_message_loop, | 86 base::MessageLoopProxy* io_message_loop, |
| 36 base::WaitableEvent* shutdown_event) | 87 base::WaitableEvent* shutdown_event) |
| 37 : weak_factory_(this), | 88 : weak_factory_(this), |
| 38 io_message_loop_(io_message_loop), | 89 io_message_loop_(io_message_loop), |
| 39 shutdown_event_(shutdown_event), | 90 shutdown_event_(shutdown_event), |
| 40 router_(router), | 91 router_(router), |
| 41 gpu_memory_manager_( | 92 gpu_memory_manager_( |
| 42 this, | 93 this, |
| 43 GpuMemoryManager::kDefaultMaxSurfacesWithFrontbufferSoftLimit), | 94 GpuMemoryManager::kDefaultMaxSurfacesWithFrontbufferSoftLimit), |
| 44 watchdog_(watchdog), | 95 watchdog_(watchdog), |
| 45 sync_point_manager_(new SyncPointManager) { | 96 sync_point_manager_(new SyncPointManager) { |
| 46 DCHECK(router_); | 97 DCHECK(router_); |
| 47 DCHECK(io_message_loop); | 98 DCHECK(io_message_loop); |
| 48 DCHECK(shutdown_event); | 99 DCHECK(shutdown_event); |
| 100 #if defined(USE_X11) | |
| 101 gfx::X11PixmapTracker::InitInstance(g_x11_pixmap_tracker.Pointer()); | |
| 102 #endif | |
| 49 } | 103 } |
| 50 | 104 |
| 51 GpuChannelManager::~GpuChannelManager() { | 105 GpuChannelManager::~GpuChannelManager() { |
| 52 gpu_channels_.clear(); | 106 gpu_channels_.clear(); |
| 53 if (default_offscreen_surface_.get()) { | 107 if (default_offscreen_surface_.get()) { |
| 54 default_offscreen_surface_->Destroy(); | 108 default_offscreen_surface_->Destroy(); |
| 55 default_offscreen_surface_ = NULL; | 109 default_offscreen_surface_ = NULL; |
| 56 } | 110 } |
| 57 DCHECK(image_operations_.empty()); | 111 DCHECK(image_operations_.empty()); |
| 58 } | 112 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 151 gpu_channels_.set(client_id, channel.Pass()); | 205 gpu_channels_.set(client_id, channel.Pass()); |
| 152 | 206 |
| 153 Send(new GpuHostMsg_ChannelEstablished(channel_handle)); | 207 Send(new GpuHostMsg_ChannelEstablished(channel_handle)); |
| 154 } | 208 } |
| 155 | 209 |
| 156 void GpuChannelManager::OnCloseChannel( | 210 void GpuChannelManager::OnCloseChannel( |
| 157 const IPC::ChannelHandle& channel_handle) { | 211 const IPC::ChannelHandle& channel_handle) { |
| 158 for (GpuChannelMap::iterator iter = gpu_channels_.begin(); | 212 for (GpuChannelMap::iterator iter = gpu_channels_.begin(); |
| 159 iter != gpu_channels_.end(); ++iter) { | 213 iter != gpu_channels_.end(); ++iter) { |
| 160 if (iter->second->GetChannelName() == channel_handle.name) { | 214 if (iter->second->GetChannelName() == channel_handle.name) { |
| 215 #if defined(USE_X11) | |
| 216 g_x11_pixmap_tracker.Pointer()->RemoveAllPixmaps(iter->first); | |
| 217 #endif | |
| 161 gpu_channels_.erase(iter); | 218 gpu_channels_.erase(iter); |
| 162 return; | 219 return; |
| 163 } | 220 } |
| 164 } | 221 } |
| 165 } | 222 } |
| 166 | 223 |
| 167 void GpuChannelManager::OnCreateViewCommandBuffer( | 224 void GpuChannelManager::OnCreateViewCommandBuffer( |
| 168 const gfx::GLSurfaceHandle& window, | 225 const gfx::GLSurfaceHandle& window, |
| 169 int32 surface_id, | 226 int32 surface_id, |
| 170 int32 client_id, | 227 int32 client_id, |
| 171 const GPUCreateCommandBufferConfig& init_params, | 228 const GPUCreateCommandBufferConfig& init_params, |
| 172 int32 route_id) { | 229 int32 route_id) { |
| 173 DCHECK(surface_id); | 230 DCHECK(surface_id); |
| 174 bool succeeded = false; | 231 bool succeeded = false; |
| 175 | 232 |
| 176 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); | 233 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); |
| 177 if (iter != gpu_channels_.end()) { | 234 if (iter != gpu_channels_.end()) { |
| 178 succeeded = iter->second->CreateViewCommandBuffer( | 235 succeeded = iter->second->CreateViewCommandBuffer( |
| 179 window, surface_id, init_params, route_id); | 236 window, surface_id, init_params, route_id); |
| 180 } | 237 } |
| 181 | 238 |
| 182 Send(new GpuHostMsg_CommandBufferCreated(succeeded)); | 239 Send(new GpuHostMsg_CommandBufferCreated(succeeded)); |
| 183 } | 240 } |
| 184 | 241 |
| 185 void GpuChannelManager::CreateImage( | 242 void GpuChannelManager::CreateImage( |
| 186 gfx::PluginWindowHandle window, int32 client_id, int32 image_id) { | 243 const gfx::GpuMemoryBufferHandle& handle, |
| 187 gfx::Size size; | 244 const gfx::Size& size, |
| 245 unsigned internalformat, | |
| 246 int32 client_id, | |
| 247 int32 image_id) { | |
| 248 switch (handle.type) { | |
| 249 #if defined(USE_X11) | |
| 250 case gfx::X11_PIXMAP_BUFFER: | |
| 251 g_x11_pixmap_tracker.Pointer()->AddPixmap(handle.pixmap, | |
| 252 handle.global_id.primary_id, | |
| 253 handle.global_id.secondary_id); | |
| 254 break; | |
| 255 #endif | |
| 256 default: | |
| 257 NOTIMPLEMENTED(); | |
| 258 break; | |
| 259 } | |
| 188 | 260 |
| 189 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); | 261 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); |
| 190 if (iter != gpu_channels_.end()) { | 262 Send(new GpuHostMsg_ImageCreated( |
| 191 iter->second->CreateImage(window, image_id, &size); | 263 iter != gpu_channels_.end() |
| 192 } | 264 ? iter->second->CreateImage(handle, size, internalformat, image_id) |
| 193 | 265 : false)); |
| 194 Send(new GpuHostMsg_ImageCreated(size)); | |
| 195 } | 266 } |
| 196 | 267 |
| 197 void GpuChannelManager::OnCreateImage( | 268 void GpuChannelManager::OnCreateImage( |
| 198 gfx::PluginWindowHandle window, int32 client_id, int32 image_id) { | 269 const gfx::GpuMemoryBufferHandle& handle, |
| 270 const gfx::Size& size, | |
| 271 unsigned internalformat, | |
| 272 int32 client_id, | |
| 273 int32 image_id) { | |
| 199 DCHECK(image_id); | 274 DCHECK(image_id); |
| 200 | 275 |
| 201 if (image_operations_.empty()) { | 276 if (image_operations_.empty()) { |
| 202 CreateImage(window, client_id, image_id); | 277 CreateImage(handle, size, internalformat, client_id, image_id); |
| 203 } else { | 278 } else { |
| 204 image_operations_.push_back( | 279 image_operations_.push_back( |
| 205 new ImageOperation(0, base::Bind(&GpuChannelManager::CreateImage, | 280 new ImageOperation(0, base::Bind(&GpuChannelManager::CreateImage, |
| 206 base::Unretained(this), | 281 base::Unretained(this), |
| 207 window, | 282 handle, |
| 283 size, | |
| 284 internalformat, | |
| 208 client_id, | 285 client_id, |
| 209 image_id))); | 286 image_id))); |
| 210 } | 287 } |
| 211 } | 288 } |
| 212 | 289 |
| 213 void GpuChannelManager::DeleteImage(int32 client_id, int32 image_id) { | 290 void GpuChannelManager::DeleteImage(int32 client_id, int32 image_id) { |
| 214 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); | 291 GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id); |
| 215 if (iter != gpu_channels_.end()) { | 292 if (iter != gpu_channels_.end()) { |
| 216 iter->second->DeleteImage(image_id); | 293 iter->second->DeleteImage(image_id); |
| 217 } | 294 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 311 | 388 |
| 312 gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() { | 389 gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() { |
| 313 if (!default_offscreen_surface_.get()) { | 390 if (!default_offscreen_surface_.get()) { |
| 314 default_offscreen_surface_ = | 391 default_offscreen_surface_ = |
| 315 gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()); | 392 gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()); |
| 316 } | 393 } |
| 317 return default_offscreen_surface_.get(); | 394 return default_offscreen_surface_.get(); |
| 318 } | 395 } |
| 319 | 396 |
| 320 } // namespace content | 397 } // namespace content |
| OLD | NEW |