Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: gpu/command_buffer/client/gl_in_process_context.cc

Issue 20017005: gpu: Refactor GpuMemoryBuffer framework for multi-process support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/gpu_memory_buffer_factory.h"
27 #include "gpu/command_buffer/client/image_factory.h"
28 #include "gpu/command_buffer/client/transfer_buffer.h" 26 #include "gpu/command_buffer/client/transfer_buffer.h"
29 #include "gpu/command_buffer/common/command_buffer.h" 27 #include "gpu/command_buffer/common/command_buffer.h"
30 #include "gpu/command_buffer/common/constants.h" 28 #include "gpu/command_buffer/common/constants.h"
31 #include "gpu/command_buffer/service/in_process_command_buffer.h" 29 #include "gpu/command_buffer/service/in_process_command_buffer.h"
32 #include "ui/gfx/size.h" 30 #include "ui/gfx/size.h"
33 #include "ui/gl/gl_image.h" 31 #include "ui/gl/gl_image.h"
34 32
35 namespace gpu { 33 namespace gpu {
36 34
37 namespace { 35 namespace {
38 36
39 const int32 kCommandBufferSize = 1024 * 1024; 37 const int32 kCommandBufferSize = 1024 * 1024;
40 // TODO(kbr): make the transfer buffer size configurable via context 38 // TODO(kbr): make the transfer buffer size configurable via context
41 // creation attributes. 39 // creation attributes.
42 const size_t kStartTransferBufferSize = 4 * 1024 * 1024; 40 const size_t kStartTransferBufferSize = 4 * 1024 * 1024;
43 const size_t kMinTransferBufferSize = 1 * 256 * 1024; 41 const size_t kMinTransferBufferSize = 1 * 256 * 1024;
44 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; 42 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024;
45 43
46 static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
47
48 class GLInProcessContextImpl 44 class GLInProcessContextImpl
49 : public GLInProcessContext, 45 : public GLInProcessContext,
50 public gles2::ImageFactory,
51 public base::SupportsWeakPtr<GLInProcessContextImpl> { 46 public base::SupportsWeakPtr<GLInProcessContextImpl> {
52 public: 47 public:
53 explicit GLInProcessContextImpl(); 48 explicit GLInProcessContextImpl();
54 virtual ~GLInProcessContextImpl(); 49 virtual ~GLInProcessContextImpl();
55 50
56 bool Initialize(scoped_refptr<gfx::GLSurface> surface, 51 bool Initialize(scoped_refptr<gfx::GLSurface> surface,
57 bool is_offscreen, 52 bool is_offscreen,
58 bool share_resources, 53 bool share_resources,
59 gfx::AcceleratedWidget window, 54 gfx::AcceleratedWidget window,
60 const gfx::Size& size, 55 const gfx::Size& size,
61 const char* allowed_extensions, 56 const char* allowed_extensions,
62 const GLInProcessContextAttribs& attribs, 57 const GLInProcessContextAttribs& attribs,
63 gfx::GpuPreference gpu_preference); 58 gfx::GpuPreference gpu_preference);
64 59
65 // GLInProcessContext implementation: 60 // GLInProcessContext implementation:
66 virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; 61 virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE;
67 virtual void SignalSyncPoint(unsigned sync_point, 62 virtual void SignalSyncPoint(unsigned sync_point,
68 const base::Closure& callback) OVERRIDE; 63 const base::Closure& callback) OVERRIDE;
69 virtual void SignalQuery(unsigned query, const base::Closure& callback) 64 virtual void SignalQuery(unsigned query, const base::Closure& callback)
70 OVERRIDE; 65 OVERRIDE;
71 virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE; 66 virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE;
72 67
73 // ImageFactory implementation:
74 virtual scoped_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
75 int width, int height, GLenum internalformat,
76 unsigned* image_id) OVERRIDE;
77 virtual void DeleteGpuMemoryBuffer(unsigned image_id) OVERRIDE;
78
79 private: 68 private:
80 void Destroy(); 69 void Destroy();
81 void PollQueryCallbacks(); 70 void PollQueryCallbacks();
82 void CallQueryCallback(size_t index); 71 void CallQueryCallback(size_t index);
83 void OnContextLost(); 72 void OnContextLost();
84 void OnSignalSyncPoint(const base::Closure& callback); 73 void OnSignalSyncPoint(const base::Closure& callback);
85 74
86 scoped_ptr<gles2::GLES2CmdHelper> gles2_helper_; 75 scoped_ptr<gles2::GLES2CmdHelper> gles2_helper_;
87 scoped_ptr<TransferBuffer> transfer_buffer_; 76 scoped_ptr<TransferBuffer> transfer_buffer_;
88 scoped_ptr<gles2::GLES2Implementation> gles2_implementation_; 77 scoped_ptr<gles2::GLES2Implementation> gles2_implementation_;
(...skipping 12 matching lines...) Expand all
101 base::LazyInstance<base::Lock> g_all_shared_contexts_lock = 90 base::LazyInstance<base::Lock> g_all_shared_contexts_lock =
102 LAZY_INSTANCE_INITIALIZER; 91 LAZY_INSTANCE_INITIALIZER;
103 base::LazyInstance<std::set<GLInProcessContextImpl*> > g_all_shared_contexts = 92 base::LazyInstance<std::set<GLInProcessContextImpl*> > g_all_shared_contexts =
104 LAZY_INSTANCE_INITIALIZER; 93 LAZY_INSTANCE_INITIALIZER;
105 94
106 size_t SharedContextCount() { 95 size_t SharedContextCount() {
107 base::AutoLock lock(g_all_shared_contexts_lock.Get()); 96 base::AutoLock lock(g_all_shared_contexts_lock.Get());
108 return g_all_shared_contexts.Get().size(); 97 return g_all_shared_contexts.Get().size();
109 } 98 }
110 99
111 scoped_ptr<gfx::GpuMemoryBuffer> GLInProcessContextImpl::CreateGpuMemoryBuffer(
112 int width, int height, GLenum internalformat, unsigned int* image_id) {
113 scoped_ptr<gfx::GpuMemoryBuffer> buffer(
114 g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer(width,
115 height,
116 internalformat));
117 if (!buffer)
118 return scoped_ptr<gfx::GpuMemoryBuffer>();
119
120 *image_id = command_buffer_->CreateImageForGpuMemoryBuffer(
121 buffer->GetHandle(), gfx::Size(width, height));
122 return buffer.Pass();
123 }
124
125 void GLInProcessContextImpl::DeleteGpuMemoryBuffer(unsigned int image_id) {
126 command_buffer_->RemoveImage(image_id);
127 }
128
129 GLInProcessContextImpl::GLInProcessContextImpl() 100 GLInProcessContextImpl::GLInProcessContextImpl()
130 : share_group_id_(0), context_lost_(false) {} 101 : share_group_id_(0), context_lost_(false) {}
131 102
132 GLInProcessContextImpl::~GLInProcessContextImpl() { 103 GLInProcessContextImpl::~GLInProcessContextImpl() {
133 { 104 {
134 base::AutoLock lock(g_all_shared_contexts_lock.Get()); 105 base::AutoLock lock(g_all_shared_contexts_lock.Get());
135 g_all_shared_contexts.Get().erase(this); 106 g_all_shared_contexts.Get().erase(this);
136 } 107 }
137 Destroy(); 108 Destroy();
138 } 109 }
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 243
273 // Create a transfer buffer. 244 // Create a transfer buffer.
274 transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); 245 transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get()));
275 246
276 // Create the object exposing the OpenGL API. 247 // Create the object exposing the OpenGL API.
277 gles2_implementation_.reset(new gles2::GLES2Implementation( 248 gles2_implementation_.reset(new gles2::GLES2Implementation(
278 gles2_helper_.get(), 249 gles2_helper_.get(),
279 share_group, 250 share_group,
280 transfer_buffer_.get(), 251 transfer_buffer_.get(),
281 false, 252 false,
282 this)); 253 command_buffer_.get()));
283 254
284 if (share_resources) { 255 if (share_resources) {
285 g_all_shared_contexts.Get().insert(this); 256 g_all_shared_contexts.Get().insert(this);
286 scoped_shared_context_lock.reset(); 257 scoped_shared_context_lock.reset();
287 } 258 }
288 259
289 if (!gles2_implementation_->Initialize( 260 if (!gles2_implementation_->Initialize(
290 kStartTransferBufferSize, 261 kStartTransferBufferSize,
291 kMinTransferBufferSize, 262 kMinTransferBufferSize,
292 kMaxTransferBufferSize)) { 263 kMaxTransferBufferSize)) {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 gfx::kNullAcceleratedWidget, 385 gfx::kNullAcceleratedWidget,
415 surface->GetSize(), 386 surface->GetSize(),
416 allowed_extensions, 387 allowed_extensions,
417 attribs, 388 attribs,
418 gpu_preference)) 389 gpu_preference))
419 return NULL; 390 return NULL;
420 391
421 return context.release(); 392 return context.release();
422 } 393 }
423 394
424 // static
425 void GLInProcessContext::SetGpuMemoryBufferFactory(
426 GpuMemoryBufferFactory* factory) {
427 DCHECK_EQ(0u, SharedContextCount());
428 g_gpu_memory_buffer_factory = factory;
429 }
430
431 } // namespace gpu 395 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gl_in_process_context.h ('k') | gpu/command_buffer/client/gles2_implementation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698