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 "gpu/ipc/service/gpu_command_buffer_stub.h" | 5 #include "gpu/ipc/service/gpu_command_buffer_stub.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 bool have_context = false; | 269 bool have_context = false; |
270 // Ensure the appropriate GL context is current before handling any IPC | 270 // Ensure the appropriate GL context is current before handling any IPC |
271 // messages directed at the command buffer. This ensures that the message | 271 // messages directed at the command buffer. This ensures that the message |
272 // handler can assume that the context is current (not necessary for | 272 // handler can assume that the context is current (not necessary for |
273 // RetireSyncPoint or WaitSyncPoint). | 273 // RetireSyncPoint or WaitSyncPoint). |
274 if (decoder_.get() && | 274 if (decoder_.get() && |
275 message.type() != GpuCommandBufferMsg_SetGetBuffer::ID && | 275 message.type() != GpuCommandBufferMsg_SetGetBuffer::ID && |
276 message.type() != GpuCommandBufferMsg_WaitForTokenInRange::ID && | 276 message.type() != GpuCommandBufferMsg_WaitForTokenInRange::ID && |
277 message.type() != GpuCommandBufferMsg_WaitForGetOffsetInRange::ID && | 277 message.type() != GpuCommandBufferMsg_WaitForGetOffsetInRange::ID && |
278 message.type() != GpuCommandBufferMsg_RegisterTransferBuffer::ID && | 278 message.type() != GpuCommandBufferMsg_RegisterTransferBuffer::ID && |
279 message.type() != GpuCommandBufferMsg_DestroyTransferBuffer::ID) { | 279 message.type() != GpuCommandBufferMsg_DestroyTransferBuffer::ID && |
| 280 message.type() != GpuCommandBufferMsg_WaitSyncToken::ID && |
| 281 message.type() != GpuCommandBufferMsg_SignalSyncToken::ID && |
| 282 message.type() != GpuCommandBufferMsg_SignalQuery::ID) { |
280 if (!MakeCurrent()) | 283 if (!MakeCurrent()) |
281 return false; | 284 return false; |
282 have_context = true; | 285 have_context = true; |
283 } | 286 } |
284 | 287 |
285 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers | 288 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers |
286 // here. This is so the reply can be delayed if the scheduler is unscheduled. | 289 // here. This is so the reply can be delayed if the scheduler is unscheduled. |
287 bool handled = true; | 290 bool handled = true; |
288 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) | 291 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) |
289 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer, | 292 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer, |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 if (!surface_format.IsCompatible(default_surface->GetFormat()) && !offscreen) | 638 if (!surface_format.IsCompatible(default_surface->GetFormat()) && !offscreen) |
636 use_virtualized_gl_context_ = false; | 639 use_virtualized_gl_context_ = false; |
637 #endif | 640 #endif |
638 | 641 |
639 command_buffer_.reset(new CommandBufferService( | 642 command_buffer_.reset(new CommandBufferService( |
640 context_group_->transfer_buffer_manager())); | 643 context_group_->transfer_buffer_manager())); |
641 | 644 |
642 decoder_.reset(gles2::GLES2Decoder::Create(context_group_.get())); | 645 decoder_.reset(gles2::GLES2Decoder::Create(context_group_.get())); |
643 executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(), | 646 executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(), |
644 decoder_.get())); | 647 decoder_.get())); |
645 sync_point_client_ = channel_->sync_point_manager()->CreateSyncPointClient( | 648 sync_point_client_ = base::MakeUnique<SyncPointClient>( |
| 649 channel_->sync_point_manager(), |
646 channel_->GetSyncPointOrderData(stream_id_), | 650 channel_->GetSyncPointOrderData(stream_id_), |
647 CommandBufferNamespace::GPU_IO, command_buffer_id_); | 651 CommandBufferNamespace::GPU_IO, command_buffer_id_); |
648 | 652 |
649 executor_->SetPreemptByFlag(channel_->preempted_flag()); | 653 executor_->SetPreemptByFlag(channel_->preempted_flag()); |
650 | 654 |
651 decoder_->set_engine(executor_.get()); | 655 decoder_->set_engine(executor_.get()); |
652 | 656 |
653 if (offscreen) { | 657 if (offscreen) { |
654 if (init_params.attribs.depth_size > 0) { | 658 if (init_params.attribs.depth_size > 0) { |
655 surface_format.SetDepthBits(init_params.attribs.depth_size); | 659 surface_format.SetDepthBits(init_params.attribs.depth_size); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 } | 780 } |
777 | 781 |
778 decoder_->GetLogger()->SetMsgCallback( | 782 decoder_->GetLogger()->SetMsgCallback( |
779 base::Bind(&GpuCommandBufferStub::SendConsoleMessage, | 783 base::Bind(&GpuCommandBufferStub::SendConsoleMessage, |
780 base::Unretained(this))); | 784 base::Unretained(this))); |
781 decoder_->SetShaderCacheCallback( | 785 decoder_->SetShaderCacheCallback( |
782 base::Bind(&GpuCommandBufferStub::SendCachedShader, | 786 base::Bind(&GpuCommandBufferStub::SendCachedShader, |
783 base::Unretained(this))); | 787 base::Unretained(this))); |
784 decoder_->SetFenceSyncReleaseCallback(base::Bind( | 788 decoder_->SetFenceSyncReleaseCallback(base::Bind( |
785 &GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this))); | 789 &GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this))); |
786 decoder_->SetWaitFenceSyncCallback(base::Bind( | 790 decoder_->SetWaitSyncTokenCallback(base::Bind( |
787 &GpuCommandBufferStub::OnWaitFenceSync, base::Unretained(this))); | 791 &GpuCommandBufferStub::OnWaitSyncToken, base::Unretained(this))); |
788 decoder_->SetDescheduleUntilFinishedCallback( | 792 decoder_->SetDescheduleUntilFinishedCallback( |
789 base::Bind(&GpuCommandBufferStub::OnDescheduleUntilFinished, | 793 base::Bind(&GpuCommandBufferStub::OnDescheduleUntilFinished, |
790 base::Unretained(this))); | 794 base::Unretained(this))); |
791 decoder_->SetRescheduleAfterFinishedCallback( | 795 decoder_->SetRescheduleAfterFinishedCallback( |
792 base::Bind(&GpuCommandBufferStub::OnRescheduleAfterFinished, | 796 base::Bind(&GpuCommandBufferStub::OnRescheduleAfterFinished, |
793 base::Unretained(this))); | 797 base::Unretained(this))); |
794 | 798 |
795 command_buffer_->SetPutOffsetChangeCallback( | 799 command_buffer_->SetPutOffsetChangeCallback( |
796 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); | 800 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); |
797 command_buffer_->SetGetBufferChangeCallback(base::Bind( | 801 command_buffer_->SetGetBufferChangeCallback(base::Bind( |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
995 channel_->watchdog()->CheckArmed(); | 999 channel_->watchdog()->CheckArmed(); |
996 } | 1000 } |
997 | 1001 |
998 void GpuCommandBufferStub::ReportState() { command_buffer_->UpdateState(); } | 1002 void GpuCommandBufferStub::ReportState() { command_buffer_->UpdateState(); } |
999 | 1003 |
1000 void GpuCommandBufferStub::PutChanged() { | 1004 void GpuCommandBufferStub::PutChanged() { |
1001 FastSetActiveURL(active_url_, active_url_hash_, channel_); | 1005 FastSetActiveURL(active_url_, active_url_hash_, channel_); |
1002 executor_->PutChanged(); | 1006 executor_->PutChanged(); |
1003 } | 1007 } |
1004 | 1008 |
1005 void GpuCommandBufferStub::PullTextureUpdates( | |
1006 CommandBufferNamespace namespace_id, | |
1007 CommandBufferId command_buffer_id, | |
1008 uint32_t release) { | |
1009 gles2::MailboxManager* mailbox_manager = | |
1010 context_group_->mailbox_manager(); | |
1011 if (mailbox_manager->UsesSync() && MakeCurrent()) { | |
1012 SyncToken sync_token(namespace_id, 0, command_buffer_id, release); | |
1013 mailbox_manager->PullTextureUpdates(sync_token); | |
1014 } | |
1015 } | |
1016 | |
1017 void GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) { | |
1018 OnWaitFenceSync(sync_token.namespace_id(), sync_token.command_buffer_id(), | |
1019 sync_token.release_count()); | |
1020 } | |
1021 | |
1022 void GpuCommandBufferStub::OnSignalSyncToken(const SyncToken& sync_token, | 1009 void GpuCommandBufferStub::OnSignalSyncToken(const SyncToken& sync_token, |
1023 uint32_t id) { | 1010 uint32_t id) { |
1024 scoped_refptr<SyncPointClientState> release_state = | 1011 if (!sync_point_client_->WaitNonThreadSafe( |
1025 channel_->sync_point_manager()->GetSyncPointClientState( | 1012 sync_token, channel_->task_runner(), |
1026 sync_token.namespace_id(), sync_token.command_buffer_id()); | 1013 base::Bind(&GpuCommandBufferStub::OnSignalAck, this->AsWeakPtr(), |
1027 | 1014 id))) { |
1028 if (release_state) { | |
1029 sync_point_client_->Wait(release_state.get(), sync_token.release_count(), | |
1030 base::Bind(&GpuCommandBufferStub::OnSignalAck, | |
1031 this->AsWeakPtr(), id)); | |
1032 } else { | |
1033 OnSignalAck(id); | 1015 OnSignalAck(id); |
1034 } | 1016 } |
1035 } | 1017 } |
1036 | 1018 |
1037 void GpuCommandBufferStub::OnSignalAck(uint32_t id) { | 1019 void GpuCommandBufferStub::OnSignalAck(uint32_t id) { |
1038 Send(new GpuCommandBufferMsg_SignalAck(route_id_, id)); | 1020 Send(new GpuCommandBufferMsg_SignalAck(route_id_, id)); |
1039 } | 1021 } |
1040 | 1022 |
1041 void GpuCommandBufferStub::OnSignalQuery(uint32_t query_id, uint32_t id) { | 1023 void GpuCommandBufferStub::OnSignalQuery(uint32_t query_id, uint32_t id) { |
1042 if (decoder_) { | 1024 if (decoder_) { |
1043 gles2::QueryManager* query_manager = decoder_->GetQueryManager(); | 1025 gles2::QueryManager* query_manager = decoder_->GetQueryManager(); |
1044 if (query_manager) { | 1026 if (query_manager) { |
1045 gles2::QueryManager::Query* query = | 1027 gles2::QueryManager::Query* query = |
1046 query_manager->GetQuery(query_id); | 1028 query_manager->GetQuery(query_id); |
1047 if (query) { | 1029 if (query) { |
1048 query->AddCallback( | 1030 query->AddCallback( |
1049 base::Bind(&GpuCommandBufferStub::OnSignalAck, | 1031 base::Bind(&GpuCommandBufferStub::OnSignalAck, |
1050 this->AsWeakPtr(), | 1032 this->AsWeakPtr(), |
1051 id)); | 1033 id)); |
1052 return; | 1034 return; |
1053 } | 1035 } |
1054 } | 1036 } |
1055 } | 1037 } |
1056 // Something went wrong, run callback immediately. | 1038 // Something went wrong, run callback immediately. |
1057 OnSignalAck(id); | 1039 OnSignalAck(id); |
1058 } | 1040 } |
1059 | 1041 |
1060 void GpuCommandBufferStub::OnFenceSyncRelease(uint64_t release) { | 1042 void GpuCommandBufferStub::OnFenceSyncRelease(uint64_t release) { |
1061 if (sync_point_client_->client_state()->IsFenceSyncReleased(release)) { | 1043 SyncToken sync_token(CommandBufferNamespace::GPU_IO, 0, command_buffer_id_, |
1062 DLOG(ERROR) << "Fence Sync has already been released."; | 1044 release); |
1063 return; | 1045 gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager(); |
1064 } | 1046 if (mailbox_manager->UsesSync() && MakeCurrent()) |
1065 | |
1066 gles2::MailboxManager* mailbox_manager = | |
1067 context_group_->mailbox_manager(); | |
1068 if (mailbox_manager->UsesSync() && MakeCurrent()) { | |
1069 SyncToken sync_token(CommandBufferNamespace::GPU_IO, 0, | |
1070 command_buffer_id_, release); | |
1071 mailbox_manager->PushTextureUpdates(sync_token); | 1047 mailbox_manager->PushTextureUpdates(sync_token); |
1072 } | |
1073 | 1048 |
1074 command_buffer_->SetReleaseCount(release); | 1049 command_buffer_->SetReleaseCount(release); |
1075 sync_point_client_->ReleaseFenceSync(release); | 1050 sync_point_client_->ReleaseFenceSync(release); |
1076 } | 1051 } |
1077 | 1052 |
1078 void GpuCommandBufferStub::OnDescheduleUntilFinished() { | 1053 void GpuCommandBufferStub::OnDescheduleUntilFinished() { |
1079 DCHECK(executor_->scheduled()); | 1054 DCHECK(executor_->scheduled()); |
1080 DCHECK(executor_->HasPollingWork()); | 1055 DCHECK(executor_->HasPollingWork()); |
1081 | 1056 |
1082 executor_->SetScheduled(false); | 1057 executor_->SetScheduled(false); |
1083 channel_->OnStreamRescheduled(stream_id_, false); | 1058 channel_->OnStreamRescheduled(stream_id_, false); |
1084 } | 1059 } |
1085 | 1060 |
1086 void GpuCommandBufferStub::OnRescheduleAfterFinished() { | 1061 void GpuCommandBufferStub::OnRescheduleAfterFinished() { |
1087 DCHECK(!executor_->scheduled()); | 1062 DCHECK(!executor_->scheduled()); |
1088 | 1063 |
1089 executor_->SetScheduled(true); | 1064 executor_->SetScheduled(true); |
1090 channel_->OnStreamRescheduled(stream_id_, true); | 1065 channel_->OnStreamRescheduled(stream_id_, true); |
1091 } | 1066 } |
1092 | 1067 |
1093 bool GpuCommandBufferStub::OnWaitFenceSync( | 1068 bool GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) { |
1094 CommandBufferNamespace namespace_id, | |
1095 CommandBufferId command_buffer_id, | |
1096 uint64_t release) { | |
1097 DCHECK(!waiting_for_sync_point_); | 1069 DCHECK(!waiting_for_sync_point_); |
1098 DCHECK(executor_->scheduled()); | 1070 DCHECK(executor_->scheduled()); |
| 1071 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncToken", this, "GpuCommandBufferStub", |
| 1072 this); |
1099 | 1073 |
1100 scoped_refptr<SyncPointClientState> release_state = | 1074 waiting_for_sync_point_ = sync_point_client_->WaitNonThreadSafe( |
1101 channel_->sync_point_manager()->GetSyncPointClientState( | 1075 sync_token, channel_->task_runner(), |
1102 namespace_id, command_buffer_id); | 1076 base::Bind(&GpuCommandBufferStub::OnWaitSyncTokenCompleted, AsWeakPtr(), |
| 1077 sync_token)); |
1103 | 1078 |
1104 if (!release_state) | 1079 if (waiting_for_sync_point_) { |
1105 return true; | 1080 executor_->SetScheduled(false); |
1106 | 1081 channel_->OnStreamRescheduled(stream_id_, false); |
1107 if (release_state->IsFenceSyncReleased(release)) { | |
1108 PullTextureUpdates(namespace_id, command_buffer_id, release); | |
1109 return true; | 1082 return true; |
1110 } | 1083 } |
1111 | 1084 |
1112 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub", | 1085 gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager(); |
1113 this); | 1086 if (mailbox_manager->UsesSync() && MakeCurrent()) |
1114 waiting_for_sync_point_ = true; | 1087 mailbox_manager->PullTextureUpdates(sync_token); |
1115 sync_point_client_->WaitNonThreadSafe( | |
1116 release_state.get(), release, channel_->task_runner(), | |
1117 base::Bind(&GpuCommandBufferStub::OnWaitFenceSyncCompleted, | |
1118 this->AsWeakPtr(), namespace_id, command_buffer_id, release)); | |
1119 | |
1120 if (!waiting_for_sync_point_) | |
1121 return true; | |
1122 | |
1123 executor_->SetScheduled(false); | |
1124 channel_->OnStreamRescheduled(stream_id_, false); | |
1125 return false; | 1088 return false; |
1126 } | 1089 } |
1127 | 1090 |
1128 void GpuCommandBufferStub::OnWaitFenceSyncCompleted( | 1091 void GpuCommandBufferStub::OnWaitSyncTokenCompleted( |
1129 CommandBufferNamespace namespace_id, | 1092 const SyncToken& sync_token) { |
1130 CommandBufferId command_buffer_id, | |
1131 uint64_t release) { | |
1132 DCHECK(waiting_for_sync_point_); | 1093 DCHECK(waiting_for_sync_point_); |
1133 TRACE_EVENT_ASYNC_END1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub", | 1094 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncTokenCompleted", this, |
1134 this); | 1095 "GpuCommandBufferStub", this); |
1135 PullTextureUpdates(namespace_id, command_buffer_id, release); | |
1136 waiting_for_sync_point_ = false; | 1096 waiting_for_sync_point_ = false; |
| 1097 |
| 1098 gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager(); |
| 1099 if (mailbox_manager->UsesSync() && MakeCurrent()) |
| 1100 mailbox_manager->PullTextureUpdates(sync_token); |
| 1101 |
1137 executor_->SetScheduled(true); | 1102 executor_->SetScheduled(true); |
1138 channel_->OnStreamRescheduled(stream_id_, true); | 1103 channel_->OnStreamRescheduled(stream_id_, true); |
1139 } | 1104 } |
1140 | 1105 |
1141 void GpuCommandBufferStub::OnCreateImage( | 1106 void GpuCommandBufferStub::OnCreateImage( |
1142 const GpuCommandBufferMsg_CreateImage_Params& params) { | 1107 const GpuCommandBufferMsg_CreateImage_Params& params) { |
1143 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateImage"); | 1108 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateImage"); |
1144 const int32_t id = params.id; | 1109 const int32_t id = params.id; |
1145 const gfx::GpuMemoryBufferHandle& handle = params.gpu_memory_buffer; | 1110 const gfx::GpuMemoryBufferHandle& handle = params.gpu_memory_buffer; |
1146 const gfx::Size& size = params.size; | 1111 const gfx::Size& size = params.size; |
(...skipping 27 matching lines...) Expand all Loading... |
1174 LOG(ERROR) << "Incompatible image format."; | 1139 LOG(ERROR) << "Incompatible image format."; |
1175 return; | 1140 return; |
1176 } | 1141 } |
1177 | 1142 |
1178 scoped_refptr<gl::GLImage> image = channel()->CreateImageForGpuMemoryBuffer( | 1143 scoped_refptr<gl::GLImage> image = channel()->CreateImageForGpuMemoryBuffer( |
1179 handle, size, format, internalformat, surface_handle_); | 1144 handle, size, format, internalformat, surface_handle_); |
1180 if (!image.get()) | 1145 if (!image.get()) |
1181 return; | 1146 return; |
1182 | 1147 |
1183 image_manager->AddImage(image.get(), id); | 1148 image_manager->AddImage(image.get(), id); |
1184 if (image_release_count) { | 1149 if (image_release_count) |
1185 DLOG_IF(ERROR, | |
1186 image_release_count != | |
1187 sync_point_client_->client_state()->fence_sync_release() + 1) | |
1188 << "Client released fences out of order."; | |
1189 sync_point_client_->ReleaseFenceSync(image_release_count); | 1150 sync_point_client_->ReleaseFenceSync(image_release_count); |
1190 } | |
1191 } | 1151 } |
1192 | 1152 |
1193 void GpuCommandBufferStub::OnDestroyImage(int32_t id) { | 1153 void GpuCommandBufferStub::OnDestroyImage(int32_t id) { |
1194 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyImage"); | 1154 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyImage"); |
1195 | 1155 |
1196 if (!decoder_) | 1156 if (!decoder_) |
1197 return; | 1157 return; |
1198 | 1158 |
1199 gles2::ImageManager* image_manager = decoder_->GetImageManager(); | 1159 gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
1200 DCHECK(image_manager); | 1160 DCHECK(image_manager); |
1201 if (!image_manager->LookupImage(id)) { | 1161 if (!image_manager->LookupImage(id)) { |
1202 LOG(ERROR) << "Image with ID doesn't exist."; | 1162 LOG(ERROR) << "Image with ID doesn't exist."; |
1203 return; | 1163 return; |
1204 } | 1164 } |
1205 | 1165 |
1206 image_manager->RemoveImage(id); | 1166 image_manager->RemoveImage(id); |
1207 } | 1167 } |
1208 | 1168 |
1209 void GpuCommandBufferStub::SendConsoleMessage(int32_t id, | 1169 void GpuCommandBufferStub::SendConsoleMessage(int32_t id, |
1210 const std::string& message) { | 1170 const std::string& message) { |
1211 GPUCommandBufferConsoleMessage console_message; | 1171 GPUCommandBufferConsoleMessage console_message; |
1212 console_message.id = id; | 1172 console_message.id = id; |
1213 console_message.message = message; | 1173 console_message.message = message; |
1214 IPC::Message* msg = new GpuCommandBufferMsg_ConsoleMsg( | 1174 IPC::Message* msg = |
1215 route_id_, console_message); | 1175 new GpuCommandBufferMsg_ConsoleMsg(route_id_, console_message); |
1216 msg->set_unblock(true); | 1176 msg->set_unblock(true); |
1217 Send(msg); | 1177 Send(msg); |
1218 } | 1178 } |
1219 | 1179 |
1220 void GpuCommandBufferStub::SendCachedShader( | 1180 void GpuCommandBufferStub::SendCachedShader(const std::string& key, |
1221 const std::string& key, const std::string& shader) { | 1181 const std::string& shader) { |
1222 channel_->CacheShader(key, shader); | 1182 channel_->CacheShader(key, shader); |
1223 } | 1183 } |
1224 | 1184 |
1225 void GpuCommandBufferStub::AddDestructionObserver( | 1185 void GpuCommandBufferStub::AddDestructionObserver( |
1226 DestructionObserver* observer) { | 1186 DestructionObserver* observer) { |
1227 destruction_observers_.AddObserver(observer); | 1187 destruction_observers_.AddObserver(observer); |
1228 } | 1188 } |
1229 | 1189 |
1230 void GpuCommandBufferStub::RemoveDestructionObserver( | 1190 void GpuCommandBufferStub::RemoveDestructionObserver( |
1231 DestructionObserver* observer) { | 1191 DestructionObserver* observer) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 command_buffer_->GetLastState().error == error::kLostContext) | 1229 command_buffer_->GetLastState().error == error::kLostContext) |
1270 return; | 1230 return; |
1271 | 1231 |
1272 command_buffer_->SetContextLostReason(error::kUnknown); | 1232 command_buffer_->SetContextLostReason(error::kUnknown); |
1273 if (decoder_) | 1233 if (decoder_) |
1274 decoder_->MarkContextLost(error::kUnknown); | 1234 decoder_->MarkContextLost(error::kUnknown); |
1275 command_buffer_->SetParseError(error::kLostContext); | 1235 command_buffer_->SetParseError(error::kLostContext); |
1276 } | 1236 } |
1277 | 1237 |
1278 } // namespace gpu | 1238 } // namespace gpu |
OLD | NEW |