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

Side by Side Diff: content/common/gpu/gpu_command_buffer_stub.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
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/bind_helpers.h" 6 #include "base/bind_helpers.h"
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/hash.h" 8 #include "base/hash.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/memory/shared_memory.h" 10 #include "base/memory/shared_memory.h"
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 GpuChannelManager* manager = channel_->gpu_channel_manager(); 529 GpuChannelManager* manager = channel_->gpu_channel_manager();
530 DCHECK(manager); 530 DCHECK(manager);
531 531
532 gpu::SyncPointManager* sync_point_manager = manager->sync_point_manager(); 532 gpu::SyncPointManager* sync_point_manager = manager->sync_point_manager();
533 DCHECK(sync_point_manager); 533 DCHECK(sync_point_manager);
534 534
535 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group_.get())); 535 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group_.get()));
536 scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), 536 scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(),
537 decoder_.get(), 537 decoder_.get(),
538 decoder_.get())); 538 decoder_.get()));
539 sync_point_client_ = 539 sync_point_client_ = sync_point_manager->CreateSyncPointClient(
540 sync_point_manager->CreateSyncPointClient( 540 channel_->GetSyncPointOrderData(), gpu::CommandBufferNamespace::GPU_IO,
541 channel_->GetSyncPointClientState(), 541 command_buffer_id_);
542 gpu::CommandBufferNamespace::GPU_IO,
543 command_buffer_id_);
544 542
545 if (preemption_flag_.get()) 543 if (preemption_flag_.get())
546 scheduler_->SetPreemptByFlag(preemption_flag_); 544 scheduler_->SetPreemptByFlag(preemption_flag_);
547 545
548 decoder_->set_engine(scheduler_.get()); 546 decoder_->set_engine(scheduler_.get());
549 547
550 if (!handle_.is_null()) { 548 if (!handle_.is_null()) {
551 surface_ = ImageTransportSurface::CreateSurface( 549 surface_ = ImageTransportSurface::CreateSurface(
552 channel_->gpu_channel_manager(), 550 channel_->gpu_channel_manager(),
553 this, 551 this,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 636
639 decoder_->GetLogger()->SetMsgCallback( 637 decoder_->GetLogger()->SetMsgCallback(
640 base::Bind(&GpuCommandBufferStub::SendConsoleMessage, 638 base::Bind(&GpuCommandBufferStub::SendConsoleMessage,
641 base::Unretained(this))); 639 base::Unretained(this)));
642 decoder_->SetShaderCacheCallback( 640 decoder_->SetShaderCacheCallback(
643 base::Bind(&GpuCommandBufferStub::SendCachedShader, 641 base::Bind(&GpuCommandBufferStub::SendCachedShader,
644 base::Unretained(this))); 642 base::Unretained(this)));
645 decoder_->SetWaitSyncPointCallback( 643 decoder_->SetWaitSyncPointCallback(
646 base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint, 644 base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint,
647 base::Unretained(this))); 645 base::Unretained(this)));
646 decoder_->SetFenceSyncReleaseCallback(base::Bind(
647 &GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this)));
648 decoder_->SetWaitFenceSyncCallback(base::Bind(
649 &GpuCommandBufferStub::OnWaitFenceSync, base::Unretained(this)));
648 650
649 command_buffer_->SetPutOffsetChangeCallback( 651 command_buffer_->SetPutOffsetChangeCallback(
650 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); 652 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this)));
651 command_buffer_->SetGetBufferChangeCallback( 653 command_buffer_->SetGetBufferChangeCallback(
652 base::Bind(&gpu::GpuScheduler::SetGetBuffer, 654 base::Bind(&gpu::GpuScheduler::SetGetBuffer,
653 base::Unretained(scheduler_.get()))); 655 base::Unretained(scheduler_.get())));
654 command_buffer_->SetParseErrorCallback( 656 command_buffer_->SetParseErrorCallback(
655 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this))); 657 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this)));
656 scheduler_->SetSchedulingChangedCallback(base::Bind( 658 scheduler_->SetSchedulingChangedCallback(base::Bind(
657 &GpuCommandBufferStub::OnSchedulingChanged, base::Unretained(this))); 659 &GpuCommandBufferStub::OnSchedulingChanged, base::Unretained(this)));
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 if (retire) 928 if (retire)
927 OnRetireSyncPoint(sync_point); 929 OnRetireSyncPoint(sync_point);
928 } 930 }
929 931
930 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { 932 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) {
931 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point); 933 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point);
932 sync_points_.pop_front(); 934 sync_points_.pop_front();
933 935
934 gpu::gles2::MailboxManager* mailbox_manager = 936 gpu::gles2::MailboxManager* mailbox_manager =
935 context_group_->mailbox_manager(); 937 context_group_->mailbox_manager();
936 if (mailbox_manager->UsesSync() && MakeCurrent()) 938 if (mailbox_manager->UsesSync() && MakeCurrent()) {
937 mailbox_manager->PushTextureUpdates(sync_point); 939 // Old sync points are global and do not have a command buffer ID,
940 // We can simply use the global sync point number as the release count with
941 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
942 // will not be used) until the old sync points are replaced.
943 gpu::gles2::SyncToken sync_token = {gpu::CommandBufferNamespace::GPU_IO, 0,
944 sync_point};
945 mailbox_manager->PushTextureUpdates(sync_token);
946 }
938 947
939 GpuChannelManager* manager = channel_->gpu_channel_manager(); 948 GpuChannelManager* manager = channel_->gpu_channel_manager();
940 manager->sync_point_manager()->RetireSyncPoint(sync_point); 949 manager->sync_point_manager()->RetireSyncPoint(sync_point);
941 } 950 }
942 951
943 bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { 952 bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) {
944 DCHECK(!waiting_for_sync_point_); 953 DCHECK(!waiting_for_sync_point_);
945 DCHECK(scheduler_->scheduled()); 954 DCHECK(scheduler_->scheduled());
946 if (!sync_point) 955 if (!sync_point)
947 return true; 956 return true;
948 GpuChannelManager* manager = channel_->gpu_channel_manager(); 957 GpuChannelManager* manager = channel_->gpu_channel_manager();
949 if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) { 958 if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) {
950 PullTextureUpdates(sync_point); 959 // Old sync points are global and do not have a command buffer ID,
960 // We can simply use the global sync point number as the release count with
961 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
962 // will not be used) until the old sync points are replaced.
963 PullTextureUpdates(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point);
951 return true; 964 return true;
952 } 965 }
953 966
954 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub", 967 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub",
955 this); 968 this);
956 969
957 scheduler_->SetScheduled(false); 970 scheduler_->SetScheduled(false);
958 waiting_for_sync_point_ = true; 971 waiting_for_sync_point_ = true;
959 manager->sync_point_manager()->AddSyncPointCallback( 972 manager->sync_point_manager()->AddSyncPointCallback(
960 sync_point, 973 sync_point,
961 base::Bind(&RunOnThread, task_runner_, 974 base::Bind(&RunOnThread, task_runner_,
962 base::Bind(&GpuCommandBufferStub::OnWaitSyncPointCompleted, 975 base::Bind(&GpuCommandBufferStub::OnWaitSyncPointCompleted,
963 this->AsWeakPtr(), sync_point))); 976 this->AsWeakPtr(), sync_point)));
964 return !waiting_for_sync_point_; 977 return !waiting_for_sync_point_;
965 } 978 }
966 979
967 void GpuCommandBufferStub::OnWaitSyncPointCompleted(uint32 sync_point) { 980 void GpuCommandBufferStub::OnWaitSyncPointCompleted(uint32 sync_point) {
968 DCHECK(waiting_for_sync_point_); 981 DCHECK(waiting_for_sync_point_);
969 DCHECK(!scheduler_->scheduled()); 982 DCHECK(!scheduler_->scheduled());
970 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub", 983 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub",
971 this); 984 this);
972 PullTextureUpdates(sync_point); 985 // Old sync points are global and do not have a command buffer ID,
986 // We can simply use the global sync point number as the release count with
987 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
988 // will not be used) until the old sync points are replaced.
989 PullTextureUpdates(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point);
973 waiting_for_sync_point_ = false; 990 waiting_for_sync_point_ = false;
974 scheduler_->SetScheduled(true); 991 scheduler_->SetScheduled(true);
975 } 992 }
976 993
977 void GpuCommandBufferStub::PullTextureUpdates(uint32 sync_point) { 994 void GpuCommandBufferStub::PullTextureUpdates(
995 gpu::CommandBufferNamespace namespace_id,
996 uint64_t command_buffer_id,
997 uint32_t release) {
978 gpu::gles2::MailboxManager* mailbox_manager = 998 gpu::gles2::MailboxManager* mailbox_manager =
979 context_group_->mailbox_manager(); 999 context_group_->mailbox_manager();
980 if (mailbox_manager->UsesSync() && MakeCurrent()) 1000 if (mailbox_manager->UsesSync() && MakeCurrent()) {
981 mailbox_manager->PullTextureUpdates(sync_point); 1001 gpu::gles2::SyncToken sync_token = {namespace_id, command_buffer_id,
1002 release};
1003 mailbox_manager->PullTextureUpdates(sync_token);
1004 }
982 } 1005 }
983 1006
984 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) { 1007 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) {
985 GpuChannelManager* manager = channel_->gpu_channel_manager(); 1008 GpuChannelManager* manager = channel_->gpu_channel_manager();
986 manager->sync_point_manager()->AddSyncPointCallback( 1009 manager->sync_point_manager()->AddSyncPointCallback(
987 sync_point, 1010 sync_point,
988 base::Bind(&RunOnThread, task_runner_, 1011 base::Bind(&RunOnThread, task_runner_,
989 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 1012 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck,
990 this->AsWeakPtr(), id))); 1013 this->AsWeakPtr(), id)));
991 } 1014 }
(...skipping 14 matching lines...) Expand all
1006 this->AsWeakPtr(), 1029 this->AsWeakPtr(),
1007 id)); 1030 id));
1008 return; 1031 return;
1009 } 1032 }
1010 } 1033 }
1011 } 1034 }
1012 // Something went wrong, run callback immediately. 1035 // Something went wrong, run callback immediately.
1013 OnSignalSyncPointAck(id); 1036 OnSignalSyncPointAck(id);
1014 } 1037 }
1015 1038
1039 void GpuCommandBufferStub::OnFenceSyncRelease(uint64_t release) {
1040 if (sync_point_client_->client_state()->IsFenceSyncReleased(release)) {
1041 DLOG(ERROR) << "Fence Sync has already been released.";
1042 return;
1043 }
1044
1045 gpu::gles2::MailboxManager* mailbox_manager =
1046 context_group_->mailbox_manager();
1047 if (mailbox_manager->UsesSync() && MakeCurrent()) {
1048 gpu::gles2::SyncToken sync_token = {gpu::CommandBufferNamespace::GPU_IO,
1049 command_buffer_id_, release};
1050 mailbox_manager->PushTextureUpdates(sync_token);
1051 }
1052
1053 sync_point_client_->ReleaseFenceSync(release);
1054 }
1055
1056 bool GpuCommandBufferStub::OnWaitFenceSync(
1057 gpu::CommandBufferNamespace namespace_id,
1058 uint64_t command_buffer_id,
1059 uint64_t release) {
1060 DCHECK(!waiting_for_sync_point_);
1061 DCHECK(scheduler_->scheduled());
1062
1063 GpuChannelManager* manager = channel_->gpu_channel_manager();
1064 DCHECK(manager);
1065
1066 gpu::SyncPointManager* sync_point_manager = manager->sync_point_manager();
1067 DCHECK(sync_point_manager);
1068
1069 scoped_refptr<gpu::SyncPointClientState> release_state =
1070 sync_point_manager->GetSyncPointClientState(namespace_id,
1071 command_buffer_id);
1072
1073 if (!release_state)
1074 return true;
1075
1076 if (release_state->IsFenceSyncReleased(release)) {
1077 PullTextureUpdates(namespace_id, command_buffer_id, release);
1078 return true;
1079 }
1080
1081 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub",
1082 this);
1083 scheduler_->SetScheduled(false);
1084 waiting_for_sync_point_ = true;
1085 sync_point_client_->WaitNonThreadSafe(
1086 release_state.get(), release, task_runner_,
1087 base::Bind(&GpuCommandBufferStub::OnWaitFenceSyncCompleted,
1088 this->AsWeakPtr(), namespace_id, command_buffer_id, release));
1089
1090 return scheduler_->scheduled();
1091 }
1092
1093 void GpuCommandBufferStub::OnWaitFenceSyncCompleted(
1094 gpu::CommandBufferNamespace namespace_id,
1095 uint64_t command_buffer_id,
1096 uint64_t release) {
1097 DCHECK(waiting_for_sync_point_);
1098 DCHECK(!scheduler_->scheduled());
1099 TRACE_EVENT_ASYNC_END1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub",
1100 this);
1101 PullTextureUpdates(namespace_id, command_buffer_id, release);
1102 waiting_for_sync_point_ = false;
1103 scheduler_->SetScheduled(true);
1104 }
1105
1016 void GpuCommandBufferStub::OnCreateImage(int32 id, 1106 void GpuCommandBufferStub::OnCreateImage(int32 id,
1017 gfx::GpuMemoryBufferHandle handle, 1107 gfx::GpuMemoryBufferHandle handle,
1018 gfx::Size size, 1108 gfx::Size size,
1019 gfx::BufferFormat format, 1109 gfx::BufferFormat format,
1020 uint32 internalformat) { 1110 uint32 internalformat) {
1021 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateImage"); 1111 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateImage");
1022 1112
1023 if (!decoder_) 1113 if (!decoder_)
1024 return; 1114 return;
1025 1115
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 result)); 1271 result));
1182 } 1272 }
1183 1273
1184 void GpuCommandBufferStub::SendUpdateVSyncParameters(base::TimeTicks timebase, 1274 void GpuCommandBufferStub::SendUpdateVSyncParameters(base::TimeTicks timebase,
1185 base::TimeDelta interval) { 1275 base::TimeDelta interval) {
1186 Send(new GpuCommandBufferMsg_UpdateVSyncParameters(route_id_, timebase, 1276 Send(new GpuCommandBufferMsg_UpdateVSyncParameters(route_id_, timebase,
1187 interval)); 1277 interval));
1188 } 1278 }
1189 1279
1190 } // namespace content 1280 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698