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

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: Improved commented out sample mojo code 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 (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 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 661
662 decoder_->GetLogger()->SetMsgCallback( 662 decoder_->GetLogger()->SetMsgCallback(
663 base::Bind(&GpuCommandBufferStub::SendConsoleMessage, 663 base::Bind(&GpuCommandBufferStub::SendConsoleMessage,
664 base::Unretained(this))); 664 base::Unretained(this)));
665 decoder_->SetShaderCacheCallback( 665 decoder_->SetShaderCacheCallback(
666 base::Bind(&GpuCommandBufferStub::SendCachedShader, 666 base::Bind(&GpuCommandBufferStub::SendCachedShader,
667 base::Unretained(this))); 667 base::Unretained(this)));
668 decoder_->SetWaitSyncPointCallback( 668 decoder_->SetWaitSyncPointCallback(
669 base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint, 669 base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint,
670 base::Unretained(this))); 670 base::Unretained(this)));
671 decoder_->SetFenceSyncReleaseCallback(base::Bind(
672 &GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this)));
673 decoder_->SetWaitFenceSyncCallback(base::Bind(
674 &GpuCommandBufferStub::OnWaitFenceSync, base::Unretained(this)));
671 675
672 command_buffer_->SetPutOffsetChangeCallback( 676 command_buffer_->SetPutOffsetChangeCallback(
673 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); 677 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this)));
674 command_buffer_->SetGetBufferChangeCallback( 678 command_buffer_->SetGetBufferChangeCallback(
675 base::Bind(&gpu::GpuScheduler::SetGetBuffer, 679 base::Bind(&gpu::GpuScheduler::SetGetBuffer,
676 base::Unretained(scheduler_.get()))); 680 base::Unretained(scheduler_.get())));
677 command_buffer_->SetParseErrorCallback( 681 command_buffer_->SetParseErrorCallback(
678 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this))); 682 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this)));
679 scheduler_->SetSchedulingChangedCallback(base::Bind( 683 scheduler_->SetSchedulingChangedCallback(base::Bind(
680 &GpuCommandBufferStub::OnSchedulingChanged, base::Unretained(this))); 684 &GpuCommandBufferStub::OnSchedulingChanged, base::Unretained(this)));
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 if (retire) 954 if (retire)
951 OnRetireSyncPoint(sync_point); 955 OnRetireSyncPoint(sync_point);
952 } 956 }
953 957
954 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { 958 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) {
955 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point); 959 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point);
956 sync_points_.pop_front(); 960 sync_points_.pop_front();
957 961
958 gpu::gles2::MailboxManager* mailbox_manager = 962 gpu::gles2::MailboxManager* mailbox_manager =
959 context_group_->mailbox_manager(); 963 context_group_->mailbox_manager();
960 if (mailbox_manager->UsesSync() && MakeCurrent()) 964 if (mailbox_manager->UsesSync() && MakeCurrent()) {
961 mailbox_manager->PushTextureUpdates(sync_point); 965 // Old sync points are global and do not have a command buffer ID,
966 // We can simply use the global sync point number as the release count with
967 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
968 // will not be used) until the old sync points are replaced.
969 gpu::gles2::SyncToken sync_token = {
970 gpu::CommandBufferNamespace::GPU_IO,
971 0,
972 sync_point
973 };
974 mailbox_manager->PushTextureUpdates(sync_token);
975 }
962 976
963 GpuChannelManager* manager = channel_->gpu_channel_manager(); 977 GpuChannelManager* manager = channel_->gpu_channel_manager();
964 manager->sync_point_manager()->RetireSyncPoint(sync_point); 978 manager->sync_point_manager()->RetireSyncPoint(sync_point);
965 } 979 }
966 980
967 bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { 981 bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) {
968 DCHECK(!waiting_for_sync_point_); 982 DCHECK(!waiting_for_sync_point_);
969 DCHECK(scheduler_->scheduled()); 983 DCHECK(scheduler_->scheduled());
970 if (!sync_point) 984 if (!sync_point)
971 return true; 985 return true;
972 GpuChannelManager* manager = channel_->gpu_channel_manager(); 986 GpuChannelManager* manager = channel_->gpu_channel_manager();
973 if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) { 987 if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) {
974 PullTextureUpdates(sync_point); 988 // Old sync points are global and do not have a command buffer ID,
989 // We can simply use the global sync point number as the release count with
990 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
991 // will not be used) until the old sync points are replaced.
992 PullTextureUpdates(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point);
975 return true; 993 return true;
976 } 994 }
977 995
978 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub", 996 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub",
979 this); 997 this);
980 998
981 scheduler_->SetScheduled(false); 999 scheduler_->SetScheduled(false);
982 waiting_for_sync_point_ = true; 1000 waiting_for_sync_point_ = true;
983 manager->sync_point_manager()->AddSyncPointCallback( 1001 manager->sync_point_manager()->AddSyncPointCallback(
984 sync_point, 1002 sync_point,
985 base::Bind(&RunOnThread, task_runner_, 1003 base::Bind(&RunOnThread, task_runner_,
986 base::Bind(&GpuCommandBufferStub::OnWaitSyncPointCompleted, 1004 base::Bind(&GpuCommandBufferStub::OnWaitSyncPointCompleted,
987 this->AsWeakPtr(), sync_point))); 1005 this->AsWeakPtr(), sync_point)));
988 return !waiting_for_sync_point_; 1006 return !waiting_for_sync_point_;
989 } 1007 }
990 1008
991 void GpuCommandBufferStub::OnWaitSyncPointCompleted(uint32 sync_point) { 1009 void GpuCommandBufferStub::OnWaitSyncPointCompleted(uint32 sync_point) {
992 DCHECK(waiting_for_sync_point_); 1010 DCHECK(waiting_for_sync_point_);
993 DCHECK(!scheduler_->scheduled()); 1011 DCHECK(!scheduler_->scheduled());
994 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub", 1012 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, "GpuCommandBufferStub",
995 this); 1013 this);
996 PullTextureUpdates(sync_point); 1014 // Old sync points are global and do not have a command buffer ID,
1015 // We can simply use the global sync point number as the release count with
1016 // 0 for the command buffer ID (under normal circumstances 0 is invalid so
1017 // will not be used) until the old sync points are replaced.
1018 PullTextureUpdates(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point);
997 waiting_for_sync_point_ = false; 1019 waiting_for_sync_point_ = false;
998 scheduler_->SetScheduled(true); 1020 scheduler_->SetScheduled(true);
999 } 1021 }
1000 1022
1001 void GpuCommandBufferStub::PullTextureUpdates(uint32 sync_point) { 1023 void GpuCommandBufferStub::PullTextureUpdates(
1024 gpu::CommandBufferNamespace namespace_id,
1025 uint64_t command_buffer_id,
1026 uint32_t release) {
1002 gpu::gles2::MailboxManager* mailbox_manager = 1027 gpu::gles2::MailboxManager* mailbox_manager =
1003 context_group_->mailbox_manager(); 1028 context_group_->mailbox_manager();
1004 if (mailbox_manager->UsesSync() && MakeCurrent()) 1029 if (mailbox_manager->UsesSync() && MakeCurrent()) {
1005 mailbox_manager->PullTextureUpdates(sync_point); 1030 gpu::gles2::SyncToken sync_token = {
1031 namespace_id,
1032 command_buffer_id,
1033 release
1034 };
1035 mailbox_manager->PullTextureUpdates(sync_token);
1036 }
1006 } 1037 }
1007 1038
1008 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) { 1039 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) {
1009 GpuChannelManager* manager = channel_->gpu_channel_manager(); 1040 GpuChannelManager* manager = channel_->gpu_channel_manager();
1010 manager->sync_point_manager()->AddSyncPointCallback( 1041 manager->sync_point_manager()->AddSyncPointCallback(
1011 sync_point, 1042 sync_point,
1012 base::Bind(&RunOnThread, task_runner_, 1043 base::Bind(&RunOnThread, task_runner_,
1013 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 1044 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck,
1014 this->AsWeakPtr(), id))); 1045 this->AsWeakPtr(), id)));
1015 } 1046 }
(...skipping 14 matching lines...) Expand all
1030 this->AsWeakPtr(), 1061 this->AsWeakPtr(),
1031 id)); 1062 id));
1032 return; 1063 return;
1033 } 1064 }
1034 } 1065 }
1035 } 1066 }
1036 // Something went wrong, run callback immediately. 1067 // Something went wrong, run callback immediately.
1037 OnSignalSyncPointAck(id); 1068 OnSignalSyncPointAck(id);
1038 } 1069 }
1039 1070
1071 void GpuCommandBufferStub::OnFenceSyncRelease(uint32_t release) {
1072 if (!sync_point_client_->client_state()->IsFenceSyncReleased(release)) {
1073 gpu::gles2::MailboxManager* mailbox_manager =
1074 context_group_->mailbox_manager();
1075 if (mailbox_manager->UsesSync() && MakeCurrent()) {
1076 gpu::gles2::SyncToken sync_token = {
1077 gpu::CommandBufferNamespace::GPU_IO,
1078 command_buffer_id_,
1079 release
1080 };
1081 mailbox_manager->PushTextureUpdates(sync_token);
1082 }
1083
1084 sync_point_client_->ReleaseFenceSync(release);
1085 }
1086 }
1087
1088 bool GpuCommandBufferStub::OnWaitFenceSync(
1089 gpu::CommandBufferNamespace namespace_id,
1090 uint64_t command_buffer_id,
1091 uint32_t release) {
1092 DCHECK(!waiting_for_sync_point_);
1093 DCHECK(scheduler_->scheduled());
1094
1095 GpuChannelManager* manager = channel_->gpu_channel_manager();
1096 DCHECK(manager);
1097
1098 gpu::SyncPointManager* sync_point_manager = manager->sync_point_manager();
1099 DCHECK(sync_point_manager);
1100
1101 scoped_refptr<gpu::SyncPointClientState> release_state =
1102 sync_point_manager->GetSyncPointClientState(namespace_id,
1103 command_buffer_id);
1104
1105 if (!release_state.get())
dcheng 2015/09/28 07:39:33 No .get()
David Yen 2015/09/28 17:38:18 Done.
1106 return true;
1107
1108 if (release_state->IsFenceSyncReleased(release)) {
1109 PullTextureUpdates(namespace_id, command_buffer_id, release);
1110 return true;
1111 }
1112
1113 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitFenceSync", this,
1114 "GpuCommandBufferStub", this);
1115 scheduler_->SetScheduled(false);
1116 waiting_for_sync_point_ = true;
1117 sync_point_client_->Wait(
1118 release_state,
1119 release,
1120 base::Bind(&GpuCommandBufferStub::OnWaitFenceSyncCompleted,
1121 this->AsWeakPtr(), namespace_id, command_buffer_id, release));
1122
1123 return scheduler_->scheduled();
1124 }
1125
1126 void GpuCommandBufferStub::OnWaitFenceSyncCompleted(
1127 gpu::CommandBufferNamespace namespace_id,
1128 uint64_t command_buffer_id,
1129 uint32_t release) {
1130 DCHECK(waiting_for_sync_point_);
1131 DCHECK(!scheduler_->scheduled());
1132 TRACE_EVENT_ASYNC_END1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub",
1133 this);
1134 PullTextureUpdates(namespace_id, command_buffer_id, release);
1135 scheduler_->SetScheduled(true);
1136 }
1040 1137
1041 void GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback( 1138 void GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback(
1042 bool has_callback) { 1139 bool has_callback) {
1043 TRACE_EVENT0( 1140 TRACE_EVENT0(
1044 "gpu", 1141 "gpu",
1045 "GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback"); 1142 "GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback");
1046 if (has_callback) { 1143 if (has_callback) {
1047 if (!memory_manager_client_state_) { 1144 if (!memory_manager_client_state_) {
1048 memory_manager_client_state_.reset(GetMemoryManager()->CreateClientState( 1145 memory_manager_client_state_.reset(GetMemoryManager()->CreateClientState(
1049 this, surface_id_ != 0, true)); 1146 this, surface_id_ != 0, true));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 result)); 1337 result));
1241 } 1338 }
1242 1339
1243 void GpuCommandBufferStub::SendUpdateVSyncParameters(base::TimeTicks timebase, 1340 void GpuCommandBufferStub::SendUpdateVSyncParameters(base::TimeTicks timebase,
1244 base::TimeDelta interval) { 1341 base::TimeDelta interval) {
1245 Send(new GpuCommandBufferMsg_UpdateVSyncParameters(route_id_, timebase, 1342 Send(new GpuCommandBufferMsg_UpdateVSyncParameters(route_id_, timebase,
1246 interval)); 1343 interval));
1247 } 1344 }
1248 1345
1249 } // namespace content 1346 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698