| 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/client/webgraphicscontext3d_command_buffer_impl.h" | 5 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
| 6 | 6 |
| 7 #include "third_party/khronos/GLES2/gl2.h" | 7 #include "third_party/khronos/GLES2/gl2.h" |
| 8 #ifndef GL_GLEXT_PROTOTYPES | 8 #ifndef GL_GLEXT_PROTOTYPES |
| 9 #define GL_GLEXT_PROTOTYPES 1 | 9 #define GL_GLEXT_PROTOTYPES 1 |
| 10 #endif | 10 #endif |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/message_loop/message_loop.h" | 22 #include "base/message_loop/message_loop.h" |
| 23 #include "base/metrics/field_trial.h" | 23 #include "base/metrics/field_trial.h" |
| 24 #include "base/metrics/histogram.h" | 24 #include "base/metrics/histogram.h" |
| 25 #include "content/common/gpu/client/gpu_channel_host.h" | 25 #include "content/common/gpu/client/gpu_channel_host.h" |
| 26 #include "content/public/common/content_constants.h" | 26 #include "content/public/common/content_constants.h" |
| 27 #include "content/public/common/content_switches.h" | 27 #include "content/public/common/content_switches.h" |
| 28 #include "gpu/GLES2/gl2extchromium.h" | 28 #include "gpu/GLES2/gl2extchromium.h" |
| 29 #include "gpu/command_buffer/client/gles2_cmd_helper.h" | 29 #include "gpu/command_buffer/client/gles2_cmd_helper.h" |
| 30 #include "gpu/command_buffer/client/gles2_implementation.h" | 30 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 31 #include "gpu/command_buffer/client/gles2_lib.h" | |
| 32 #include "gpu/command_buffer/client/gles2_trace_implementation.h" | 31 #include "gpu/command_buffer/client/gles2_trace_implementation.h" |
| 33 #include "gpu/command_buffer/client/transfer_buffer.h" | 32 #include "gpu/command_buffer/client/transfer_buffer.h" |
| 34 #include "gpu/command_buffer/common/constants.h" | 33 #include "gpu/command_buffer/common/constants.h" |
| 35 #include "gpu/command_buffer/common/gpu_memory_allocation.h" | 34 #include "gpu/command_buffer/common/gpu_memory_allocation.h" |
| 36 #include "gpu/command_buffer/common/mailbox.h" | 35 #include "gpu/command_buffer/common/mailbox.h" |
| 37 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" | 36 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" |
| 38 #include "third_party/skia/include/core/SkTypes.h" | 37 #include "third_party/skia/include/core/SkTypes.h" |
| 39 | 38 |
| 40 namespace content { | 39 namespace content { |
| 41 | 40 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 58 ShareGroupMap::iterator it = share_groups.find(host); | 57 ShareGroupMap::iterator it = share_groups.find(host); |
| 59 if (it == share_groups.end()) { | 58 if (it == share_groups.end()) { |
| 60 scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup> group = | 59 scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup> group = |
| 61 new WebGraphicsContext3DCommandBufferImpl::ShareGroup(); | 60 new WebGraphicsContext3DCommandBufferImpl::ShareGroup(); |
| 62 share_groups[host] = group; | 61 share_groups[host] = group; |
| 63 return group; | 62 return group; |
| 64 } | 63 } |
| 65 return it->second; | 64 return it->second; |
| 66 } | 65 } |
| 67 | 66 |
| 68 // Singleton used to initialize and terminate the gles2 library. | |
| 69 class GLES2Initializer { | |
| 70 public: | |
| 71 GLES2Initializer() { | |
| 72 gles2::Initialize(); | |
| 73 } | |
| 74 | |
| 75 ~GLES2Initializer() { | |
| 76 gles2::Terminate(); | |
| 77 } | |
| 78 | |
| 79 private: | |
| 80 DISALLOW_COPY_AND_ASSIGN(GLES2Initializer); | |
| 81 }; | |
| 82 | |
| 83 //////////////////////////////////////////////////////////////////////////////// | |
| 84 | |
| 85 base::LazyInstance<GLES2Initializer> g_gles2_initializer = | |
| 86 LAZY_INSTANCE_INITIALIZER; | |
| 87 | |
| 88 //////////////////////////////////////////////////////////////////////////////// | |
| 89 | |
| 90 } // namespace anonymous | 67 } // namespace anonymous |
| 91 | 68 |
| 92 WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits::SharedMemoryLimits() | 69 WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits::SharedMemoryLimits() |
| 93 : command_buffer_size(kDefaultCommandBufferSize), | 70 : command_buffer_size(kDefaultCommandBufferSize), |
| 94 start_transfer_buffer_size(kDefaultStartTransferBufferSize), | 71 start_transfer_buffer_size(kDefaultStartTransferBufferSize), |
| 95 min_transfer_buffer_size(kDefaultMinTransferBufferSize), | 72 min_transfer_buffer_size(kDefaultMinTransferBufferSize), |
| 96 max_transfer_buffer_size(kDefaultMaxTransferBufferSize), | 73 max_transfer_buffer_size(kDefaultMaxTransferBufferSize), |
| 97 mapped_memory_reclaim_limit(gpu::gles2::GLES2Implementation::kNoLimit) {} | 74 mapped_memory_reclaim_limit(gpu::gles2::GLES2Implementation::kNoLimit) {} |
| 98 | 75 |
| 99 WebGraphicsContext3DCommandBufferImpl::ShareGroup::ShareGroup() { | 76 WebGraphicsContext3DCommandBufferImpl::ShareGroup::ShareGroup() { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 << "Context dead on arrival. Last error: " | 196 << "Context dead on arrival. Last error: " |
| 220 << command_buffer_->GetLastError(); | 197 << command_buffer_->GetLastError(); |
| 221 // Initialize the command buffer. | 198 // Initialize the command buffer. |
| 222 bool result = command_buffer_->Initialize(); | 199 bool result = command_buffer_->Initialize(); |
| 223 LOG_IF(ERROR, !result) << "CommandBufferProxy::Initialize failed."; | 200 LOG_IF(ERROR, !result) << "CommandBufferProxy::Initialize failed."; |
| 224 return result; | 201 return result; |
| 225 } | 202 } |
| 226 | 203 |
| 227 bool WebGraphicsContext3DCommandBufferImpl::CreateContext(bool onscreen) { | 204 bool WebGraphicsContext3DCommandBufferImpl::CreateContext(bool onscreen) { |
| 228 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext"); | 205 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext"); |
| 229 // Ensure the gles2 library is initialized first in a thread safe way. | |
| 230 g_gles2_initializer.Get(); | |
| 231 | |
| 232 scoped_refptr<gpu::gles2::ShareGroup> gles2_share_group; | 206 scoped_refptr<gpu::gles2::ShareGroup> gles2_share_group; |
| 233 | 207 |
| 234 scoped_ptr<base::AutoLock> share_group_lock; | 208 scoped_ptr<base::AutoLock> share_group_lock; |
| 235 bool add_to_share_group = false; | 209 bool add_to_share_group = false; |
| 236 if (!command_buffer_) { | 210 if (!command_buffer_) { |
| 237 WebGraphicsContext3DCommandBufferImpl* share_context = NULL; | 211 WebGraphicsContext3DCommandBufferImpl* share_context = NULL; |
| 238 | 212 |
| 239 share_group_lock.reset(new base::AutoLock(share_group_->lock())); | 213 share_group_lock.reset(new base::AutoLock(share_group_->lock())); |
| 240 share_context = share_group_->GetAnyContextLocked(); | 214 share_context = share_group_->GetAnyContextLocked(); |
| 241 | 215 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 share_group_->AddContextLocked(this); | 263 share_group_->AddContextLocked(this); |
| 290 | 264 |
| 291 if (CommandLine::ForCurrentProcess()->HasSwitch( | 265 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 292 switches::kEnableGpuClientTracing)) { | 266 switches::kEnableGpuClientTracing)) { |
| 293 trace_gl_.reset(new gpu::gles2::GLES2TraceImplementation(GetGLInterface())); | 267 trace_gl_.reset(new gpu::gles2::GLES2TraceImplementation(GetGLInterface())); |
| 294 setGLInterface(trace_gl_.get()); | 268 setGLInterface(trace_gl_.get()); |
| 295 } | 269 } |
| 296 return true; | 270 return true; |
| 297 } | 271 } |
| 298 | 272 |
| 299 bool WebGraphicsContext3DCommandBufferImpl::makeContextCurrent() { | 273 bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread() { |
| 300 if (!MaybeInitializeGL()) { | 274 if (!MaybeInitializeGL()) { |
| 301 DLOG(ERROR) << "Failed to initialize context."; | 275 DLOG(ERROR) << "Failed to initialize context."; |
| 302 return false; | 276 return false; |
| 303 } | 277 } |
| 304 gles2::SetGLContext(GetGLInterface()); | |
| 305 if (gpu::error::IsError(command_buffer_->GetLastError())) { | 278 if (gpu::error::IsError(command_buffer_->GetLastError())) { |
| 306 LOG(ERROR) << "Context dead on arrival. Last error: " | 279 LOG(ERROR) << "Context dead on arrival. Last error: " |
| 307 << command_buffer_->GetLastError(); | 280 << command_buffer_->GetLastError(); |
| 308 return false; | 281 return false; |
| 309 } | 282 } |
| 310 | 283 |
| 311 return true; | 284 return true; |
| 312 } | 285 } |
| 313 | 286 |
| 314 void WebGraphicsContext3DCommandBufferImpl::Destroy() { | 287 void WebGraphicsContext3DCommandBufferImpl::Destroy() { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 share_group_->RemoveAllContexts(); | 395 share_group_->RemoveAllContexts(); |
| 423 | 396 |
| 424 DCHECK(host_.get()); | 397 DCHECK(host_.get()); |
| 425 { | 398 { |
| 426 base::AutoLock lock(g_default_share_groups_lock.Get()); | 399 base::AutoLock lock(g_default_share_groups_lock.Get()); |
| 427 g_default_share_groups.Get().erase(host_.get()); | 400 g_default_share_groups.Get().erase(host_.get()); |
| 428 } | 401 } |
| 429 } | 402 } |
| 430 | 403 |
| 431 } // namespace content | 404 } // namespace content |
| OLD | NEW |