Add ANGLE renderer switch to Experiments page on Mac

This CL enables Mac users to switch between ANGLE's GL and Metal
backends. It also updates tools/metrics/histograms/enums.xml with
missing enum names.

Bug: chromium:1216126
Change-Id: I68a0357356539139070e4ef76f1740709a4bb0a2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3168329
Reviewed-by: Kenneth Russell <[email protected]>
Commit-Queue: Jonah Ryan-Davis <[email protected]>
Cr-Commit-Position: refs/heads/main@{#923466}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 10612b6..260f3a68 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -349,7 +349,7 @@
      "900"}};
 
 #if defined(OS_WIN)
-const FeatureEntry::Choice kUseAngleChoices[] = {
+const FeatureEntry::Choice kUseAngleChoicesWindows[] = {
     {flag_descriptions::kUseAngleDefault, "", ""},
     {flag_descriptions::kUseAngleGL, switches::kUseANGLE,
      gl::kANGLEImplementationOpenGLName},
@@ -359,6 +359,13 @@
      gl::kANGLEImplementationD3D9Name},
     {flag_descriptions::kUseAngleD3D11on12, switches::kUseANGLE,
      gl::kANGLEImplementationD3D11on12Name}};
+#elif defined(OS_MAC)
+const FeatureEntry::Choice kUseAngleChoicesMac[] = {
+    {flag_descriptions::kUseAngleDefault, "", ""},
+    {flag_descriptions::kUseAngleGL, switches::kUseANGLE,
+     gl::kANGLEImplementationOpenGLName},
+    {flag_descriptions::kUseAngleMetal, switches::kUseANGLE,
+     gl::kANGLEImplementationMetalName}};
 #endif
 
 #if BUILDFLAG(ENABLE_VR)
@@ -5423,8 +5430,12 @@
 
 #if defined(OS_WIN)
     {"use-angle", flag_descriptions::kUseAngleName,
-     flag_descriptions::kUseAngleDescription, kOsWin,
-     MULTI_VALUE_TYPE(kUseAngleChoices)},
+     flag_descriptions::kUseAngleDescriptionWindows, kOsWin,
+     MULTI_VALUE_TYPE(kUseAngleChoicesWindows)},
+#elif defined(OS_MAC)
+    {"use-angle", flag_descriptions::kUseAngleName,
+     flag_descriptions::kUseAngleDescriptionMac, kOsMac,
+     MULTI_VALUE_TYPE(kUseAngleChoicesMac)},
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index c0450ea9..8f04b83 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3877,16 +3877,13 @@
 const char kRunVideoCaptureServiceInBrowserProcessDescription[] =
     "Run the video capture service in the browser process.";
 
-const char kUseAngleName[] = "Choose ANGLE graphics backend";
-const char kUseAngleDescription[] =
+const char kUseAngleDescriptionWindows[] =
     "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 kUseAngleD3D11on12[] = "D3D11on12";
@@ -3964,8 +3961,27 @@
 const char kScreenTimeDescription[] =
     "Integrate with the macOS Screen Time system.";
 
+const char kUseAngleDescriptionMac[] =
+    "Choose the graphics backend for ANGLE. The OpenGL backend is soon to be "
+    "deprecated on Mac, and may contain driver bugs that are not planned to be "
+    "fixed. The Metal backend is still experimental, and may contain bugs that "
+    "are still being worked on. The Metal backend should be more performant, "
+    "but may still be behind the OpenGL backend until fully released.";
+
+const char kUseAngleMetal[] = "Metal";
+
 #endif
 
+// Windows and Mac -------------------------------------------------------------
+
+#if defined(OS_WIN) || defined(OS_MAC)
+
+const char kUseAngleName[] = "Choose ANGLE graphics backend";
+const char kUseAngleDefault[] = "Default";
+const char kUseAngleGL[] = "OpenGL";
+
+#endif  // defined(OS_WIN) || defined(OS_MAC)
+
 // Chrome OS -------------------------------------------------------------------
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index eee8fa2e..b715752 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2206,11 +2206,8 @@
 extern const char kRunVideoCaptureServiceInBrowserProcessName[];
 extern const char kRunVideoCaptureServiceInBrowserProcessDescription[];
 
-extern const char kUseAngleName[];
-extern const char kUseAngleDescription[];
+extern const char kUseAngleDescriptionWindows[];
 
-extern const char kUseAngleDefault[];
-extern const char kUseAngleGL[];
 extern const char kUseAngleD3D11[];
 extern const char kUseAngleD3D9[];
 extern const char kUseAngleD3D11on12[];
@@ -2264,8 +2261,22 @@
 extern const char kScreenTimeName[];
 extern const char kScreenTimeDescription[];
 
+extern const char kUseAngleDescriptionMac[];
+extern const char kUseAngleMetal[];
+
 #endif  // defined(OS_MAC)
 
+// Windows and Mac ------------------------------------------------------------
+
+#if defined(OS_WIN) || defined(OS_MAC)
+
+extern const char kUseAngleName[];
+
+extern const char kUseAngleDefault[];
+extern const char kUseAngleGL[];
+
+#endif  // defined(OS_WIN) || defined(OS_MAC)
+
 // Chrome OS ------------------------------------------------------------------
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)