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 "gpu/command_buffer/client/gl_in_process_context.h" | 5 #include "gpu/command_buffer/client/gl_in_process_context.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include <GLES2/gl2.h> | 11 #include <GLES2/gl2.h> |
| 12 #ifndef GL_GLEXT_PROTOTYPES | 12 #ifndef GL_GLEXT_PROTOTYPES |
| 13 #define GL_GLEXT_PROTOTYPES 1 | 13 #define GL_GLEXT_PROTOTYPES 1 |
| 14 #endif | 14 #endif |
| 15 #include <GLES2/gl2ext.h> | 15 #include <GLES2/gl2ext.h> |
| 16 #include <GLES2/gl2extchromium.h> | 16 #include <GLES2/gl2extchromium.h> |
| 17 | 17 |
| 18 #include "base/bind.h" | 18 #include "base/bind.h" |
| 19 #include "base/bind_helpers.h" | 19 #include "base/bind_helpers.h" |
| 20 #include "base/lazy_instance.h" | 20 #include "base/lazy_instance.h" |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
| 23 #include "base/memory/weak_ptr.h" | 23 #include "base/memory/weak_ptr.h" |
| 24 #include "base/message_loop/message_loop.h" | 24 #include "base/message_loop/message_loop.h" |
| 25 #include "gpu/command_buffer/client/gles2_implementation.h" | 25 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 26 #include "gpu/command_buffer/client/transfer_buffer.h" | 26 #include "gpu/command_buffer/client/transfer_buffer.h" |
| 27 #include "gpu/command_buffer/common/command_buffer.h" | 27 #include "gpu/command_buffer/common/command_buffer.h" |
| 28 #include "gpu/command_buffer/common/constants.h" | 28 #include "gpu/command_buffer/common/constants.h" |
| 29 #include "gpu/command_buffer/service/in_process_command_buffer.h" | |
| 30 #include "ui/gfx/size.h" | 29 #include "ui/gfx/size.h" |
| 31 #include "ui/gl/gl_image.h" | 30 #include "ui/gl/gl_image.h" |
| 32 | 31 |
| 33 #if defined(OS_ANDROID) | 32 #if defined(OS_ANDROID) |
| 34 #include "ui/gl/android/surface_texture.h" | 33 #include "ui/gl/android/surface_texture.h" |
| 35 #endif | 34 #endif |
| 36 | 35 |
| 37 namespace gpu { | 36 namespace gpu { |
| 38 | 37 |
| 39 namespace { | 38 namespace { |
| 40 | 39 |
| 41 const int32 kCommandBufferSize = 1024 * 1024; | 40 const int32 kCommandBufferSize = 1024 * 1024; |
| 42 // TODO(kbr): make the transfer buffer size configurable via context | 41 // TODO(kbr): make the transfer buffer size configurable via context |
| 43 // creation attributes. | 42 // creation attributes. |
| 44 const size_t kStartTransferBufferSize = 4 * 1024 * 1024; | 43 const size_t kStartTransferBufferSize = 4 * 1024 * 1024; |
| 45 const size_t kMinTransferBufferSize = 1 * 256 * 1024; | 44 const size_t kMinTransferBufferSize = 1 * 256 * 1024; |
| 46 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; | 45 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; |
| 47 | 46 |
| 48 class GLInProcessContextImpl | 47 class GLInProcessContextImpl |
| 49 : public GLInProcessContext, | 48 : public GLInProcessContext, |
| 50 public base::SupportsWeakPtr<GLInProcessContextImpl> { | 49 public base::SupportsWeakPtr<GLInProcessContextImpl> { |
| 51 public: | 50 public: |
| 52 explicit GLInProcessContextImpl(); | 51 explicit GLInProcessContextImpl(); |
| 53 virtual ~GLInProcessContextImpl(); | 52 virtual ~GLInProcessContextImpl(); |
| 54 | 53 |
| 55 bool Initialize(scoped_refptr<gfx::GLSurface> surface, | 54 bool Initialize( |
| 56 bool is_offscreen, | 55 scoped_refptr<gfx::GLSurface> surface, |
| 57 bool share_resources, | 56 bool is_offscreen, |
| 58 gfx::AcceleratedWidget window, | 57 bool use_global_share_group, |
| 59 const gfx::Size& size, | 58 GLInProcessContext* share_context, |
| 60 const GLInProcessContextAttribs& attribs, | 59 gfx::AcceleratedWidget window, |
| 61 gfx::GpuPreference gpu_preference); | 60 const gfx::Size& size, |
| 61 const GLInProcessContextAttribs& attribs, | |
| 62 gfx::GpuPreference gpu_preference, | |
| 63 const scoped_refptr<InProcessCommandBuffer::Service>& service); | |
| 62 | 64 |
| 63 // GLInProcessContext implementation: | 65 // GLInProcessContext implementation: |
| 64 virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; | 66 virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; |
| 65 virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE; | 67 virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE; |
| 66 | 68 |
| 67 #if defined(OS_ANDROID) | 69 #if defined(OS_ANDROID) |
| 68 virtual scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture( | 70 virtual scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture( |
| 69 uint32 stream_id) OVERRIDE; | 71 uint32 stream_id) OVERRIDE; |
| 70 #endif | 72 #endif |
| 71 | 73 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 void GLInProcessContextImpl::OnContextLost() { | 115 void GLInProcessContextImpl::OnContextLost() { |
| 114 context_lost_ = true; | 116 context_lost_ = true; |
| 115 if (!context_lost_callback_.is_null()) { | 117 if (!context_lost_callback_.is_null()) { |
| 116 context_lost_callback_.Run(); | 118 context_lost_callback_.Run(); |
| 117 } | 119 } |
| 118 } | 120 } |
| 119 | 121 |
| 120 bool GLInProcessContextImpl::Initialize( | 122 bool GLInProcessContextImpl::Initialize( |
| 121 scoped_refptr<gfx::GLSurface> surface, | 123 scoped_refptr<gfx::GLSurface> surface, |
| 122 bool is_offscreen, | 124 bool is_offscreen, |
| 123 bool share_resources, | 125 bool use_global_share_group, |
| 126 GLInProcessContext* share_context, | |
| 124 gfx::AcceleratedWidget window, | 127 gfx::AcceleratedWidget window, |
| 125 const gfx::Size& size, | 128 const gfx::Size& size, |
| 126 const GLInProcessContextAttribs& attribs, | 129 const GLInProcessContextAttribs& attribs, |
| 127 gfx::GpuPreference gpu_preference) { | 130 gfx::GpuPreference gpu_preference, |
| 131 const scoped_refptr<InProcessCommandBuffer::Service>& service) { | |
| 132 DCHECK(!use_global_share_group || !share_context); | |
| 128 DCHECK(size.width() >= 0 && size.height() >= 0); | 133 DCHECK(size.width() >= 0 && size.height() >= 0); |
| 129 | 134 |
| 130 // Changes to these values should also be copied to | 135 // Changes to these values should also be copied to |
| 131 // gpu/command_buffer/client/gl_in_process_context.cc and to | 136 // gpu/command_buffer/client/gl_in_process_context.cc and to |
| 132 // content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h | 137 // content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h |
| 133 const int32 ALPHA_SIZE = 0x3021; | 138 const int32 ALPHA_SIZE = 0x3021; |
| 134 const int32 BLUE_SIZE = 0x3022; | 139 const int32 BLUE_SIZE = 0x3022; |
| 135 const int32 GREEN_SIZE = 0x3023; | 140 const int32 GREEN_SIZE = 0x3023; |
| 136 const int32 RED_SIZE = 0x3024; | 141 const int32 RED_SIZE = 0x3024; |
| 137 const int32 DEPTH_SIZE = 0x3025; | 142 const int32 DEPTH_SIZE = 0x3025; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 attrib_vector.push_back(attribs.sample_buffers); | 182 attrib_vector.push_back(attribs.sample_buffers); |
| 178 } | 183 } |
| 179 if (attribs.fail_if_major_perf_caveat > 0) { | 184 if (attribs.fail_if_major_perf_caveat > 0) { |
| 180 attrib_vector.push_back(FAIL_IF_MAJOR_PERF_CAVEAT); | 185 attrib_vector.push_back(FAIL_IF_MAJOR_PERF_CAVEAT); |
| 181 attrib_vector.push_back(attribs.fail_if_major_perf_caveat); | 186 attrib_vector.push_back(attribs.fail_if_major_perf_caveat); |
| 182 } | 187 } |
| 183 attrib_vector.push_back(NONE); | 188 attrib_vector.push_back(NONE); |
| 184 | 189 |
| 185 base::Closure wrapped_callback = | 190 base::Closure wrapped_callback = |
| 186 base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); | 191 base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); |
| 187 command_buffer_.reset(new InProcessCommandBuffer()); | 192 command_buffer_.reset(new InProcessCommandBuffer(service)); |
|
piman
2014/02/12 04:10:42
Should we have a check somewhere that |service| is
no sievers
2014/02/12 22:31:29
I added a DCHECK() in InProcessCommandBuffer::Init
| |
| 188 | 193 |
| 189 scoped_ptr<base::AutoLock> scoped_shared_context_lock; | 194 scoped_ptr<base::AutoLock> scoped_shared_context_lock; |
| 190 scoped_refptr<gles2::ShareGroup> share_group; | 195 scoped_refptr<gles2::ShareGroup> share_group; |
| 191 InProcessCommandBuffer* share_command_buffer = NULL; | 196 InProcessCommandBuffer* share_command_buffer = NULL; |
| 192 if (share_resources) { | 197 if (use_global_share_group) { |
| 193 scoped_shared_context_lock.reset( | 198 scoped_shared_context_lock.reset( |
| 194 new base::AutoLock(g_all_shared_contexts_lock.Get())); | 199 new base::AutoLock(g_all_shared_contexts_lock.Get())); |
| 195 for (std::set<GLInProcessContextImpl*>::const_iterator it = | 200 for (std::set<GLInProcessContextImpl*>::const_iterator it = |
| 196 g_all_shared_contexts.Get().begin(); | 201 g_all_shared_contexts.Get().begin(); |
| 197 it != g_all_shared_contexts.Get().end(); | 202 it != g_all_shared_contexts.Get().end(); |
| 198 it++) { | 203 it++) { |
| 199 const GLInProcessContextImpl* context = *it; | 204 const GLInProcessContextImpl* context = *it; |
| 200 if (!context->context_lost_) { | 205 if (!context->context_lost_) { |
| 201 share_group = context->gles2_implementation_->share_group(); | 206 share_group = context->gles2_implementation_->share_group(); |
| 202 share_command_buffer = context->command_buffer_.get(); | 207 share_command_buffer = context->command_buffer_.get(); |
| 203 DCHECK(share_group); | 208 DCHECK(share_group); |
| 204 DCHECK(share_command_buffer); | 209 DCHECK(share_command_buffer); |
| 205 break; | 210 break; |
| 206 } | 211 } |
| 207 } | 212 } |
| 213 } else if (share_context) { | |
| 214 GLInProcessContextImpl* impl = | |
| 215 static_cast<GLInProcessContextImpl*>(share_context); | |
| 216 share_group = impl->gles2_implementation_->share_group(); | |
| 217 share_command_buffer = impl->command_buffer_.get(); | |
| 218 DCHECK(share_group); | |
| 219 DCHECK(share_command_buffer); | |
| 208 } | 220 } |
| 221 | |
| 209 if (!command_buffer_->Initialize(surface, | 222 if (!command_buffer_->Initialize(surface, |
| 210 is_offscreen, | 223 is_offscreen, |
| 211 window, | 224 window, |
| 212 size, | 225 size, |
| 213 attrib_vector, | 226 attrib_vector, |
| 214 gpu_preference, | 227 gpu_preference, |
| 215 wrapped_callback, | 228 wrapped_callback, |
| 216 share_command_buffer)) { | 229 share_command_buffer)) { |
| 217 LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; | 230 LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; |
| 218 return false; | 231 return false; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 234 | 247 |
| 235 // Create the object exposing the OpenGL API. | 248 // Create the object exposing the OpenGL API. |
| 236 gles2_implementation_.reset(new gles2::GLES2Implementation( | 249 gles2_implementation_.reset(new gles2::GLES2Implementation( |
| 237 gles2_helper_.get(), | 250 gles2_helper_.get(), |
| 238 share_group, | 251 share_group, |
| 239 transfer_buffer_.get(), | 252 transfer_buffer_.get(), |
| 240 bind_generates_resources, | 253 bind_generates_resources, |
| 241 free_everything_when_invisible, | 254 free_everything_when_invisible, |
| 242 command_buffer_.get())); | 255 command_buffer_.get())); |
| 243 | 256 |
| 244 if (share_resources) { | 257 if (use_global_share_group) { |
| 245 g_all_shared_contexts.Get().insert(this); | 258 g_all_shared_contexts.Get().insert(this); |
| 246 scoped_shared_context_lock.reset(); | 259 scoped_shared_context_lock.reset(); |
| 247 } | 260 } |
| 248 | 261 |
| 249 if (!gles2_implementation_->Initialize( | 262 if (!gles2_implementation_->Initialize( |
| 250 kStartTransferBufferSize, | 263 kStartTransferBufferSize, |
| 251 kMinTransferBufferSize, | 264 kMinTransferBufferSize, |
| 252 kMaxTransferBufferSize, | 265 kMaxTransferBufferSize, |
| 253 gles2::GLES2Implementation::kNoLimit)) { | 266 gles2::GLES2Implementation::kNoLimit)) { |
| 254 return false; | 267 return false; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 300 const gfx::Size& size, | 313 const gfx::Size& size, |
| 301 bool share_resources, | 314 bool share_resources, |
| 302 const GLInProcessContextAttribs& attribs, | 315 const GLInProcessContextAttribs& attribs, |
| 303 gfx::GpuPreference gpu_preference) { | 316 gfx::GpuPreference gpu_preference) { |
| 304 scoped_ptr<GLInProcessContextImpl> context( | 317 scoped_ptr<GLInProcessContextImpl> context( |
| 305 new GLInProcessContextImpl()); | 318 new GLInProcessContextImpl()); |
| 306 if (!context->Initialize( | 319 if (!context->Initialize( |
| 307 NULL /* surface */, | 320 NULL /* surface */, |
| 308 is_offscreen, | 321 is_offscreen, |
| 309 share_resources, | 322 share_resources, |
| 323 NULL, | |
| 310 window, | 324 window, |
| 311 size, | 325 size, |
| 312 attribs, | 326 attribs, |
| 313 gpu_preference)) | 327 gpu_preference, |
| 328 scoped_refptr<InProcessCommandBuffer::Service>())) | |
| 314 return NULL; | 329 return NULL; |
| 315 | 330 |
| 316 return context.release(); | 331 return context.release(); |
| 317 } | 332 } |
| 318 | 333 |
| 319 // static | 334 // static |
| 320 GLInProcessContext* GLInProcessContext::CreateWithSurface( | 335 GLInProcessContext* GLInProcessContext::CreateWithSurface( |
| 321 scoped_refptr<gfx::GLSurface> surface, | 336 scoped_refptr<gfx::GLSurface> surface, |
| 322 bool share_resources, | 337 scoped_refptr<gpu::InProcessCommandBuffer::Service> service, |
| 338 GLInProcessContext* share_context, | |
| 323 const GLInProcessContextAttribs& attribs, | 339 const GLInProcessContextAttribs& attribs, |
| 324 gfx::GpuPreference gpu_preference) { | 340 gfx::GpuPreference gpu_preference) { |
| 325 scoped_ptr<GLInProcessContextImpl> context( | 341 scoped_ptr<GLInProcessContextImpl> context( |
| 326 new GLInProcessContextImpl()); | 342 new GLInProcessContextImpl()); |
| 327 if (!context->Initialize( | 343 if (!context->Initialize( |
| 328 surface, | 344 surface, |
| 329 surface->IsOffscreen(), | 345 surface->IsOffscreen(), |
| 330 share_resources, | 346 false, |
| 347 share_context, | |
| 331 gfx::kNullAcceleratedWidget, | 348 gfx::kNullAcceleratedWidget, |
| 332 surface->GetSize(), | 349 surface->GetSize(), |
| 333 attribs, | 350 attribs, |
| 334 gpu_preference)) | 351 gpu_preference, |
| 352 service)) | |
| 335 return NULL; | 353 return NULL; |
| 336 | 354 |
| 337 return context.release(); | 355 return context.release(); |
| 338 } | 356 } |
| 339 | 357 |
| 340 } // namespace gpu | 358 } // namespace gpu |
| OLD | NEW |