Add ANGLE backend flag to about:flags

The flag is only available on Windows and offers choices to use the
OpenGL, D3D9 or D3D11 backend.

TEST=manual test on Windows
BUG=chromium:693090

Change-Id: Ia9ce5d58a0658af513b070e564014398f35a243e
Reviewed-on: https://chromium-review.googlesource.com/1202203
Commit-Queue: Olli Etuaho <[email protected]>
Reviewed-by: Kenneth Russell <[email protected]>
Cr-Commit-Position: refs/heads/master@{#589480}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 826d068..909a26c 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -361,6 +361,17 @@
     {flag_descriptions::kDefaultTileHeightVenti, switches::kDefaultTileHeight,
      "1024"}};
 
+#if defined(OS_WIN)
+const FeatureEntry::Choice kUseAngleChoices[] = {
+    {flag_descriptions::kUseAngleDefault, "", ""},
+    {flag_descriptions::kUseAngleGL, switches::kUseANGLE,
+     gl::kANGLEImplementationOpenGLName},
+    {flag_descriptions::kUseAngleD3D11, switches::kUseANGLE,
+     gl::kANGLEImplementationD3D11Name},
+    {flag_descriptions::kUseAngleD3D9, switches::kUseANGLE,
+     gl::kANGLEImplementationD3D9Name}};
+#endif
+
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 const FeatureEntry::FeatureParam kAccountConsistencyDice[] = {
     {kAccountConsistencyFeatureMethodParameter,
@@ -4436,6 +4447,12 @@
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
     // AboutFlagsHistogramTest unit test to verify this process).
+
+#if defined(OS_WIN)
+    {"use-angle", flag_descriptions::kUseAngleName,
+     flag_descriptions::kUseAngleDescription, kOsWin,
+     MULTI_VALUE_TYPE(kUseAngleChoices)},
+#endif
 };
 
 class FlagsStateSingleton {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index eb561be8..1ab1763 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2941,6 +2941,19 @@
     "Windows (ETW) and can then be captured by tools such as UIForETW or "
     "Xperf.";
 
+const char kUseAngleName[] = "Choose ANGLE graphics backend";
+const char kUseAngleDescription[] =
+    "Choose the graphics backend for ANGLE. D3D11 is used on most Windows "
+    "computers by default. Using the OpenGL driver as the graphics backend may "
+    "result in higher performance in some graphics-heavy applications, "
+    "particularly on NVIDIA GPUs. It can increase battery and memory usage of "
+    "video playback.";
+
+const char kUseAngleDefault[] = "Default";
+const char kUseAngleGL[] = "OpenGL";
+const char kUseAngleD3D11[] = "D3D11";
+const char kUseAngleD3D9[] = "D3D9";
+
 const char kUseWinrtMidiApiName[] = "Use Windows Runtime MIDI API";
 const char kUseWinrtMidiApiDescription[] =
     "Use Windows Runtime MIDI API for WebMIDI (effective only on Windows 10 or "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index e10c5cef..9b6085f8 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1771,6 +1771,14 @@
 extern const char kTraceExportEventsToEtwName[];
 extern const char kTraceExportEventsToEtwDesription[];
 
+extern const char kUseAngleName[];
+extern const char kUseAngleDescription[];
+
+extern const char kUseAngleDefault[];
+extern const char kUseAngleGL[];
+extern const char kUseAngleD3D11[];
+extern const char kUseAngleD3D9[];
+
 extern const char kUseWinrtMidiApiName[];
 extern const char kUseWinrtMidiApiDescription[];