Skip to content

Commit

Permalink
Add ANGLE Platform implementation.
Browse files Browse the repository at this point in the history
*re-re-land with SwiftShader fix*

*re-land with fix to components_browsertests*

This logic allows us to record traces and histograms easily within
ANGLE's code. It also gives a flexible design that we can extend
with further methods later, without breaking compilation. The
design is based on blink::Platform.

Also add two new histogram descriptions to histograms.xml, and
move the GPU Process metrics init to before InitializeOneOff, so
ANGLE can record histograms during Renderer initialization.

BUG=436191
TBR=jam@chromium.org, asvitkine@chromium.org, piman@chromium.org, maruel@chromium.org, kbr@chromium.org

Review URL: https://codereview.chromium.org/1007513006

Cr-Commit-Position: refs/heads/master@{#321225}
  • Loading branch information
null77 authored and Commit bot committed Mar 18, 2015
1 parent f4a0d6b commit 29fda86
Show file tree
Hide file tree
Showing 19 changed files with 193 additions and 20 deletions.
1 change: 1 addition & 0 deletions ash/ash_unittests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,6 @@
],
'includes': [
'../base/base.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions cc/cc_unittests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,6 @@
],
'includes': [
'../base/base.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions chrome/sync_integration_tests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,6 @@
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions chrome/unit_tests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -157,5 +157,6 @@
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
9 changes: 5 additions & 4 deletions components/components_browsertests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
{
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
],
'conditions': [
['use_x11==0', {
'variables': {
Expand Down Expand Up @@ -74,4 +70,9 @@
},
}],
],
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions components/components_unittests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,6 @@
],
'includes': [
'../base/base.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions content/content_browsertests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,6 @@
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
5 changes: 1 addition & 4 deletions content/content_gpu.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,10 @@
['OS=="win"', {
'include_dirs': [
'<(DEPTH)/third_party/khronos',
# ANGLE libs picked up from ui/gl
'<(angle_path)/src',
'<(DEPTH)/third_party/wtl/include',
],
'dependencies': [
'<(angle_path)/src/angle.gyp:libEGL',
'<(angle_path)/src/angle.gyp:libGLESv2',
],
'link_settings': {
'libraries': [
'-lsetupapi.lib',
Expand Down
1 change: 1 addition & 0 deletions content/content_unittests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -109,5 +109,6 @@
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
19 changes: 9 additions & 10 deletions content/gpu/gpu_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "base/lazy_instance.h"
#include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/metrics/statistics_recorder.h"
#include "base/rand_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
Expand Down Expand Up @@ -214,14 +215,14 @@ int GpuMain(const MainFunctionParams& parameters) {
watchdog_thread->StartWithOptions(options);
}

// Initializes StatisticsRecorder which tracks UMA histograms.
base::StatisticsRecorder::Initialize();

gpu::GPUInfo gpu_info;
// Get vendor_id, device_id, driver_version from browser process through
// commandline switches.
GetGpuInfoFromCommandLine(gpu_info, command_line);

base::TimeDelta collect_context_time;
base::TimeDelta initialize_one_off_time;

// Warm up resources that don't need access to GPUInfo.
if (WarmUpSandbox(command_line)) {
#if defined(OS_LINUX)
Expand Down Expand Up @@ -293,15 +294,18 @@ int GpuMain(const MainFunctionParams& parameters) {
#endif // !defined(OS_CHROMEOS)
#endif // defined(OS_LINUX)
#endif // !defined(OS_MACOSX)
collect_context_time =
base::TimeDelta collect_context_time =
base::TimeTicks::Now() - before_collect_context_graphics_info;
UMA_HISTOGRAM_TIMES("GPU.CollectContextGraphicsInfo",
collect_context_time);
} else { // gl_initialized
VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
dead_on_arrival = true;
}

initialize_one_off_time =
base::TimeDelta initialize_one_off_time =
base::TimeTicks::Now() - before_initialize_one_off;
UMA_HISTOGRAM_TIMES("GPU.InitializeOneOffTime", initialize_one_off_time);

if (enable_watchdog && delayed_watchdog_enable) {
watchdog_thread = new GpuWatchdogThread(kGpuTimeout);
Expand Down Expand Up @@ -342,11 +346,6 @@ int GpuMain(const MainFunctionParams& parameters) {

GpuProcess gpu_process;

// These UMA must be stored after GpuProcess is constructed as it
// initializes StatisticsRecorder which tracks the histograms.
UMA_HISTOGRAM_TIMES("GPU.CollectContextGraphicsInfo", collect_context_time);
UMA_HISTOGRAM_TIMES("GPU.InitializeOneOffTime", initialize_one_off_time);

GpuChildThread* child_thread = new GpuChildThread(watchdog_thread.get(),
dead_on_arrival,
gpu_info,
Expand Down
1 change: 1 addition & 0 deletions extensions/extensions_browsertests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,6 @@
'includes': [
'../base/base.isolate',
'../gin/v8.isolate',
'../third_party/angle/angle.isolate',
],
}
1 change: 1 addition & 0 deletions gpu/gpu_unittests.isolate
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,6 @@
],
'includes': [
'../base/base.isolate',
'../third_party/angle/angle.isolate',
],
}
40 changes: 39 additions & 1 deletion tools/metrics/histograms/histograms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10931,6 +10931,22 @@ Therefore, the affected-histogram name has to have at least one dot in it.
</summary>
</histogram>

<histogram name="GPU.ANGLE.D3D11InitializeResult" enum="D3D11InitializeResult">
<owner>jmadill@chromium.org</owner>
<summary>
The result from initializing a D3D11 device in ANGLE. Can be success, or one
of several error codes which indicate different reasons for failing.
</summary>
</histogram>

<histogram name="GPU.ANGLE.D3D9InitializeResult" enum="D3D9InitializeResult">
<owner>jmadill@chromium.org</owner>
<summary>
The result from initializing a D3D9 device in ANGLE. Can be success, or one
of several error codes which indicate different reasons for failing.
</summary>
</histogram>

<histogram name="GPU.CollectContextGraphicsInfo" units="microseconds">
<owner>vangelis@chromium.org</owner>
<summary>
Expand All @@ -10952,7 +10968,8 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<owner>jmadill@chromium.org</owner>
<summary>
ANGLE's currently active D3D shader model version. Logged once every startup
of the GPU process, on Windows only.
of the GPU process, on Windows only. Note that Shader Models 2 and 3 map to
D3D9 with ANGLE, and 4+ map to D3D11 ANGLE.
</summary>
</histogram>

Expand Down Expand Up @@ -46192,6 +46209,27 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<int value="2" label="Has enough SCTs"/>
</enum>

<enum name="D3D11InitializeResult" type="int">
<int value="0" label="Success"/>
<int value="1" label="Error initializing compiler"/>
<int value="2" label="Missing DLL dependency"/>
<int value="3" label="D3D11CreateDevice returned E_INVALIDARG"/>
<int value="4" label="D3D11CreateDevice returned other error"/>
<int value="5" label="DXGI version not supported"/>
<int value="6" label="Other initialization error"/>
</enum>

<enum name="D3D9InitializeResult" type="int">
<int value="0" label="Success"/>
<int value="1" label="Error initializing compiler"/>
<int value="2" label="Missing DLL dependency"/>
<int value="3" label="Error creating device"/>
<int value="4" label="Shader version not supported"/>
<int value="5" label="StretchRect from textures not supported"/>
<int value="6" label="Device lost of out-of-memory error"/>
<int value="7" label="Other initialization error"/>
</enum>

<enum name="DailyEventIntervalType" type="int">
<int value="0" label="First Run"/>
<int value="1" label="Day Elapsed"/>
Expand Down
2 changes: 2 additions & 0 deletions ui/gl/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ component("gl") {
}
if (is_win) {
sources += [
"angle_platform_impl.cc",
"angle_platform_impl.h",
"gl_bindings_autogen_wgl.cc",
"gl_bindings_autogen_wgl.h",
"gl_context_wgl.cc",
Expand Down
6 changes: 5 additions & 1 deletion ui/gl/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,9 @@ specific_include_rules = {
# get access to desktop OpenGL.
"gl_surface_osmesa.cc": [
"+third_party/mesa/src/include/GL/osmesa.h",
]
],
# Allow us to include ANGLE's base platform implementation.
"angle_platform_impl.h": [
"+third_party/angle/include/platform/Platform.h",
],
}
50 changes: 50 additions & 0 deletions ui/gl/angle_platform_impl.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2015 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 "ui/gl/angle_platform_impl.h"

#include "base/metrics/histogram.h"
#include "base/metrics/sparse_histogram.h"

namespace gfx {

ANGLEPlatformImpl::ANGLEPlatformImpl() {
}

ANGLEPlatformImpl::~ANGLEPlatformImpl() {
}

void ANGLEPlatformImpl::histogramCustomCounts(const char* name,
int sample,
int min,
int max,
int bucket_count) {
// Copied from histogram macro, but without the static variable caching
// the histogram because name is dynamic.
base::HistogramBase* counter = base::Histogram::FactoryGet(
name, min, max, bucket_count,
base::HistogramBase::kUmaTargetedHistogramFlag);
DCHECK_EQ(name, counter->histogram_name());
counter->Add(sample);
}

void ANGLEPlatformImpl::histogramEnumeration(const char* name,
int sample,
int boundary_value) {
// Copied from histogram macro, but without the static variable caching
// the histogram because name is dynamic.
base::HistogramBase* counter = base::LinearHistogram::FactoryGet(
name, 1, boundary_value, boundary_value + 1,
base::HistogramBase::kUmaTargetedHistogramFlag);
DCHECK_EQ(name, counter->histogram_name());
counter->Add(sample);
}

void ANGLEPlatformImpl::histogramSparse(const char* name, int sample) {
// For sparse histograms, we can use the macro, as it does not incorporate a
// static.
UMA_HISTOGRAM_SPARSE_SLOWLY(name, sample);
}

} // namespace gfx
39 changes: 39 additions & 0 deletions ui/gl/angle_platform_impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright 2015 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.

#ifndef UI_GL_ANGLE_PLATFORM_IMPL_H_
#define UI_GL_ANGLE_PLATFORM_IMPL_H_

// Implements the ANGLE platform interface, for functionality like
// histograms and trace profiling.

#include "base/macros.h"
#include "third_party/angle/include/platform/Platform.h"

namespace gfx {

// Derives the base ANGLE platform and provides implementations
class ANGLEPlatformImpl : public angle::Platform {
public:
ANGLEPlatformImpl();
~ANGLEPlatformImpl() override;

// angle::Platform:
void histogramCustomCounts(const char* name,
int sample,
int min,
int max,
int bucket_count) override;
void histogramEnumeration(const char* name,
int sample,
int boundary_value) override;
void histogramSparse(const char* name, int sample) override;

private:
DISALLOW_COPY_AND_ASSIGN(ANGLEPlatformImpl);
};

} // namespace gfx

#endif // UI_GL_ANGLE_PLATFORM_IMPL_H_
2 changes: 2 additions & 0 deletions ui/gl/gl.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,8 @@
}],
['OS=="win"', {
'sources': [
'angle_platform_impl.cc',
'angle_platform_impl.h',
'gl_bindings_autogen_wgl.cc',
'gl_bindings_autogen_wgl.h',
'gl_context_wgl.cc',
Expand Down
Loading

0 comments on commit 29fda86

Please sign in to comment.