OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |