1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/common/gpu/devtools_gpu_agent.h" 6 7 #include "base/logging.h" 8 #include "content/common/devtools_messages.h" 9 #include "content/common/gpu/gpu_channel.h" 10 #include "content/common/gpu/gpu_channel_manager.h" 11 12 namespace content { 13 14 DevToolsGpuAgent::DevToolsGpuAgent(GpuChannel* gpu_channel) : 15 gpu_channel_(gpu_channel), 16 route_id_(MSG_ROUTING_NONE) { 17 } 18 19 DevToolsGpuAgent::~DevToolsGpuAgent() { 20 } 21 22 bool DevToolsGpuAgent::StartEventsRecording(int32 route_id) { 23 DCHECK(CalledOnValidThread()); 24 if (route_id_ != MSG_ROUTING_NONE) { 25 // Events recording is already in progress, so "fail" the call by 26 // returning false. 27 return false; 28 } 29 route_id_ = route_id; 30 tasks_.reset(new GpuTaskInfoList()); 31 GpuEventsDispatcher* dispatcher = 32 gpu_channel_->gpu_channel_manager()->gpu_devtools_events_dispatcher(); 33 dispatcher->AddProcessor(this); 34 return true; 35 } 36 37 void DevToolsGpuAgent::StopEventsRecording() { 38 DCHECK(CalledOnValidThread()); 39 if (route_id_ == MSG_ROUTING_NONE) 40 return; 41 GpuEventsDispatcher* dispatcher = 42 gpu_channel_->gpu_channel_manager()->gpu_devtools_events_dispatcher(); 43 dispatcher->RemoveProcessor(this); 44 route_id_ = MSG_ROUTING_NONE; 45 } 46 47 void DevToolsGpuAgent::ProcessEvent( 48 TimeTicks timestamp, 49 GpuEventsDispatcher::EventPhase phase, 50 GpuChannel* channel) { 51 DCHECK(CalledOnValidThread()); 52 if (route_id_ == MSG_ROUTING_NONE) 53 return; 54 55 GpuTaskInfo task; 56 task.timestamp = (timestamp - TimeTicks()).InSecondsF(); 57 task.phase = phase; 58 task.foreign = channel != gpu_channel_; 59 task.gpu_memory_used_bytes = channel->GetMemoryUsage(); 60 task.gpu_memory_limit_bytes = gpu_channel_->gpu_channel_manager()-> 61 gpu_memory_manager()->GetMaximumClientAllocation(); 62 63 const int kFlushIntervalMs = 100; 64 const unsigned kMaxPendingItems = 100; 65 if (!tasks_->empty() && 66 ((timestamp - last_flush_time_).InMilliseconds() >= kFlushIntervalMs || 67 tasks_->size() >= kMaxPendingItems)) { 68 Send(new DevToolsAgentMsg_GpuTasksChunk(route_id_, *tasks_)); 69 tasks_->clear(); 70 last_flush_time_ = timestamp; 71 } 72 tasks_->push_back(task); 73 } 74 75 bool DevToolsGpuAgent::Send(IPC::Message* msg) { 76 scoped_ptr<IPC::Message> message(msg); 77 return gpu_channel_ && gpu_channel_->Send(message.release()); 78 } 79 80 } // namespace content 81