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

Side by Side Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/service/in_process_command_buffer.h" 5 #include "gpu/command_buffer/service/in_process_command_buffer.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "base/message_loop/message_loop_proxy.h" 17 #include "base/message_loop/message_loop_proxy.h"
18 #include "base/sequence_checker.h" 18 #include "base/sequence_checker.h"
19 #include "base/synchronization/condition_variable.h" 19 #include "base/synchronization/condition_variable.h"
20 #include "base/threading/thread.h" 20 #include "base/threading/thread.h"
21 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" 21 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
22 #include "gpu/command_buffer/common/value_state.h"
22 #include "gpu/command_buffer/service/command_buffer_service.h" 23 #include "gpu/command_buffer/service/command_buffer_service.h"
23 #include "gpu/command_buffer/service/context_group.h" 24 #include "gpu/command_buffer/service/context_group.h"
24 #include "gpu/command_buffer/service/gl_context_virtual.h" 25 #include "gpu/command_buffer/service/gl_context_virtual.h"
25 #include "gpu/command_buffer/service/gpu_scheduler.h" 26 #include "gpu/command_buffer/service/gpu_scheduler.h"
26 #include "gpu/command_buffer/service/gpu_switches.h" 27 #include "gpu/command_buffer/service/gpu_switches.h"
27 #include "gpu/command_buffer/service/image_factory.h" 28 #include "gpu/command_buffer/service/image_factory.h"
28 #include "gpu/command_buffer/service/image_manager.h" 29 #include "gpu/command_buffer/service/image_manager.h"
29 #include "gpu/command_buffer/service/mailbox_manager_impl.h" 30 #include "gpu/command_buffer/service/mailbox_manager_impl.h"
30 #include "gpu/command_buffer/service/mailbox_manager_sync.h" 31 #include "gpu/command_buffer/service/mailbox_manager_sync.h"
31 #include "gpu/command_buffer/service/memory_tracking.h" 32 #include "gpu/command_buffer/service/memory_tracking.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5)); 99 FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5));
99 } 100 }
100 101
101 scoped_refptr<gles2::ShaderTranslatorCache> 102 scoped_refptr<gles2::ShaderTranslatorCache>
102 GpuInProcessThread::shader_translator_cache() { 103 GpuInProcessThread::shader_translator_cache() {
103 if (!shader_translator_cache_.get()) 104 if (!shader_translator_cache_.get())
104 shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; 105 shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache;
105 return shader_translator_cache_; 106 return shader_translator_cache_;
106 } 107 }
107 108
108 base::LazyInstance<std::set<InProcessCommandBuffer*> > default_thread_clients_ = 109 struct GpuInProcessThreadHolder {
109 LAZY_INSTANCE_INITIALIZER; 110 GpuInProcessThreadHolder() : gpu_thread(new GpuInProcessThread) {}
110 base::LazyInstance<base::Lock> default_thread_clients_lock_ = 111 scoped_refptr<InProcessCommandBuffer::Service> gpu_thread;
112 };
113
114 base::LazyInstance<GpuInProcessThreadHolder> g_default_service =
111 LAZY_INSTANCE_INITIALIZER; 115 LAZY_INSTANCE_INITIALIZER;
112 116
113 class ScopedEvent { 117 class ScopedEvent {
114 public: 118 public:
115 ScopedEvent(base::WaitableEvent* event) : event_(event) {} 119 ScopedEvent(base::WaitableEvent* event) : event_(event) {}
116 ~ScopedEvent() { event_->Signal(); } 120 ~ScopedEvent() { event_->Signal(); }
117 121
118 private: 122 private:
119 base::WaitableEvent* event_; 123 base::WaitableEvent* event_;
120 }; 124 };
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 191 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
188 switches::kEnableThreadedTextureMailboxes)) { 192 switches::kEnableThreadedTextureMailboxes)) {
189 mailbox_manager_ = new gles2::MailboxManagerSync(); 193 mailbox_manager_ = new gles2::MailboxManagerSync();
190 } else { 194 } else {
191 mailbox_manager_ = new gles2::MailboxManagerImpl(); 195 mailbox_manager_ = new gles2::MailboxManagerImpl();
192 } 196 }
193 } 197 }
194 return mailbox_manager_; 198 return mailbox_manager_;
195 } 199 }
196 200
197 scoped_refptr<InProcessCommandBuffer::Service> 201 scoped_refptr<gpu::ValueStateMap>
198 InProcessCommandBuffer::GetDefaultService() { 202 InProcessCommandBuffer::Service::pending_valuebuffer_state() {
199 base::AutoLock lock(default_thread_clients_lock_.Get()); 203 if (!pending_valuebuffer_state_.get()) {
200 scoped_refptr<Service> service; 204 pending_valuebuffer_state_ = new gpu::ValueStateMap();
201 if (!default_thread_clients_.Get().empty()) {
202 InProcessCommandBuffer* other = *default_thread_clients_.Get().begin();
203 service = other->service_;
204 DCHECK(service.get());
205 } else {
206 service = new GpuInProcessThread;
207 } 205 }
208 return service; 206 return pending_valuebuffer_state_;
209 } 207 }
210 208
211 InProcessCommandBuffer::InProcessCommandBuffer( 209 InProcessCommandBuffer::InProcessCommandBuffer(
212 const scoped_refptr<Service>& service) 210 const scoped_refptr<Service>& service)
213 : context_lost_(false), 211 : context_lost_(false),
214 idle_work_pending_(false), 212 idle_work_pending_(false),
215 image_factory_(nullptr), 213 image_factory_(nullptr),
216 last_put_offset_(-1), 214 last_put_offset_(-1),
217 gpu_memory_buffer_manager_(nullptr), 215 gpu_memory_buffer_manager_(nullptr),
218 flush_event_(false, false), 216 flush_event_(false, false),
219 service_(service.get() ? service : GetDefaultService()), 217 service_(service.get() ? service : g_default_service.Get().gpu_thread),
220 gpu_thread_weak_ptr_factory_(this) { 218 gpu_thread_weak_ptr_factory_(this) {
221 if (!service.get()) { 219 DCHECK(service_.get());
222 base::AutoLock lock(default_thread_clients_lock_.Get());
223 default_thread_clients_.Get().insert(this);
224 }
225 next_image_id_.GetNext(); 220 next_image_id_.GetNext();
226 } 221 }
227 222
228 InProcessCommandBuffer::~InProcessCommandBuffer() { 223 InProcessCommandBuffer::~InProcessCommandBuffer() {
229 Destroy(); 224 Destroy();
230 base::AutoLock lock(default_thread_clients_lock_.Get());
231 default_thread_clients_.Get().erase(this);
232 } 225 }
233 226
234 void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) { 227 void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) {
235 CheckSequencedThread(); 228 CheckSequencedThread();
236 DCHECK(!surface_->IsOffscreen()); 229 DCHECK(!surface_->IsOffscreen());
237 surface_->Resize(size); 230 surface_->Resize(size);
238 } 231 }
239 232
240 bool InProcessCommandBuffer::MakeCurrent() { 233 bool InProcessCommandBuffer::MakeCurrent() {
241 CheckSequencedThread(); 234 CheckSequencedThread();
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 #endif 344 #endif
352 345
353 bool bind_generates_resource = false; 346 bool bind_generates_resource = false;
354 decoder_.reset(gles2::GLES2Decoder::Create( 347 decoder_.reset(gles2::GLES2Decoder::Create(
355 params.context_group 348 params.context_group
356 ? params.context_group->decoder_->GetContextGroup() 349 ? params.context_group->decoder_->GetContextGroup()
357 : new gles2::ContextGroup(service_->mailbox_manager(), 350 : new gles2::ContextGroup(service_->mailbox_manager(),
358 NULL, 351 NULL,
359 service_->shader_translator_cache(), 352 service_->shader_translator_cache(),
360 NULL, 353 NULL,
354 service_->pending_valuebuffer_state(),
361 bind_generates_resource))); 355 bind_generates_resource)));
362 356
363 gpu_scheduler_.reset( 357 gpu_scheduler_.reset(
364 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); 358 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get()));
365 command_buffer->SetGetBufferChangeCallback(base::Bind( 359 command_buffer->SetGetBufferChangeCallback(base::Bind(
366 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); 360 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get())));
367 command_buffer_ = command_buffer.Pass(); 361 command_buffer_ = command_buffer.Pass();
368 362
369 decoder_->set_engine(gpu_scheduler_.get()); 363 decoder_->set_engine(gpu_scheduler_.get());
370 364
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 868
875 #if defined(OS_ANDROID) 869 #if defined(OS_ANDROID)
876 scoped_refptr<gfx::SurfaceTexture> 870 scoped_refptr<gfx::SurfaceTexture>
877 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) { 871 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) {
878 DCHECK(stream_texture_manager_); 872 DCHECK(stream_texture_manager_);
879 return stream_texture_manager_->GetSurfaceTexture(stream_id); 873 return stream_texture_manager_->GetSurfaceTexture(stream_id);
880 } 874 }
881 #endif 875 #endif
882 876
883 } // namespace gpu 877 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | gpu/command_buffer/service/program_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698