// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/common/gpu/devtools_gpu_agent.h" #include "base/logging.h" #include "content/common/devtools_messages.h" #include "content/common/gpu/gpu_channel.h" #include "content/common/gpu/gpu_channel_manager.h" namespace content { DevToolsGpuAgent::DevToolsGpuAgent(GpuChannel* gpu_channel) : gpu_channel_(gpu_channel), route_id_(MSG_ROUTING_NONE) { } DevToolsGpuAgent::~DevToolsGpuAgent() { } bool DevToolsGpuAgent::StartEventsRecording(int32 route_id) { DCHECK(CalledOnValidThread()); if (route_id_ != MSG_ROUTING_NONE) { // Events recording is already in progress, so "fail" the call by // returning false. return false; } route_id_ = route_id; tasks_.reset(new GpuTaskInfoList()); GpuEventsDispatcher* dispatcher = gpu_channel_->gpu_channel_manager()->gpu_devtools_events_dispatcher(); dispatcher->AddProcessor(this); return true; } void DevToolsGpuAgent::StopEventsRecording() { DCHECK(CalledOnValidThread()); if (route_id_ == MSG_ROUTING_NONE) return; GpuEventsDispatcher* dispatcher = gpu_channel_->gpu_channel_manager()->gpu_devtools_events_dispatcher(); dispatcher->RemoveProcessor(this); route_id_ = MSG_ROUTING_NONE; } void DevToolsGpuAgent::ProcessEvent( TimeTicks timestamp, GpuEventsDispatcher::EventPhase phase, GpuChannel* channel) { DCHECK(CalledOnValidThread()); if (route_id_ == MSG_ROUTING_NONE) return; GpuTaskInfo task; task.timestamp = (timestamp - TimeTicks()).InSecondsF(); task.phase = phase; task.foreign = channel != gpu_channel_; task.gpu_memory_used_bytes = channel->GetMemoryUsage(); task.gpu_memory_limit_bytes = gpu_channel_->gpu_channel_manager()-> gpu_memory_manager()->GetMaximumClientAllocation(); const int kFlushIntervalMs = 100; const unsigned kMaxPendingItems = 100; if (!tasks_->empty() && ((timestamp - last_flush_time_).InMilliseconds() >= kFlushIntervalMs || tasks_->size() >= kMaxPendingItems)) { Send(new DevToolsAgentMsg_GpuTasksChunk(route_id_, *tasks_)); tasks_->clear(); last_flush_time_ = timestamp; } tasks_->push_back(task); } bool DevToolsGpuAgent::Send(IPC::Message* msg) { scoped_ptr message(msg); return gpu_channel_ && gpu_channel_->Send(message.release()); } } // namespace content