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/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/hash.h" | 9 #include "base/hash.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 // here. This is so the reply can be delayed if the scheduler is unscheduled. | 203 // here. This is so the reply can be delayed if the scheduler is unscheduled. |
204 bool handled = true; | 204 bool handled = true; |
205 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) | 205 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) |
206 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize, | 206 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize, |
207 OnInitialize); | 207 OnInitialize); |
208 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer, | 208 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer, |
209 OnSetGetBuffer); | 209 OnSetGetBuffer); |
210 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ProduceFrontBuffer, | 210 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ProduceFrontBuffer, |
211 OnProduceFrontBuffer); | 211 OnProduceFrontBuffer); |
212 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Echo, OnEcho); | 212 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Echo, OnEcho); |
213 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetState, OnGetState); | |
214 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForTokenInRange, | 213 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForTokenInRange, |
215 OnWaitForTokenInRange); | 214 OnWaitForTokenInRange); |
216 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForGetOffsetInRange, | 215 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForGetOffsetInRange, |
217 OnWaitForGetOffsetInRange); | 216 OnWaitForGetOffsetInRange); |
218 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush); | 217 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush); |
219 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetLatencyInfo, OnSetLatencyInfo); | 218 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetLatencyInfo, OnSetLatencyInfo); |
220 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Rescheduled, OnRescheduled); | 219 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Rescheduled, OnRescheduled); |
221 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RegisterTransferBuffer, | 220 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RegisterTransferBuffer, |
222 OnRegisterTransferBuffer); | 221 OnRegisterTransferBuffer); |
223 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyTransferBuffer, | 222 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyTransferBuffer, |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 | 386 |
388 if (decoder_) | 387 if (decoder_) |
389 decoder_->set_engine(NULL); | 388 decoder_->set_engine(NULL); |
390 | 389 |
391 // The scheduler has raw references to the decoder and the command buffer so | 390 // The scheduler has raw references to the decoder and the command buffer so |
392 // destroy it before those. | 391 // destroy it before those. |
393 scheduler_.reset(); | 392 scheduler_.reset(); |
394 | 393 |
395 bool have_context = false; | 394 bool have_context = false; |
396 if (decoder_ && command_buffer_ && | 395 if (decoder_ && command_buffer_ && |
397 command_buffer_->GetState().error != gpu::error::kLostContext) | 396 command_buffer_->GetLastState().error != gpu::error::kLostContext) |
398 have_context = decoder_->MakeCurrent(); | 397 have_context = decoder_->MakeCurrent(); |
399 FOR_EACH_OBSERVER(DestructionObserver, | 398 FOR_EACH_OBSERVER(DestructionObserver, |
400 destruction_observers_, | 399 destruction_observers_, |
401 OnWillDestroyStub()); | 400 OnWillDestroyStub()); |
402 | 401 |
403 if (decoder_) { | 402 if (decoder_) { |
404 decoder_->Destroy(have_context); | 403 decoder_->Destroy(have_context); |
405 decoder_.reset(); | 404 decoder_.reset(); |
406 } | 405 } |
407 | 406 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 void GpuCommandBufferStub::OnProduceFrontBuffer(const gpu::Mailbox& mailbox) { | 643 void GpuCommandBufferStub::OnProduceFrontBuffer(const gpu::Mailbox& mailbox) { |
645 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnProduceFrontBuffer"); | 644 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnProduceFrontBuffer"); |
646 if (!decoder_) { | 645 if (!decoder_) { |
647 LOG(ERROR) << "Can't produce front buffer before initialization."; | 646 LOG(ERROR) << "Can't produce front buffer before initialization."; |
648 return; | 647 return; |
649 } | 648 } |
650 | 649 |
651 decoder_->ProduceFrontBuffer(mailbox); | 650 decoder_->ProduceFrontBuffer(mailbox); |
652 } | 651 } |
653 | 652 |
654 void GpuCommandBufferStub::OnGetState(IPC::Message* reply_message) { | |
655 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnGetState"); | |
656 if (command_buffer_) { | |
657 gpu::CommandBuffer::State state = command_buffer_->GetState(); | |
658 CheckContextLost(); | |
659 GpuCommandBufferMsg_GetState::WriteReplyParams(reply_message, state); | |
660 } else { | |
661 DLOG(ERROR) << "no command_buffer."; | |
662 reply_message->set_reply_error(); | |
663 } | |
664 Send(reply_message); | |
665 } | |
666 | |
667 void GpuCommandBufferStub::OnParseError() { | 653 void GpuCommandBufferStub::OnParseError() { |
668 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnParseError"); | 654 TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnParseError"); |
669 DCHECK(command_buffer_.get()); | 655 DCHECK(command_buffer_.get()); |
670 gpu::CommandBuffer::State state = command_buffer_->GetState(); | 656 gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
671 IPC::Message* msg = new GpuCommandBufferMsg_Destroyed( | 657 IPC::Message* msg = new GpuCommandBufferMsg_Destroyed( |
672 route_id_, state.context_lost_reason); | 658 route_id_, state.context_lost_reason); |
673 msg->set_unblock(true); | 659 msg->set_unblock(true); |
674 Send(msg); | 660 Send(msg); |
675 | 661 |
676 // Tell the browser about this context loss as well, so it can | 662 // Tell the browser about this context loss as well, so it can |
677 // determine whether client APIs like WebGL need to be immediately | 663 // determine whether client APIs like WebGL need to be immediately |
678 // blocked from automatically running. | 664 // blocked from automatically running. |
679 GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); | 665 GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); |
680 gpu_channel_manager->Send(new GpuHostMsg_DidLoseContext( | 666 gpu_channel_manager->Send(new GpuHostMsg_DidLoseContext( |
(...skipping 26 matching lines...) Expand all Loading... |
707 LOG(ERROR) | 693 LOG(ERROR) |
708 << "Got WaitForGetOffset command while currently waiting for offset."; | 694 << "Got WaitForGetOffset command while currently waiting for offset."; |
709 } | 695 } |
710 wait_for_get_offset_ = | 696 wait_for_get_offset_ = |
711 make_scoped_ptr(new WaitForCommandState(start, end, reply_message)); | 697 make_scoped_ptr(new WaitForCommandState(start, end, reply_message)); |
712 CheckCompleteWaits(); | 698 CheckCompleteWaits(); |
713 } | 699 } |
714 | 700 |
715 void GpuCommandBufferStub::CheckCompleteWaits() { | 701 void GpuCommandBufferStub::CheckCompleteWaits() { |
716 if (wait_for_token_ || wait_for_get_offset_) { | 702 if (wait_for_token_ || wait_for_get_offset_) { |
717 gpu::CommandBuffer::State state = command_buffer_->GetState(); | 703 gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
718 if (wait_for_token_ && | 704 if (wait_for_token_ && |
719 (gpu::CommandBuffer::InRange( | 705 (gpu::CommandBuffer::InRange( |
720 wait_for_token_->start, wait_for_token_->end, state.token) || | 706 wait_for_token_->start, wait_for_token_->end, state.token) || |
721 state.error != gpu::error::kNoError)) { | 707 state.error != gpu::error::kNoError)) { |
722 ReportState(); | 708 ReportState(); |
723 GpuCommandBufferMsg_WaitForTokenInRange::WriteReplyParams( | 709 GpuCommandBufferMsg_WaitForTokenInRange::WriteReplyParams( |
724 wait_for_token_->reply.get(), state); | 710 wait_for_token_->reply.get(), state); |
725 Send(wait_for_token_->reply.release()); | 711 Send(wait_for_token_->reply.release()); |
726 wait_for_token_.reset(); | 712 wait_for_token_.reset(); |
727 } | 713 } |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1035 void GpuCommandBufferStub::SuggestHaveFrontBuffer( | 1021 void GpuCommandBufferStub::SuggestHaveFrontBuffer( |
1036 bool suggest_have_frontbuffer) { | 1022 bool suggest_have_frontbuffer) { |
1037 // This can be called outside of OnMessageReceived, so the context needs | 1023 // This can be called outside of OnMessageReceived, so the context needs |
1038 // to be made current before calling methods on the surface. | 1024 // to be made current before calling methods on the surface. |
1039 if (surface_.get() && MakeCurrent()) | 1025 if (surface_.get() && MakeCurrent()) |
1040 surface_->SetFrontbufferAllocation(suggest_have_frontbuffer); | 1026 surface_->SetFrontbufferAllocation(suggest_have_frontbuffer); |
1041 } | 1027 } |
1042 | 1028 |
1043 bool GpuCommandBufferStub::CheckContextLost() { | 1029 bool GpuCommandBufferStub::CheckContextLost() { |
1044 DCHECK(command_buffer_); | 1030 DCHECK(command_buffer_); |
1045 gpu::CommandBuffer::State state = command_buffer_->GetState(); | 1031 gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
1046 bool was_lost = state.error == gpu::error::kLostContext; | 1032 bool was_lost = state.error == gpu::error::kLostContext; |
1047 // Lose all other contexts if the reset was triggered by the robustness | 1033 // Lose all other contexts if the reset was triggered by the robustness |
1048 // extension instead of being synthetic. | 1034 // extension instead of being synthetic. |
1049 if (was_lost && decoder_ && decoder_->WasContextLostByRobustnessExtension() && | 1035 if (was_lost && decoder_ && decoder_->WasContextLostByRobustnessExtension() && |
1050 (gfx::GLContext::LosesAllContextsOnContextLost() || | 1036 (gfx::GLContext::LosesAllContextsOnContextLost() || |
1051 use_virtualized_gl_context_)) | 1037 use_virtualized_gl_context_)) |
1052 channel_->LoseAllContexts(); | 1038 channel_->LoseAllContexts(); |
1053 CheckCompleteWaits(); | 1039 CheckCompleteWaits(); |
1054 return was_lost; | 1040 return was_lost; |
1055 } | 1041 } |
1056 | 1042 |
1057 void GpuCommandBufferStub::MarkContextLost() { | 1043 void GpuCommandBufferStub::MarkContextLost() { |
1058 if (!command_buffer_ || | 1044 if (!command_buffer_ || |
1059 command_buffer_->GetState().error == gpu::error::kLostContext) | 1045 command_buffer_->GetLastState().error == gpu::error::kLostContext) |
1060 return; | 1046 return; |
1061 | 1047 |
1062 command_buffer_->SetContextLostReason(gpu::error::kUnknown); | 1048 command_buffer_->SetContextLostReason(gpu::error::kUnknown); |
1063 if (decoder_) | 1049 if (decoder_) |
1064 decoder_->LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); | 1050 decoder_->LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); |
1065 command_buffer_->SetParseError(gpu::error::kLostContext); | 1051 command_buffer_->SetParseError(gpu::error::kLostContext); |
1066 } | 1052 } |
1067 | 1053 |
1068 uint64 GpuCommandBufferStub::GetMemoryUsage() const { | 1054 uint64 GpuCommandBufferStub::GetMemoryUsage() const { |
1069 return GetMemoryManager()->GetClientMemoryUsage(this); | 1055 return GetMemoryManager()->GetClientMemoryUsage(this); |
1070 } | 1056 } |
1071 | 1057 |
1072 } // namespace content | 1058 } // namespace content |
OLD | NEW |