Chromium Code Reviews| 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 "content/common/gpu/client/gpu_channel_host.h" | 5 #include "content/common/gpu/client/gpu_channel_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 | 28 |
| 29 namespace content { | 29 namespace content { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 // Global atomic to generate unique transfer buffer IDs. | 32 // Global atomic to generate unique transfer buffer IDs. |
| 33 base::StaticAtomicSequenceNumber g_next_transfer_buffer_id; | 33 base::StaticAtomicSequenceNumber g_next_transfer_buffer_id; |
| 34 | 34 |
| 35 } // namespace | 35 } // namespace |
| 36 | 36 |
| 37 GpuChannelHost::StreamFlushInfo::StreamFlushInfo() | 37 GpuChannelHost::StreamFlushInfo::StreamFlushInfo() |
| 38 : flush_pending(false), | 38 : next_stream_flush_id(1), |
| 39 flushed_stream_flush_id(0), | |
| 40 verified_stream_flush_id(0), | |
| 41 flush_pending(false), | |
| 39 route_id(MSG_ROUTING_NONE), | 42 route_id(MSG_ROUTING_NONE), |
| 40 put_offset(0), | 43 put_offset(0), |
| 41 flush_count(0) {} | 44 flush_count(0), |
| 45 flush_id(0) {} | |
| 42 | 46 |
| 43 GpuChannelHost::StreamFlushInfo::~StreamFlushInfo() {} | 47 GpuChannelHost::StreamFlushInfo::~StreamFlushInfo() {} |
| 44 | 48 |
| 45 // static | 49 // static |
| 46 scoped_refptr<GpuChannelHost> GpuChannelHost::Create( | 50 scoped_refptr<GpuChannelHost> GpuChannelHost::Create( |
| 47 GpuChannelHostFactory* factory, | 51 GpuChannelHostFactory* factory, |
| 48 int channel_id, | 52 int channel_id, |
| 49 const gpu::GPUInfo& gpu_info, | 53 const gpu::GPUInfo& gpu_info, |
| 50 const IPC::ChannelHandle& channel_handle, | 54 const IPC::ChannelHandle& channel_handle, |
| 51 base::WaitableEvent* shutdown_event, | 55 base::WaitableEvent* shutdown_event, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 bool result = channel_->Send(message.release()); | 124 bool result = channel_->Send(message.release()); |
| 121 if (!result) | 125 if (!result) |
| 122 DVLOG(1) << "GpuChannelHost::Send failed: Channel::Send failed"; | 126 DVLOG(1) << "GpuChannelHost::Send failed: Channel::Send failed"; |
| 123 return result; | 127 return result; |
| 124 } | 128 } |
| 125 | 129 |
| 126 bool result = sync_filter_->Send(message.release()); | 130 bool result = sync_filter_->Send(message.release()); |
| 127 return result; | 131 return result; |
| 128 } | 132 } |
| 129 | 133 |
| 130 void GpuChannelHost::OrderingBarrier( | 134 uint32_t GpuChannelHost::OrderingBarrier( |
| 131 int32 route_id, | 135 int32 route_id, |
| 132 int32 stream_id, | 136 int32 stream_id, |
| 133 int32 put_offset, | 137 int32 put_offset, |
| 134 uint32 flush_count, | 138 uint32 flush_count, |
| 135 const std::vector<ui::LatencyInfo>& latency_info, | 139 const std::vector<ui::LatencyInfo>& latency_info, |
| 136 bool put_offset_changed, | 140 bool put_offset_changed, |
| 137 bool do_flush) { | 141 bool do_flush) { |
| 138 AutoLock lock(context_lock_); | 142 AutoLock lock(context_lock_); |
| 139 StreamFlushInfo& flush_info = stream_flush_info_[stream_id]; | 143 StreamFlushInfo& flush_info = stream_flush_info_[stream_id]; |
| 140 if (flush_info.flush_pending && flush_info.route_id != route_id) | 144 if (flush_info.flush_pending && flush_info.route_id != route_id) |
| 141 InternalFlush(stream_id); | 145 InternalFlush(flush_info); |
| 142 | 146 |
| 143 if (put_offset_changed) { | 147 if (put_offset_changed) { |
| 148 const uint32_t flush_id = flush_info.next_stream_flush_id++; | |
| 144 flush_info.flush_pending = true; | 149 flush_info.flush_pending = true; |
| 145 flush_info.route_id = route_id; | 150 flush_info.route_id = route_id; |
| 146 flush_info.put_offset = put_offset; | 151 flush_info.put_offset = put_offset; |
| 147 flush_info.flush_count = flush_count; | 152 flush_info.flush_count = flush_count; |
| 153 flush_info.flush_id = flush_id; | |
| 148 flush_info.latency_info.insert(flush_info.latency_info.end(), | 154 flush_info.latency_info.insert(flush_info.latency_info.end(), |
| 149 latency_info.begin(), latency_info.end()); | 155 latency_info.begin(), latency_info.end()); |
| 150 | 156 |
| 151 if (do_flush) | 157 if (do_flush) |
| 152 InternalFlush(stream_id); | 158 InternalFlush(flush_info); |
| 159 | |
| 160 return flush_id; | |
| 153 } | 161 } |
| 162 return 0; | |
| 154 } | 163 } |
| 155 | 164 |
| 156 void GpuChannelHost::InternalFlush(int32 stream_id) { | 165 void GpuChannelHost::InternalFlush(StreamFlushInfo& flush_info) { |
|
dcheng
2015/09/28 07:39:33
Mutable reference arguments are not permitted by t
David Yen
2015/09/28 17:38:18
Done, changed to a pointer.
| |
| 157 context_lock_.AssertAcquired(); | 166 context_lock_.AssertAcquired(); |
| 158 StreamFlushInfo& flush_info = stream_flush_info_[stream_id]; | |
| 159 DCHECK(flush_info.flush_pending); | 167 DCHECK(flush_info.flush_pending); |
| 168 DCHECK(flush_info.flushed_stream_flush_id < flush_info.flush_id); | |
|
dcheng
2015/09/28 07:39:33
DCHECK_LT for a better log message if this ever fa
David Yen
2015/09/28 17:38:18
Done.
| |
| 160 Send(new GpuCommandBufferMsg_AsyncFlush( | 169 Send(new GpuCommandBufferMsg_AsyncFlush( |
| 161 flush_info.route_id, flush_info.put_offset, flush_info.flush_count, | 170 flush_info.route_id, flush_info.put_offset, flush_info.flush_count, |
| 162 flush_info.latency_info)); | 171 flush_info.latency_info)); |
| 163 flush_info.latency_info.clear(); | 172 flush_info.latency_info.clear(); |
| 164 flush_info.flush_pending = false; | 173 flush_info.flush_pending = false; |
| 174 | |
| 175 flush_info.flushed_stream_flush_id = flush_info.flush_id; | |
| 165 } | 176 } |
| 166 | 177 |
| 167 scoped_ptr<CommandBufferProxyImpl> GpuChannelHost::CreateViewCommandBuffer( | 178 scoped_ptr<CommandBufferProxyImpl> GpuChannelHost::CreateViewCommandBuffer( |
| 168 int32 surface_id, | 179 int32 surface_id, |
| 169 CommandBufferProxyImpl* share_group, | 180 CommandBufferProxyImpl* share_group, |
| 170 int32 stream_id, | 181 int32 stream_id, |
| 171 GpuStreamPriority stream_priority, | 182 GpuStreamPriority stream_priority, |
| 172 const std::vector<int32>& attribs, | 183 const std::vector<int32>& attribs, |
| 173 const GURL& active_url, | 184 const GURL& active_url, |
| 174 gfx::GpuPreference gpu_preference) { | 185 gfx::GpuPreference gpu_preference) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 283 void GpuChannelHost::DestroyCommandBuffer( | 294 void GpuChannelHost::DestroyCommandBuffer( |
| 284 CommandBufferProxyImpl* command_buffer) { | 295 CommandBufferProxyImpl* command_buffer) { |
| 285 TRACE_EVENT0("gpu", "GpuChannelHost::DestroyCommandBuffer"); | 296 TRACE_EVENT0("gpu", "GpuChannelHost::DestroyCommandBuffer"); |
| 286 | 297 |
| 287 int32 route_id = command_buffer->route_id(); | 298 int32 route_id = command_buffer->route_id(); |
| 288 int32 stream_id = command_buffer->stream_id(); | 299 int32 stream_id = command_buffer->stream_id(); |
| 289 Send(new GpuChannelMsg_DestroyCommandBuffer(route_id)); | 300 Send(new GpuChannelMsg_DestroyCommandBuffer(route_id)); |
| 290 RemoveRoute(route_id); | 301 RemoveRoute(route_id); |
| 291 | 302 |
| 292 AutoLock lock(context_lock_); | 303 AutoLock lock(context_lock_); |
| 293 if (stream_flush_info_[stream_id].route_id == route_id) | 304 StreamFlushInfo& flush_info = stream_flush_info_[stream_id]; |
| 294 stream_flush_info_.erase(stream_id); | 305 if (flush_info.flush_pending && flush_info.route_id == route_id) |
| 306 flush_info.flush_pending = false; | |
| 295 } | 307 } |
| 296 | 308 |
| 297 void GpuChannelHost::DestroyChannel() { | 309 void GpuChannelHost::DestroyChannel() { |
| 298 DCHECK(factory_->IsMainThread()); | 310 DCHECK(factory_->IsMainThread()); |
| 299 AutoLock lock(context_lock_); | 311 AutoLock lock(context_lock_); |
| 300 channel_.reset(); | 312 channel_.reset(); |
| 301 } | 313 } |
| 302 | 314 |
| 303 void GpuChannelHost::AddRoute( | 315 void GpuChannelHost::AddRoute( |
| 304 int route_id, base::WeakPtr<IPC::Listener> listener) { | 316 int route_id, base::WeakPtr<IPC::Listener> listener) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 383 } | 395 } |
| 384 | 396 |
| 385 int32 GpuChannelHost::GenerateRouteID() { | 397 int32 GpuChannelHost::GenerateRouteID() { |
| 386 return next_route_id_.GetNext(); | 398 return next_route_id_.GetNext(); |
| 387 } | 399 } |
| 388 | 400 |
| 389 int32 GpuChannelHost::GenerateStreamID() { | 401 int32 GpuChannelHost::GenerateStreamID() { |
| 390 return next_stream_id_.GetNext(); | 402 return next_stream_id_.GetNext(); |
| 391 } | 403 } |
| 392 | 404 |
| 405 uint32_t GpuChannelHost::ValidateFlushIDReachedServer(int32 stream_id) { | |
| 406 // Store what flush ids we will be validating for all streams. | |
| 407 base::hash_map<int32, uint32_t> validate_flushes; | |
| 408 { | |
| 409 AutoLock lock(context_lock_); | |
| 410 for (const auto& iter : stream_flush_info_) { | |
| 411 const int32 iter_stream_id = iter.first; | |
| 412 const StreamFlushInfo& flush_info = iter.second; | |
| 413 if (flush_info.flushed_stream_flush_id > | |
| 414 flush_info.verified_stream_flush_id) { | |
| 415 validate_flushes.insert( | |
| 416 std::make_pair(iter_stream_id, flush_info.flushed_stream_flush_id)); | |
| 417 } | |
| 418 } | |
| 419 } | |
| 420 | |
| 421 if (Send(new GpuChannelMsg_Nop())) { | |
| 422 // Update verified flush id for all streams. | |
| 423 uint32_t highest_flush_id = 0; | |
| 424 AutoLock lock(context_lock_); | |
| 425 for (const auto& iter : validate_flushes) { | |
| 426 const int32 validated_stream_id = iter.first; | |
| 427 const uint32_t validated_flush_id = iter.second; | |
| 428 StreamFlushInfo& flush_info = stream_flush_info_[validated_stream_id]; | |
| 429 if (flush_info.verified_stream_flush_id < validated_flush_id) { | |
| 430 flush_info.verified_stream_flush_id = validated_flush_id; | |
| 431 } | |
| 432 | |
| 433 if (validated_stream_id == stream_id) | |
| 434 highest_flush_id = flush_info.verified_stream_flush_id; | |
| 435 } | |
| 436 | |
| 437 return highest_flush_id; | |
| 438 } | |
| 439 | |
| 440 return 0; | |
| 441 } | |
| 442 | |
| 443 uint32_t GpuChannelHost::GetHighestValidatedFlushID(int32 stream_id) { | |
| 444 AutoLock lock(context_lock_); | |
| 445 StreamFlushInfo& flush_info = stream_flush_info_[stream_id]; | |
| 446 return flush_info.verified_stream_flush_id; | |
| 447 } | |
| 448 | |
| 393 GpuChannelHost::~GpuChannelHost() { | 449 GpuChannelHost::~GpuChannelHost() { |
| 394 #if DCHECK_IS_ON() | 450 #if DCHECK_IS_ON() |
| 395 AutoLock lock(context_lock_); | 451 AutoLock lock(context_lock_); |
| 396 DCHECK(!channel_) | 452 DCHECK(!channel_) |
| 397 << "GpuChannelHost::DestroyChannel must be called before destruction."; | 453 << "GpuChannelHost::DestroyChannel must be called before destruction."; |
| 398 #endif | 454 #endif |
| 399 } | 455 } |
| 400 | 456 |
| 401 GpuChannelHost::MessageFilter::ListenerInfo::ListenerInfo() {} | 457 GpuChannelHost::MessageFilter::ListenerInfo::ListenerInfo() {} |
| 402 | 458 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 461 | 517 |
| 462 listeners_.clear(); | 518 listeners_.clear(); |
| 463 } | 519 } |
| 464 | 520 |
| 465 bool GpuChannelHost::MessageFilter::IsLost() const { | 521 bool GpuChannelHost::MessageFilter::IsLost() const { |
| 466 AutoLock lock(lock_); | 522 AutoLock lock(lock_); |
| 467 return lost_; | 523 return lost_; |
| 468 } | 524 } |
| 469 | 525 |
| 470 } // namespace content | 526 } // namespace content |
| OLD | NEW |