diff options
-rw-r--r-- | ash/ash_unittests.isolate | 1 | ||||
-rw-r--r-- | cc/cc_unittests.isolate | 1 | ||||
-rw-r--r-- | chrome/sync_integration_tests.isolate | 1 | ||||
-rw-r--r-- | chrome/unit_tests.isolate | 1 | ||||
-rw-r--r-- | components/components_unittests.isolate | 1 | ||||
-rw-r--r-- | content/content_browsertests.isolate | 1 | ||||
-rw-r--r-- | content/content_gpu.gypi | 5 | ||||
-rw-r--r-- | content/content_unittests.isolate | 1 | ||||
-rw-r--r-- | content/gpu/gpu_main.cc | 19 | ||||
-rw-r--r-- | extensions/extensions_browsertests.isolate | 1 | ||||
-rw-r--r-- | gpu/gpu_unittests.isolate | 1 | ||||
-rw-r--r-- | tools/metrics/histograms/histograms.xml | 40 | ||||
-rw-r--r-- | ui/gl/BUILD.gn | 4 | ||||
-rw-r--r-- | ui/gl/DEPS | 6 | ||||
-rw-r--r-- | ui/gl/angle_platform_impl.cc | 50 | ||||
-rw-r--r-- | ui/gl/angle_platform_impl.h | 39 | ||||
-rw-r--r-- | ui/gl/gl.gyp | 7 | ||||
-rw-r--r-- | ui/gl/gl_implementation_win.cc | 14 |
18 files changed, 177 insertions, 16 deletions
diff --git a/ash/ash_unittests.isolate b/ash/ash_unittests.isolate index 319dfc7..40e3e79 100644 --- a/ash/ash_unittests.isolate +++ b/ash/ash_unittests.isolate @@ -64,5 +64,6 @@ ], 'includes': [ '../base/base.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/cc/cc_unittests.isolate b/cc/cc_unittests.isolate index eab3396..f4a6f45 100644 --- a/cc/cc_unittests.isolate +++ b/cc/cc_unittests.isolate @@ -89,5 +89,6 @@ ], 'includes': [ '../base/base.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/chrome/sync_integration_tests.isolate b/chrome/sync_integration_tests.isolate index abecb56..06741e3 100644 --- a/chrome/sync_integration_tests.isolate +++ b/chrome/sync_integration_tests.isolate @@ -108,5 +108,6 @@ 'includes': [ '../base/base.isolate', '../gin/v8.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/chrome/unit_tests.isolate b/chrome/unit_tests.isolate index 715e1fe..33821eb 100644 --- a/chrome/unit_tests.isolate +++ b/chrome/unit_tests.isolate @@ -157,5 +157,6 @@ 'includes': [ '../base/base.isolate', '../gin/v8.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/components/components_unittests.isolate b/components/components_unittests.isolate index fc3491d..07e1e0f 100644 --- a/components/components_unittests.isolate +++ b/components/components_unittests.isolate @@ -93,5 +93,6 @@ ], 'includes': [ '../base/base.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/content/content_browsertests.isolate b/content/content_browsertests.isolate index 84379d6..aa24c23 100644 --- a/content/content_browsertests.isolate +++ b/content/content_browsertests.isolate @@ -141,5 +141,6 @@ 'includes': [ '../base/base.isolate', '../gin/v8.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/content/content_gpu.gypi b/content/content_gpu.gypi index af0c47f..1c2121d 100644 --- a/content/content_gpu.gypi +++ b/content/content_gpu.gypi @@ -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', diff --git a/content/content_unittests.isolate b/content/content_unittests.isolate index f61a3e1..07ac6e7 100644 --- a/content/content_unittests.isolate +++ b/content/content_unittests.isolate @@ -109,5 +109,6 @@ 'includes': [ '../base/base.isolate', '../gin/v8.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc index b34d42f..76a6020 100644 --- a/content/gpu/gpu_main.cc +++ b/content/gpu/gpu_main.cc @@ -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" @@ -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) @@ -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); @@ -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, diff --git a/extensions/extensions_browsertests.isolate b/extensions/extensions_browsertests.isolate index a8a6fb1..9681fbe 100644 --- a/extensions/extensions_browsertests.isolate +++ b/extensions/extensions_browsertests.isolate @@ -74,5 +74,6 @@ 'includes': [ '../base/base.isolate', '../gin/v8.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/gpu/gpu_unittests.isolate b/gpu/gpu_unittests.isolate index a718aac..9f4c87a 100644 --- a/gpu/gpu_unittests.isolate +++ b/gpu/gpu_unittests.isolate @@ -72,5 +72,6 @@ ], 'includes': [ '../base/base.isolate', + '../third_party/angle/angle.isolate', ], } diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index bbb1dd6..ad0297c 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml @@ -10852,6 +10852,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> @@ -10873,7 +10889,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> @@ -46048,6 +46065,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"/> diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index 12a44cc..88b4c36 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn @@ -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", @@ -195,6 +197,8 @@ component("gl") { "gl_wgl_api_implementation.h", ] + deps += [ "//third_party/angle:libGLESv2" ] + libs = [ "dwmapi.lib" ] ldflags = [ "/DELAYLOAD:dwmapi.dll" ] } @@ -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", + ], } diff --git a/ui/gl/angle_platform_impl.cc b/ui/gl/angle_platform_impl.cc new file mode 100644 index 0000000..2ce12b8 --- /dev/null +++ b/ui/gl/angle_platform_impl.cc @@ -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 diff --git a/ui/gl/angle_platform_impl.h b/ui/gl/angle_platform_impl.h new file mode 100644 index 0000000..2d12f60 --- /dev/null +++ b/ui/gl/angle_platform_impl.h @@ -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_ diff --git a/ui/gl/gl.gyp b/ui/gl/gl.gyp index 05381078..d62950a 100644 --- a/ui/gl/gl.gyp +++ b/ui/gl/gl.gyp @@ -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', @@ -197,6 +199,11 @@ 'gl_wgl_api_implementation.cc', 'gl_wgl_api_implementation.h', ], + 'dependencies': [ + # TODO(jmadill): Use ANGLE on other platforms. + '<(angle_path)/src/angle.gyp:libEGL', + '<(angle_path)/src/angle.gyp:libGLESv2', + ], 'msvs_settings': { 'VCLinkerTool': { 'DelayLoadDLLs': [ diff --git a/ui/gl/gl_implementation_win.cc b/ui/gl/gl_implementation_win.cc index 477f5a5..618250d 100644 --- a/ui/gl/gl_implementation_win.cc +++ b/ui/gl/gl_implementation_win.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/files/file_path.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/native_library.h" #include "base/path_service.h" @@ -16,6 +17,8 @@ #include "base/threading/thread_restrictions.h" #include "base/trace_event/trace_event.h" #include "base/win/windows_version.h" +// TODO(jmadill): Apply to all platforms eventually +#include "ui/gl/angle_platform_impl.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context_stub_with_extensions.h" #include "ui/gl/gl_egl_api_implementation.h" @@ -97,6 +100,10 @@ typedef void (__stdcall *SetTraceFunctionPointersFunc)( GetCategoryEnabledFlagFunc get_category_enabled_flag, AddTraceEventFunc add_trace_event_func); +// TODO(jmadill): Apply to all platforms eventually +base::LazyInstance<ANGLEPlatformImpl> g_angle_platform_impl = + LAZY_INSTANCE_INITIALIZER; + } // namespace void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) { @@ -111,6 +118,10 @@ bool InitializeStaticGLBindings(GLImplementation implementation) { // later switch to another GL implementation. DCHECK_EQ(kGLImplementationNone, GetGLImplementation()); + // Init ANGLE platform here, before we call GetPlatformDisplay(). + // TODO(jmadill): Apply to all platforms eventually + angle::Platform::initialize(&g_angle_platform_impl.Get()); + // Allow the main thread or another to initialize these bindings // after instituting restrictions on I/O. Going forward they will // likely be used in the browser process on most platforms. The @@ -348,6 +359,9 @@ void InitializeDebugGLBindings() { } void ClearGLBindings() { + // TODO(jmadill): Apply to all platforms eventually + angle::Platform::shutdown(); + ClearGLBindingsEGL(); ClearGLBindingsGL(); ClearGLBindingsOSMESA(); |