Commit 163a84c6 authored by Alexei Filippov's avatar Alexei Filippov Committed by Commit Bot

Reland "DevTools: Restore GPU tasks recording in performance profiles."

This is a reland of 088dc9df

GpuProcessHost::Get() is now called with force_create set to false.

BUG=877058
TBR=dgozman@chromium.org,kbr@chromium.org

Original change's description:
> DevTools: Restore GPU tasks recording in performance profiles.
>
> Add GPU process pid to the list of processes where tracing is enabled.
>
> Change-Id: Ic401ee4ea7d218cad36f687be226d092cd4e54a0
> Reviewed-on: https://chromium-review.googlesource.com/1182304
> Commit-Queue: Alexei Filippov <alph@chromium.org>
> Reviewed-by: Kenneth Russell <kbr@chromium.org>
> Reviewed-by: Dmitry Gozman <dgozman@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#585301}

Change-Id: I21d6bc8e28724ced518d37a128af6797addaa1c0
Reviewed-on: https://chromium-review.googlesource.com/1187085
Commit-Queue: Alexei Filippov <alph@chromium.org>
Reviewed-by: default avatarAlexei Filippov <alph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586102}
parent a8e7bbd4
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/frame_host/navigation_handle_impl.h" #include "content/browser/frame_host/navigation_handle_impl.h"
#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/gpu/gpu_process_host.h"
#include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/tracing/tracing_controller_impl.h" #include "content/browser/tracing/tracing_controller_impl.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -404,7 +405,30 @@ void TracingHandler::Start(Maybe<std::string> categories, ...@@ -404,7 +405,30 @@ void TracingHandler::Start(Maybe<std::string> categories,
options.fromMaybe("")); options.fromMaybe(""));
} }
SetupProcessFilter(nullptr); // GPU process id can only be retrieved on IO thread. Do some thread hopping.
BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::IO, FROM_HERE, base::BindOnce([]() {
GpuProcessHost* gpu_process_host =
GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
/* force_create */ false);
return gpu_process_host ? gpu_process_host->GetProcessId()
: base::kNullProcessId;
}),
base::BindOnce(&TracingHandler::StartTracingWithGpuPid,
weak_factory_.GetWeakPtr(), std::move(callback)));
}
void TracingHandler::StartTracingWithGpuPid(
std::unique_ptr<StartCallback> callback,
base::ProcessId gpu_pid) {
// Check if tracing was stopped in mid-air.
if (!did_initiate_recording_) {
callback->sendFailure(Response::Error(
"Tracing was stopped before start has been completed."));
return;
}
SetupProcessFilter(gpu_pid, nullptr);
TracingController::GetInstance()->StartTracing( TracingController::GetInstance()->StartTracing(
trace_config_, base::BindRepeating(&TracingHandler::OnRecordingEnabled, trace_config_, base::BindRepeating(&TracingHandler::OnRecordingEnabled,
...@@ -413,14 +437,20 @@ void TracingHandler::Start(Maybe<std::string> categories, ...@@ -413,14 +437,20 @@ void TracingHandler::Start(Maybe<std::string> categories,
} }
void TracingHandler::SetupProcessFilter( void TracingHandler::SetupProcessFilter(
base::ProcessId gpu_pid,
RenderFrameHost* new_render_frame_host) { RenderFrameHost* new_render_frame_host) {
if (!frame_tree_node_) if (!frame_tree_node_)
return; return;
base::ProcessId browser_pid = base::Process::Current().Pid(); base::ProcessId browser_pid = base::Process::Current().Pid();
std::unordered_set<base::ProcessId> included_process_ids({browser_pid}); std::unordered_set<base::ProcessId> included_process_ids({browser_pid});
if (gpu_pid != base::kNullProcessId)
included_process_ids.insert(gpu_pid);
if (new_render_frame_host) if (new_render_frame_host)
AppendProcessId(new_render_frame_host, &included_process_ids); AppendProcessId(new_render_frame_host, &included_process_ids);
for (FrameTreeNode* node : for (FrameTreeNode* node :
frame_tree_node_->frame_tree()->SubtreeNodes(frame_tree_node_)) { frame_tree_node_->frame_tree()->SubtreeNodes(frame_tree_node_)) {
RenderFrameHost* frame_host = node->current_frame_host(); RenderFrameHost* frame_host = node->current_frame_host();
...@@ -495,8 +525,13 @@ void TracingHandler::GetCategories( ...@@ -495,8 +525,13 @@ void TracingHandler::GetCategories(
void TracingHandler::OnRecordingEnabled( void TracingHandler::OnRecordingEnabled(
std::unique_ptr<StartCallback> callback) { std::unique_ptr<StartCallback> callback) {
EmitFrameTree(); if (!did_initiate_recording_) {
callback->sendFailure(Response::Error(
"Tracing was stopped before start has been completed."));
return;
}
EmitFrameTree();
callback->sendSuccess(); callback->sendSuccess();
bool screenshot_enabled; bool screenshot_enabled;
...@@ -646,7 +681,8 @@ void TracingHandler::ReadyToCommitNavigation( ...@@ -646,7 +681,8 @@ void TracingHandler::ReadyToCommitNavigation(
"FrameCommittedInBrowser", TRACE_EVENT_SCOPE_THREAD, "FrameCommittedInBrowser", TRACE_EVENT_SCOPE_THREAD,
"data", std::move(data)); "data", std::move(data));
SetupProcessFilter(navigation_handle->GetRenderFrameHost()); SetupProcessFilter(base::kNullProcessId,
navigation_handle->GetRenderFrameHost());
TracingController::GetInstance()->StartTracing( TracingController::GetInstance()->StartTracing(
trace_config_, base::RepeatingCallback<void()>()); trace_config_, base::RepeatingCallback<void()>());
} }
......
...@@ -116,7 +116,9 @@ class TracingHandler : public DevToolsDomainHandler, public Tracing::Backend { ...@@ -116,7 +116,9 @@ class TracingHandler : public DevToolsDomainHandler, public Tracing::Backend {
CONTENT_EXPORT static base::trace_event::TraceConfig CONTENT_EXPORT static base::trace_event::TraceConfig
GetTraceConfigFromDevToolsConfig( GetTraceConfigFromDevToolsConfig(
const base::DictionaryValue& devtools_config); const base::DictionaryValue& devtools_config);
void SetupProcessFilter(RenderFrameHost*); void SetupProcessFilter(base::ProcessId gpu_pid, RenderFrameHost*);
void StartTracingWithGpuPid(std::unique_ptr<StartCallback>,
base::ProcessId gpu_pid);
void AppendProcessId(RenderFrameHost*, void AppendProcessId(RenderFrameHost*,
std::unordered_set<base::ProcessId>* process_set); std::unordered_set<base::ProcessId>* process_set);
void OnProcessReady(RenderProcessHost*); void OnProcessReady(RenderProcessHost*);
......
...@@ -677,6 +677,11 @@ GpuProcessHost* GpuProcessHost::FromID(int host_id) { ...@@ -677,6 +677,11 @@ GpuProcessHost* GpuProcessHost::FromID(int host_id) {
return nullptr; return nullptr;
} }
base::ProcessId GpuProcessHost::GetProcessId() const {
return !in_process_ && initialized_ ? process_->GetProcess().Pid()
: base::kNullProcessId;
}
// static // static
int GpuProcessHost::GetGpuCrashCount() { int GpuProcessHost::GetGpuCrashCount() {
return static_cast<int>(base::subtle::NoBarrier_Load(&gpu_crash_count_)); return static_cast<int>(base::subtle::NoBarrier_Load(&gpu_crash_count_));
......
...@@ -118,6 +118,7 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate, ...@@ -118,6 +118,7 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate,
// null if the process no longer exists. // null if the process no longer exists.
static GpuProcessHost* FromID(int host_id); static GpuProcessHost* FromID(int host_id);
int host_id() const { return host_id_; } int host_id() const { return host_id_; }
base::ProcessId GetProcessId() const;
// IPC::Sender implementation. // IPC::Sender implementation.
bool Send(IPC::Message* msg) override; bool Send(IPC::Message* msg) override;
......
Tests the Timeline events for GPUTask
Found GPUTask events: true
// Copyright 2018 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.
(async function() {
TestRunner.addResult(`Tests the Timeline events for GPUTask\n`);
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
await TestRunner.evaluateInPagePromise(`
async function performActions() {
const gl = document.createElement('canvas').getContext('webgl');
return gl.getParameter(gl.MAX_VIEWPORT_DIMS);
}
`);
await PerformanceTestRunner.invokeAsyncWithTimeline('performActions');
const tracingModel = PerformanceTestRunner.tracingModel();
const hasGPUTasks = tracingModel.sortedProcesses().some(p => p.sortedThreads().some(t => t.events().some(
event => event.name === TimelineModel.TimelineModel.RecordType.GPUTask)));
TestRunner.addResult(`Found GPUTask events: ${hasGPUTasks}`);
TestRunner.completeTest();
})();
...@@ -2,5 +2,5 @@ Tests that tracing does not record unrelated processes. ...@@ -2,5 +2,5 @@ Tests that tracing does not record unrelated processes.
Recording started Recording started
Another page Another page
Tracing complete Tracing complete
There should be just 2 processes (browser and renderer): 2 There should be just 3 processes (browser, GPU, and renderer): 3
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
const pids = new Set(); const pids = new Set();
for (const event of events) for (const event of events)
pids.add(event.pid); pids.add(event.pid);
testRunner.log(`There should be just 2 processes (browser and renderer): ${pids.size}`); testRunner.log(`There should be just 3 processes (browser, GPU, and renderer): ${pids.size}`);
testRunner.completeTest(); testRunner.completeTest();
}) })
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment