• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
DevToolsGpuAgent(GpuChannel * gpu_channel)14 DevToolsGpuAgent::DevToolsGpuAgent(GpuChannel* gpu_channel) :
15     gpu_channel_(gpu_channel),
16     route_id_(MSG_ROUTING_NONE) {
17 }
18 
~DevToolsGpuAgent()19 DevToolsGpuAgent::~DevToolsGpuAgent() {
20 }
21 
StartEventsRecording(int32 route_id)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 
StopEventsRecording()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 
ProcessEvent(TimeTicks timestamp,GpuEventsDispatcher::EventPhase phase,GpuChannel * channel)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 
Send(IPC::Message * msg)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