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

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

Issue 1331843005: Implemented new fence syncs which replaces the old sync points. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reverted mojo readme, changed wait() to take a pointer Created 5 years, 2 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
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/location.h" 15 #include "base/location.h"
16 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
18 #include "base/sequence_checker.h" 18 #include "base/sequence_checker.h"
19 #include "base/single_thread_task_runner.h" 19 #include "base/single_thread_task_runner.h"
20 #include "base/thread_task_runner_handle.h" 20 #include "base/thread_task_runner_handle.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/gles2_cmd_format.h"
22 #include "gpu/command_buffer/common/value_state.h" 23 #include "gpu/command_buffer/common/value_state.h"
23 #include "gpu/command_buffer/service/command_buffer_service.h" 24 #include "gpu/command_buffer/service/command_buffer_service.h"
24 #include "gpu/command_buffer/service/context_group.h" 25 #include "gpu/command_buffer/service/context_group.h"
25 #include "gpu/command_buffer/service/gl_context_virtual.h" 26 #include "gpu/command_buffer/service/gl_context_virtual.h"
26 #include "gpu/command_buffer/service/gpu_scheduler.h" 27 #include "gpu/command_buffer/service/gpu_scheduler.h"
27 #include "gpu/command_buffer/service/gpu_switches.h" 28 #include "gpu/command_buffer/service/gpu_switches.h"
28 #include "gpu/command_buffer/service/image_factory.h" 29 #include "gpu/command_buffer/service/image_factory.h"
29 #include "gpu/command_buffer/service/image_manager.h" 30 #include "gpu/command_buffer/service/image_manager.h"
30 #include "gpu/command_buffer/service/mailbox_manager.h" 31 #include "gpu/command_buffer/service/mailbox_manager.h"
31 #include "gpu/command_buffer/service/memory_program_cache.h" 32 #include "gpu/command_buffer/service/memory_program_cache.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 } 176 }
176 177
177 InProcessCommandBuffer::InProcessCommandBuffer( 178 InProcessCommandBuffer::InProcessCommandBuffer(
178 const scoped_refptr<Service>& service) 179 const scoped_refptr<Service>& service)
179 : command_buffer_id_(g_next_command_buffer_id.GetNext()), 180 : command_buffer_id_(g_next_command_buffer_id.GetNext()),
180 context_lost_(false), 181 context_lost_(false),
181 delayed_work_pending_(false), 182 delayed_work_pending_(false),
182 image_factory_(nullptr), 183 image_factory_(nullptr),
183 last_put_offset_(-1), 184 last_put_offset_(-1),
184 gpu_memory_buffer_manager_(nullptr), 185 gpu_memory_buffer_manager_(nullptr),
186 next_fence_sync_release_(1),
187 flushed_fence_sync_release_(0),
185 flush_event_(false, false), 188 flush_event_(false, false),
186 service_(GetInitialService(service)), 189 service_(GetInitialService(service)),
190 fence_sync_wait_event_(false, false),
187 gpu_thread_weak_ptr_factory_(this) { 191 gpu_thread_weak_ptr_factory_(this) {
188 DCHECK(service_.get()); 192 DCHECK(service_.get());
189 next_image_id_.GetNext(); 193 next_image_id_.GetNext();
190 } 194 }
191 195
192 InProcessCommandBuffer::~InProcessCommandBuffer() { 196 InProcessCommandBuffer::~InProcessCommandBuffer() {
193 Destroy(); 197 Destroy();
194 } 198 }
195 199
196 void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) { 200 void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 else 341 else
338 surface_ = gfx::GLSurface::CreateViewGLSurface(params.window); 342 surface_ = gfx::GLSurface::CreateViewGLSurface(params.window);
339 } 343 }
340 344
341 if (!surface_.get()) { 345 if (!surface_.get()) {
342 LOG(ERROR) << "Could not create GLSurface."; 346 LOG(ERROR) << "Could not create GLSurface.";
343 DestroyOnGpuThread(); 347 DestroyOnGpuThread();
344 return false; 348 return false;
345 } 349 }
346 350
347 sync_point_client_state_ = SyncPointClientState::Create(); 351 sync_point_order_data_ = SyncPointOrderData::Create();
348 sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient( 352 sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient(
349 sync_point_client_state_, 353 sync_point_order_data_, GetNamespaceID(), GetCommandBufferID());
350 GetNamespaceID(), GetCommandBufferID());
351 354
352 if (service_->UseVirtualizedGLContexts() || 355 if (service_->UseVirtualizedGLContexts() ||
353 decoder_->GetContextGroup() 356 decoder_->GetContextGroup()
354 ->feature_info() 357 ->feature_info()
355 ->workarounds() 358 ->workarounds()
356 .use_virtualized_gl_contexts) { 359 .use_virtualized_gl_contexts) {
357 context_ = gl_share_group_->GetSharedContext(); 360 context_ = gl_share_group_->GetSharedContext();
358 if (!context_.get()) { 361 if (!context_.get()) {
359 context_ = gfx::GLContext::CreateGLContext( 362 context_ = gfx::GLContext::CreateGLContext(
360 gl_share_group_.get(), surface_.get(), params.gpu_preference); 363 gl_share_group_.get(), surface_.get(), params.gpu_preference);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 } 410 }
408 *params.capabilities = decoder_->GetCapabilities(); 411 *params.capabilities = decoder_->GetCapabilities();
409 412
410 if (!params.is_offscreen) { 413 if (!params.is_offscreen) {
411 decoder_->SetResizeCallback(base::Bind( 414 decoder_->SetResizeCallback(base::Bind(
412 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_)); 415 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_));
413 } 416 }
414 decoder_->SetWaitSyncPointCallback( 417 decoder_->SetWaitSyncPointCallback(
415 base::Bind(&InProcessCommandBuffer::WaitSyncPointOnGpuThread, 418 base::Bind(&InProcessCommandBuffer::WaitSyncPointOnGpuThread,
416 base::Unretained(this))); 419 base::Unretained(this)));
420 decoder_->SetFenceSyncReleaseCallback(
421 base::Bind(&InProcessCommandBuffer::FenceSyncReleaseOnGpuThread,
422 base::Unretained(this)));
423 decoder_->SetWaitFenceSyncCallback(
424 base::Bind(&InProcessCommandBuffer::WaitFenceSyncOnGpuThread,
425 base::Unretained(this)));
417 426
418 image_factory_ = params.image_factory; 427 image_factory_ = params.image_factory;
419 428
420 return true; 429 return true;
421 } 430 }
422 431
423 void InProcessCommandBuffer::Destroy() { 432 void InProcessCommandBuffer::Destroy() {
424 CheckSequencedThread(); 433 CheckSequencedThread();
425 434
426 base::WaitableEvent completion(true, false); 435 base::WaitableEvent completion(true, false);
(...skipping 11 matching lines...) Expand all
438 command_buffer_.reset(); 447 command_buffer_.reset();
439 // Clean up GL resources if possible. 448 // Clean up GL resources if possible.
440 bool have_context = context_.get() && context_->MakeCurrent(surface_.get()); 449 bool have_context = context_.get() && context_->MakeCurrent(surface_.get());
441 if (decoder_) { 450 if (decoder_) {
442 decoder_->Destroy(have_context); 451 decoder_->Destroy(have_context);
443 decoder_.reset(); 452 decoder_.reset();
444 } 453 }
445 context_ = NULL; 454 context_ = NULL;
446 surface_ = NULL; 455 surface_ = NULL;
447 sync_point_client_ = NULL; 456 sync_point_client_ = NULL;
448 sync_point_client_state_ = NULL; 457 if (sync_point_order_data_) {
458 sync_point_order_data_->Destroy();
459 sync_point_order_data_ = nullptr;
460 }
449 gl_share_group_ = NULL; 461 gl_share_group_ = NULL;
450 #if defined(OS_ANDROID) 462 #if defined(OS_ANDROID)
451 stream_texture_manager_.reset(); 463 stream_texture_manager_.reset();
452 #endif 464 #endif
453 465
454 return true; 466 return true;
455 } 467 }
456 468
457 void InProcessCommandBuffer::CheckSequencedThread() { 469 void InProcessCommandBuffer::CheckSequencedThread() {
458 DCHECK(!sequence_checker_ || 470 DCHECK(!sequence_checker_ ||
(...skipping 28 matching lines...) Expand all
487 GetStateFast(); 499 GetStateFast();
488 return last_state_.token; 500 return last_state_.token;
489 } 501 }
490 502
491 void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset, 503 void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset,
492 uint32_t order_num) { 504 uint32_t order_num) {
493 CheckSequencedThread(); 505 CheckSequencedThread();
494 ScopedEvent handle_flush(&flush_event_); 506 ScopedEvent handle_flush(&flush_event_);
495 base::AutoLock lock(command_buffer_lock_); 507 base::AutoLock lock(command_buffer_lock_);
496 508
497 sync_point_client_state_->BeginProcessingOrderNumber(order_num); 509 sync_point_order_data_->BeginProcessingOrderNumber(order_num);
498 command_buffer_->Flush(put_offset); 510 command_buffer_->Flush(put_offset);
499 { 511 {
500 // Update state before signaling the flush event. 512 // Update state before signaling the flush event.
501 base::AutoLock lock(state_after_last_flush_lock_); 513 base::AutoLock lock(state_after_last_flush_lock_);
502 state_after_last_flush_ = command_buffer_->GetLastState(); 514 state_after_last_flush_ = command_buffer_->GetLastState();
503 } 515 }
504 DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || 516 DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) ||
505 (error::IsError(state_after_last_flush_.error) && context_lost_)); 517 (error::IsError(state_after_last_flush_.error) && context_lost_));
506 518
507 // Currently the in process command buffer does not support being descheduled, 519 // Currently the in process command buffer does not support being descheduled,
508 // if it does we would need to back off on calling the finish processing 520 // if it does we would need to back off on calling the finish processing
509 // order number function until the message is rescheduled and finished 521 // order number function until the message is rescheduled and finished
510 // processing. This DCHECK is to enforce this. 522 // processing. This DCHECK is to enforce this.
511 DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset); 523 DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset);
512 sync_point_client_state_->FinishProcessingOrderNumber(order_num); 524 sync_point_order_data_->FinishProcessingOrderNumber(order_num);
513 525
514 // If we've processed all pending commands but still have pending queries, 526 // If we've processed all pending commands but still have pending queries,
515 // pump idle work until the query is passed. 527 // pump idle work until the query is passed.
516 if (put_offset == state_after_last_flush_.get_offset && 528 if (put_offset == state_after_last_flush_.get_offset &&
517 (gpu_scheduler_->HasMoreIdleWork() || 529 (gpu_scheduler_->HasMoreIdleWork() ||
518 gpu_scheduler_->HasPendingQueries())) { 530 gpu_scheduler_->HasPendingQueries())) {
519 ScheduleDelayedWorkOnGpuThread(); 531 ScheduleDelayedWorkOnGpuThread();
520 } 532 }
521 } 533 }
522 534
(...skipping 23 matching lines...) Expand all
546 void InProcessCommandBuffer::Flush(int32 put_offset) { 558 void InProcessCommandBuffer::Flush(int32 put_offset) {
547 CheckSequencedThread(); 559 CheckSequencedThread();
548 if (last_state_.error != gpu::error::kNoError) 560 if (last_state_.error != gpu::error::kNoError)
549 return; 561 return;
550 562
551 if (last_put_offset_ == put_offset) 563 if (last_put_offset_ == put_offset)
552 return; 564 return;
553 565
554 SyncPointManager* sync_manager = service_->sync_point_manager(); 566 SyncPointManager* sync_manager = service_->sync_point_manager();
555 const uint32_t order_num = 567 const uint32_t order_num =
556 sync_point_client_state_->GenerateUnprocessedOrderNumber(sync_manager); 568 sync_point_order_data_->GenerateUnprocessedOrderNumber(sync_manager);
557 last_put_offset_ = put_offset; 569 last_put_offset_ = put_offset;
558 base::Closure task = base::Bind(&InProcessCommandBuffer::FlushOnGpuThread, 570 base::Closure task = base::Bind(&InProcessCommandBuffer::FlushOnGpuThread,
559 gpu_thread_weak_ptr_, 571 gpu_thread_weak_ptr_,
560 put_offset, 572 put_offset,
561 order_num); 573 order_num);
562 QueueTask(task); 574 QueueTask(task);
575
576 flushed_fence_sync_release_ = next_fence_sync_release_ - 1;
563 } 577 }
564 578
565 void InProcessCommandBuffer::OrderingBarrier(int32 put_offset) { 579 void InProcessCommandBuffer::OrderingBarrier(int32 put_offset) {
566 Flush(put_offset); 580 Flush(put_offset);
567 } 581 }
568 582
569 void InProcessCommandBuffer::WaitForTokenInRange(int32 start, int32 end) { 583 void InProcessCommandBuffer::WaitForTokenInRange(int32 start, int32 end) {
570 CheckSequencedThread(); 584 CheckSequencedThread();
571 while (!InRange(start, end, GetLastToken()) && 585 while (!InRange(start, end, GetLastToken()) &&
572 last_state_.error == gpu::error::kNoError) 586 last_state_.error == gpu::error::kNoError)
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 805
792 void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) { 806 void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) {
793 gles2::MailboxManager* mailbox_manager = 807 gles2::MailboxManager* mailbox_manager =
794 decoder_->GetContextGroup()->mailbox_manager(); 808 decoder_->GetContextGroup()->mailbox_manager();
795 if (mailbox_manager->UsesSync()) { 809 if (mailbox_manager->UsesSync()) {
796 bool make_current_success = false; 810 bool make_current_success = false;
797 { 811 {
798 base::AutoLock lock(command_buffer_lock_); 812 base::AutoLock lock(command_buffer_lock_);
799 make_current_success = MakeCurrent(); 813 make_current_success = MakeCurrent();
800 } 814 }
801 if (make_current_success) 815 if (make_current_success) {
802 mailbox_manager->PushTextureUpdates(sync_point); 816 // Old sync points are global and do not have a command buffer ID,
817 // We can simply use the GPUIO namespace with 0 for the command buffer ID
818 // (under normal circumstances 0 is invalid so will not be used) until
819 // the old sync points are replaced.
820 gles2::SyncToken sync_token = {gpu::CommandBufferNamespace::GPU_IO, 0,
821 sync_point};
822 mailbox_manager->PushTextureUpdates(sync_token);
823 }
803 } 824 }
804 service_->sync_point_manager()->RetireSyncPoint(sync_point); 825 service_->sync_point_manager()->RetireSyncPoint(sync_point);
805 } 826 }
806 827
807 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, 828 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point,
808 const base::Closure& callback) { 829 const base::Closure& callback) {
809 CheckSequencedThread(); 830 CheckSequencedThread();
810 QueueTask(base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread, 831 QueueTask(base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread,
811 base::Unretained(this), 832 base::Unretained(this),
812 sync_point, 833 sync_point,
813 WrapCallback(callback))); 834 WrapCallback(callback)));
814 } 835 }
815 836
816 bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { 837 bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) {
817 service_->sync_point_manager()->WaitSyncPoint(sync_point); 838 service_->sync_point_manager()->WaitSyncPoint(sync_point);
818 gles2::MailboxManager* mailbox_manager = 839 gles2::MailboxManager* mailbox_manager =
819 decoder_->GetContextGroup()->mailbox_manager(); 840 decoder_->GetContextGroup()->mailbox_manager();
820 mailbox_manager->PullTextureUpdates(sync_point); 841 // Old sync points are global and do not have a command buffer ID,
842 // We can simply use the GPUIO namespace with 0 for the command buffer ID
843 // (under normal circumstances 0 is invalid so will not be used) until
844 // the old sync points are replaced.
845 gles2::SyncToken sync_token = {gpu::CommandBufferNamespace::GPU_IO, 0,
846 sync_point};
847 mailbox_manager->PullTextureUpdates(sync_token);
821 return true; 848 return true;
822 } 849 }
823 850
851 void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) {
852 DCHECK(!sync_point_client_->client_state()->IsFenceSyncReleased(release));
853 gles2::MailboxManager* mailbox_manager =
854 decoder_->GetContextGroup()->mailbox_manager();
855 if (mailbox_manager->UsesSync()) {
856 bool make_current_success = false;
857 {
858 base::AutoLock lock(command_buffer_lock_);
859 make_current_success = MakeCurrent();
860 }
861 if (make_current_success) {
862 gles2::SyncToken sync_token = {GetNamespaceID(), GetCommandBufferID(),
863 release};
864 mailbox_manager->PushTextureUpdates(sync_token);
865 }
866 }
867
868 sync_point_client_->ReleaseFenceSync(release);
869 }
870
871 bool InProcessCommandBuffer::WaitFenceSyncOnGpuThread(
872 gpu::CommandBufferNamespace namespace_id,
873 uint64_t command_buffer_id,
874 uint64_t release) {
875 gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager();
876 DCHECK(sync_point_manager);
877
878 scoped_refptr<gpu::SyncPointClientState> release_state =
879 sync_point_manager->GetSyncPointClientState(namespace_id,
880 command_buffer_id);
881
882 if (!release_state)
883 return true;
884
885 if (!release_state->IsFenceSyncReleased(release)) {
886 // Use waitable event which is signalled when the release fence is released.
887 sync_point_client_->Wait(
888 release_state.get(), release,
889 base::Bind(&base::WaitableEvent::Signal,
890 base::Unretained(&fence_sync_wait_event_)));
891 fence_sync_wait_event_.Wait();
892 }
893
894 gles2::MailboxManager* mailbox_manager =
895 decoder_->GetContextGroup()->mailbox_manager();
896 gles2::SyncToken sync_token = {namespace_id, command_buffer_id, release};
897 mailbox_manager->PullTextureUpdates(sync_token);
898 return true;
899 }
900
824 void InProcessCommandBuffer::SignalSyncPointOnGpuThread( 901 void InProcessCommandBuffer::SignalSyncPointOnGpuThread(
825 unsigned sync_point, 902 unsigned sync_point,
826 const base::Closure& callback) { 903 const base::Closure& callback) {
827 service_->sync_point_manager()->AddSyncPointCallback(sync_point, callback); 904 service_->sync_point_manager()->AddSyncPointCallback(sync_point, callback);
828 } 905 }
829 906
830 void InProcessCommandBuffer::SignalQuery(unsigned query_id, 907 void InProcessCommandBuffer::SignalQuery(unsigned query_id,
831 const base::Closure& callback) { 908 const base::Closure& callback) {
832 CheckSequencedThread(); 909 CheckSequencedThread();
833 QueueTask(base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread, 910 QueueTask(base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 } 951 }
875 952
876 CommandBufferNamespace InProcessCommandBuffer::GetNamespaceID() const { 953 CommandBufferNamespace InProcessCommandBuffer::GetNamespaceID() const {
877 return CommandBufferNamespace::IN_PROCESS; 954 return CommandBufferNamespace::IN_PROCESS;
878 } 955 }
879 956
880 uint64_t InProcessCommandBuffer::GetCommandBufferID() const { 957 uint64_t InProcessCommandBuffer::GetCommandBufferID() const {
881 return command_buffer_id_; 958 return command_buffer_id_;
882 } 959 }
883 960
961 uint64_t InProcessCommandBuffer::GenerateFenceSyncRelease() {
962 return next_fence_sync_release_++;
963 }
964
965 bool InProcessCommandBuffer::IsFenceSyncRelease(uint64_t release) {
966 return release != 0 && release < next_fence_sync_release_;
967 }
968
969 bool InProcessCommandBuffer::IsFenceSyncFlushed(uint64_t release) {
970 return release <= flushed_fence_sync_release_;
971 }
972
884 uint32 InProcessCommandBuffer::CreateStreamTextureOnGpuThread( 973 uint32 InProcessCommandBuffer::CreateStreamTextureOnGpuThread(
885 uint32 client_texture_id) { 974 uint32 client_texture_id) {
886 #if defined(OS_ANDROID) 975 #if defined(OS_ANDROID)
887 return stream_texture_manager_->CreateStreamTexture( 976 return stream_texture_manager_->CreateStreamTexture(
888 client_texture_id, decoder_->GetContextGroup()->texture_manager()); 977 client_texture_id, decoder_->GetContextGroup()->texture_manager());
889 #else 978 #else
890 return 0; 979 return 0;
891 #endif 980 #endif
892 } 981 }
893 982
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 framebuffer_completeness_cache_ = 1077 framebuffer_completeness_cache_ =
989 new gpu::gles2::FramebufferCompletenessCache; 1078 new gpu::gles2::FramebufferCompletenessCache;
990 return framebuffer_completeness_cache_; 1079 return framebuffer_completeness_cache_;
991 } 1080 }
992 1081
993 SyncPointManager* GpuInProcessThread::sync_point_manager() { 1082 SyncPointManager* GpuInProcessThread::sync_point_manager() {
994 return sync_point_manager_; 1083 return sync_point_manager_;
995 } 1084 }
996 1085
997 } // namespace gpu 1086 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | gpu/command_buffer/service/mailbox_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698