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

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: 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,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 contexts_.end(), 173 contexts_.end(),
174 &DetachThread); 174 &DetachThread);
175 } 175 }
176 176
177 scoped_ptr<GpuMemoryBuffer> GLInProcessContextImpl::CreateGpuMemoryBuffer( 177 scoped_ptr<GpuMemoryBuffer> GLInProcessContextImpl::CreateGpuMemoryBuffer(
178 int width, int height, GLenum internalformat, unsigned int* image_id) { 178 int width, int height, GLenum internalformat, unsigned int* image_id) {
179 // We're taking the lock here because we're accessing the ContextGroup's 179 // We're taking the lock here because we're accessing the ContextGroup's
180 // shared IdManager. 180 // shared IdManager.
181 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), 181 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
182 g_all_shared_contexts.Get()); 182 g_all_shared_contexts.Get());
183 // For Android WebView we assume the |internalformat| will always be 183 scoped_ptr<GpuMemoryBuffer> buffer(
184 // GL_RGBA8_OES. 184 g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer(width,
185 DCHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat); 185 height,
186 scoped_ptr<GpuMemoryBuffer> buffer = 186 internalformat));
187 g_gpu_memory_buffer_creator(width, height); 187 if (!buffer)
188 188 return scoped_ptr<GpuMemoryBuffer>();
189 if (buffer.get() == NULL)
190 return buffer.Pass();
191 189
192 scoped_refptr<gfx::GLImage> gl_image = 190 scoped_refptr<gfx::GLImage> gl_image =
193 gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer->GetNativeBuffer(), 191 gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer->GetNativeBuffer(),
194 gfx::Size(width, height)); 192 gfx::Size(width, height));
195 *image_id = decoder_->GetContextGroup() 193 *image_id = decoder_->GetContextGroup()
196 ->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID(); 194 ->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID();
197 GetImageManager()->AddImage(gl_image.get(), *image_id); 195 GetImageManager()->AddImage(gl_image.get(), *image_id);
198 return buffer.Pass(); 196 return buffer.Pass();
199 } 197 }
200 198
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 allowed_extensions, 585 allowed_extensions,
588 attrib_list, 586 attrib_list,
589 gpu_preference, 587 gpu_preference,
590 callback)) 588 callback))
591 return NULL; 589 return NULL;
592 590
593 return context.release(); 591 return context.release();
594 } 592 }
595 593
596 // static 594 // static
597 void GLInProcessContext::SetGpuMemoryBufferCreator( 595 void GLInProcessContext::SetGpuMemoryBufferFactory(
598 GpuMemoryBufferCreator* creator) { 596 GpuMemoryBufferFactory* factory) {
599 g_gpu_memory_buffer_creator = creator; 597 #if !defined(NDEBUG)
kaanb 2013/07/26 05:59:13 isn't it possible to replace this with a function?
reveman 2013/07/26 15:40:57 I don't think there's a good reason to avoid this
598 {
599 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
600 g_all_shared_contexts.Get());
601 DCHECK(g_all_shared_contexts.Get().empty());
602 }
603 #endif // !defined(NDEBUG)
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 #if !defined(NDEBUG)
605 { 610 {
606 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), 611 AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(),
607 g_all_shared_contexts.Get()); 612 g_all_shared_contexts.Get());
608 DCHECK(g_all_shared_contexts.Get().empty()); 613 DCHECK(g_all_shared_contexts.Get().empty());
609 } 614 }
610 #endif // !defined(NDEBUG) 615 #endif // !defined(NDEBUG)
611 g_use_virtualized_gl_context = true; 616 g_use_virtualized_gl_context = true;
612 } 617 }
613 618
614 } // namespace gpu 619 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698