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

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

Issue 20658002: gpu: Add GpuMemoryBufferFactory interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use CHECK_EQ 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 <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include <GLES2/gl2.h> 10 #include <GLES2/gl2.h>
11 #ifndef GL_GLEXT_PROTOTYPES 11 #ifndef GL_GLEXT_PROTOTYPES
12 #define GL_GLEXT_PROTOTYPES 1 12 #define GL_GLEXT_PROTOTYPES 1
13 #endif 13 #endif
14 #include <GLES2/gl2ext.h> 14 #include <GLES2/gl2ext.h>
15 #include <GLES2/gl2extchromium.h> 15 #include <GLES2/gl2extchromium.h>
16 16
17 #include "base/bind.h" 17 #include "base/bind.h"
18 #include "base/bind_helpers.h" 18 #include "base/bind_helpers.h"
19 #include "base/callback.h" 19 #include "base/callback.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 "base/synchronization/lock.h" 25 #include "base/synchronization/lock.h"
26 #include "gpu/command_buffer/client/gles2_implementation.h" 26 #include "gpu/command_buffer/client/gles2_implementation.h"
27 #include "gpu/command_buffer/client/gpu_memory_buffer.h" 27 #include "gpu/command_buffer/client/gpu_memory_buffer.h"
28 #include "gpu/command_buffer/client/gpu_memory_buffer_factory.h"
28 #include "gpu/command_buffer/client/image_factory.h" 29 #include "gpu/command_buffer/client/image_factory.h"
29 #include "gpu/command_buffer/client/transfer_buffer.h" 30 #include "gpu/command_buffer/client/transfer_buffer.h"
30 #include "gpu/command_buffer/common/constants.h" 31 #include "gpu/command_buffer/common/constants.h"
31 #include "gpu/command_buffer/common/id_allocator.h" 32 #include "gpu/command_buffer/common/id_allocator.h"
32 #include "gpu/command_buffer/service/command_buffer_service.h" 33 #include "gpu/command_buffer/service/command_buffer_service.h"
33 #include "gpu/command_buffer/service/context_group.h" 34 #include "gpu/command_buffer/service/context_group.h"
34 #include "gpu/command_buffer/service/gl_context_virtual.h" 35 #include "gpu/command_buffer/service/gl_context_virtual.h"
35 #include "gpu/command_buffer/service/gpu_scheduler.h" 36 #include "gpu/command_buffer/service/gpu_scheduler.h"
36 #include "gpu/command_buffer/service/image_manager.h" 37 #include "gpu/command_buffer/service/image_manager.h"
37 #include "gpu/command_buffer/service/transfer_buffer_manager.h" 38 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
(...skipping 25 matching lines...) Expand all
63 LAZY_INSTANCE_INITIALIZER; 64 LAZY_INSTANCE_INITIALIZER;
64 65
65 class GLInProcessContextImpl; 66 class GLInProcessContextImpl;
66 67
67 static base::LazyInstance< 68 static base::LazyInstance<
68 std::set<GLInProcessContextImpl*> > 69 std::set<GLInProcessContextImpl*> >
69 g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER; 70 g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER;
70 71
71 static bool g_use_virtualized_gl_context = false; 72 static bool g_use_virtualized_gl_context = false;
72 73
73 static GLInProcessContext::GpuMemoryBufferCreator* g_gpu_memory_buffer_creator = 74 static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
74 NULL;
75 75
76 // Also calls DetachFromThreadHack on all GLES2Decoders before the lock is 76 // Also calls DetachFromThreadHack on all GLES2Decoders before the lock is
77 // released to maintain the invariant that all decoders are unbound while the 77 // released to maintain the invariant that all decoders are unbound while the
78 // lock is not held. This is to workaround DumpRenderTree using WGC3DIPCBI with 78 // lock is not held. This is to workaround DumpRenderTree using WGC3DIPCBI with
79 // shared resources on different threads. 79 // shared resources on different threads.
80 // Remove this as part of crbug.com/234964. 80 // Remove this as part of crbug.com/234964.
81 class AutoLockAndDecoderDetachThread { 81 class AutoLockAndDecoderDetachThread {
82 public: 82 public:
83 AutoLockAndDecoderDetachThread( 83 AutoLockAndDecoderDetachThread(
84 base::Lock& lock, 84 base::Lock& lock,
85 const std::set<GLInProcessContextImpl*>& contexts); 85 const std::set<GLInProcessContextImpl*>& contexts);
86 ~AutoLockAndDecoderDetachThread(); 86 ~AutoLockAndDecoderDetachThread();
87 87
88 private: 88 private:
89 base::AutoLock auto_lock_; 89 base::AutoLock auto_lock_;
90 const std::set<GLInProcessContextImpl*>& contexts_; 90 const std::set<GLInProcessContextImpl*>& contexts_;
91 }; 91 };
92 92
93 size_t SharedContextCount() {
94 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
95 g_all_shared_contexts.Get());
96 return g_all_shared_contexts.Get().size();
97 }
98
93 class GLInProcessContextImpl 99 class GLInProcessContextImpl
94 : public GLInProcessContext, 100 : public GLInProcessContext,
95 public gles2::ImageFactory, 101 public gles2::ImageFactory,
96 public base::SupportsWeakPtr<GLInProcessContextImpl> { 102 public base::SupportsWeakPtr<GLInProcessContextImpl> {
97 public: 103 public:
98 explicit GLInProcessContextImpl(bool share_resources); 104 explicit GLInProcessContextImpl(bool share_resources);
99 virtual ~GLInProcessContextImpl(); 105 virtual ~GLInProcessContextImpl();
100 106
101 bool Initialize(bool is_offscreen, 107 bool Initialize(bool is_offscreen,
102 gfx::AcceleratedWidget window, 108 gfx::AcceleratedWidget window,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 contexts_.end(), 179 contexts_.end(),
174 &DetachThread); 180 &DetachThread);
175 } 181 }
176 182
177 scoped_ptr<GpuMemoryBuffer> GLInProcessContextImpl::CreateGpuMemoryBuffer( 183 scoped_ptr<GpuMemoryBuffer> GLInProcessContextImpl::CreateGpuMemoryBuffer(
178 int width, int height, GLenum internalformat, unsigned int* image_id) { 184 int width, int height, GLenum internalformat, unsigned int* image_id) {
179 // We're taking the lock here because we're accessing the ContextGroup's 185 // We're taking the lock here because we're accessing the ContextGroup's
180 // shared IdManager. 186 // shared IdManager.
181 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), 187 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
182 g_all_shared_contexts.Get()); 188 g_all_shared_contexts.Get());
183 // For Android WebView we assume the |internalformat| will always be 189 scoped_ptr<GpuMemoryBuffer> buffer(
184 // GL_RGBA8_OES. 190 g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer(width,
185 DCHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat); 191 height,
186 scoped_ptr<GpuMemoryBuffer> buffer = 192 internalformat));
187 g_gpu_memory_buffer_creator(width, height); 193 if (!buffer)
188 194 return scoped_ptr<GpuMemoryBuffer>();
189 if (buffer.get() == NULL)
190 return buffer.Pass();
191 195
192 scoped_refptr<gfx::GLImage> gl_image = 196 scoped_refptr<gfx::GLImage> gl_image =
193 gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer->GetNativeBuffer(), 197 gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer->GetNativeBuffer(),
194 gfx::Size(width, height)); 198 gfx::Size(width, height));
195 *image_id = decoder_->GetContextGroup() 199 *image_id = decoder_->GetContextGroup()
196 ->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID(); 200 ->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID();
197 GetImageManager()->AddImage(gl_image.get(), *image_id); 201 GetImageManager()->AddImage(gl_image.get(), *image_id);
198 return buffer.Pass(); 202 return buffer.Pass();
199 } 203 }
200 204
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 allowed_extensions, 591 allowed_extensions,
588 attrib_list, 592 attrib_list,
589 gpu_preference, 593 gpu_preference,
590 callback)) 594 callback))
591 return NULL; 595 return NULL;
592 596
593 return context.release(); 597 return context.release();
594 } 598 }
595 599
596 // static 600 // static
597 void GLInProcessContext::SetGpuMemoryBufferCreator( 601 void GLInProcessContext::SetGpuMemoryBufferFactory(
598 GpuMemoryBufferCreator* creator) { 602 GpuMemoryBufferFactory* factory) {
599 g_gpu_memory_buffer_creator = creator; 603 DCHECK_EQ(0u, SharedContextCount());
604 g_gpu_memory_buffer_factory = factory;
600 } 605 }
601 606
602 // static 607 // static
603 void GLInProcessContext::EnableVirtualizedContext() { 608 void GLInProcessContext::EnableVirtualizedContext() {
604 #if !defined(NDEBUG) 609 DCHECK_EQ(0u, SharedContextCount());
605 {
606 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
607 g_all_shared_contexts.Get());
608 DCHECK(g_all_shared_contexts.Get().empty());
609 }
610 #endif // !defined(NDEBUG)
611 g_use_virtualized_gl_context = true; 610 g_use_virtualized_gl_context = true;
612 } 611 }
613 612
614 } // namespace gpu 613 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gl_in_process_context.h ('k') | gpu/command_buffer/client/gpu_memory_buffer_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698