Trace Tests: Load trace list from JSON file.

Instead of using the auto-generated enum for the trace list, load
directly from restricted_traces.json. This will lead to more CLs
that entirely remove the auto-generated code from the trace tests.

Bug: angleproject:5133
Change-Id: I6515624a2145319d097b43085741cf9c48f1792e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3140217
Reviewed-by: Tim Van Patten <timvp@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/scripts/code_generation_hashes/restricted_traces.json b/scripts/code_generation_hashes/restricted_traces.json
index d077cb7..65e5823 100644
--- a/scripts/code_generation_hashes/restricted_traces.json
+++ b/scripts/code_generation_hashes/restricted_traces.json
@@ -2,13 +2,13 @@
   "src/tests/restricted_traces/.gitignore":
     "111524060c1eb48a1969a91f8ae13e59",
   "src/tests/restricted_traces/gen_restricted_traces.py":
-    "f59f4c6c0891917ae0db0b95b3d67a52",
+    "7af1825f7a46ece5f93947c2b16a7839",
   "src/tests/restricted_traces/restricted_traces.json":
     "b7d9e3fe8e34d206a147d6be3a60a688",
   "src/tests/restricted_traces/restricted_traces_autogen.cpp":
-    "756ac60386e3ce26bb15f71ffec4a954",
+    "8d6a8004aaf1aa00cb8b525940dd6f7d",
   "src/tests/restricted_traces/restricted_traces_autogen.gni":
     "3016d2852c61cbb5dbf876b787cabe10",
   "src/tests/restricted_traces/restricted_traces_autogen.h":
-    "c6e084559bb22c362e307dba25264a4c"
+    "4da2eb50842afbb7c1023b395f4bfb8e"
 }
\ No newline at end of file
diff --git a/src/tests/perf_tests/TracePerfTest.cpp b/src/tests/perf_tests/TracePerfTest.cpp
index 23f29f8..734bbcc 100644
--- a/src/tests/perf_tests/TracePerfTest.cpp
+++ b/src/tests/perf_tests/TracePerfTest.cpp
@@ -9,6 +9,7 @@
 
 #include <gtest/gtest.h>
 #include "common/PackedEnums.h"
+#include "common/string_utils.h"
 #include "common/system_utils.h"
 #include "tests/perf_tests/ANGLEPerfTest.h"
 #include "tests/perf_tests/ANGLEPerfTestArgs.h"
@@ -20,7 +21,11 @@
 
 #include "restricted_traces/restricted_traces_autogen.h"
 
+#include <rapidjson/document.h>
+#include <rapidjson/istreamwrapper.h>
+
 #include <cassert>
+#include <fstream>
 #include <functional>
 #include <sstream>
 
@@ -42,6 +47,8 @@
 
 namespace
 {
+constexpr size_t kMaxPath = 1024;
+
 struct TracePerfParams final : public RenderTestParams
 {
     // Common default options
@@ -54,11 +61,11 @@
     std::string story() const override
     {
         std::stringstream strstr;
-        strstr << RenderTestParams::story() << "_" << GetTraceInfo(testID).name;
+        strstr << RenderTestParams::story() << "_" << traceInfo.name;
         return strstr.str();
     }
 
-    RestrictedTraceID testID;
+    TraceInfo traceInfo;
 };
 
 std::ostream &operator<<(std::ostream &os, const TracePerfParams &params)
@@ -108,15 +115,25 @@
 
     double getHostTimeFromGLTime(GLint64 glTime);
 
+    uint32_t frameCount() const
+    {
+        const TraceInfo &traceInfo = mParams.traceInfo;
+        return traceInfo.endFrame - traceInfo.startFrame + 1;
+    }
+
     int getStepAlignment() const override
     {
         // Align step counts to the number of frames in a trace.
-        const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
-        return static_cast<int>(traceInfo.endFrame - traceInfo.startFrame + 1);
+        return static_cast<int>(frameCount());
     }
 
     void TestBody() override { run(); }
 
+    bool traceNameIs(const char *name) const
+    {
+        return strncmp(name, mParams.traceInfo.name, kTraceInfoMaxNameLen) == 0;
+    }
+
   private:
     struct QueryInfo
     {
@@ -631,37 +648,36 @@
     gCurrentTracePerfTest->validateSerializedState(serializedState, fileName, line);
 }
 
+constexpr char kTraceTestFolder[] = "src/tests/restricted_traces";
+
+bool FindTraceTestDataPath(const char *traceName, char *testDataDirOut, size_t maxDataDirLen)
+{
+    char relativeTestDataDir[kMaxPath] = {};
+    snprintf(relativeTestDataDir, kMaxPath, "%s%s", kTraceTestFolder, traceName);
+    return angle::FindTestDataPath(relativeTestDataDir, testDataDirOut, maxDataDirLen);
+}
+
+bool FindRootTraceTestDataPath(char *testDataDirOut, size_t maxDataDirLen)
+{
+    return angle::FindTestDataPath(kTraceTestFolder, testDataDirOut, maxDataDirLen);
+}
+
 TracePerfTest::TracePerfTest(const TracePerfParams &params)
     : ANGLERenderTest("TracePerf", params, "ms"), mParams(params), mStartFrame(0), mEndFrame(0)
 {
     // TODO: http://anglebug.com/4533 This fails after the upgrade to the 26.20.100.7870 driver.
-    if (IsWindows() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-        mParams.testID == RestrictedTraceID::manhattan_10)
+    if (IsWindows() && IsIntel() && mParams.isVulkan() && traceNameIs("manhattan_10"))
     {
         mSkipTest = true;
     }
 
     // TODO: http://anglebug.com/4731 Fails on older Intel drivers. Passes in newer.
-    if (IsWindows() && IsIntel() && mParams.driver != GLESDriverType::AngleEGL &&
-        mParams.testID == RestrictedTraceID::angry_birds_2_1500)
+    if (IsWindows() && IsIntel() && !mParams.isANGLE() && traceNameIs("angry_birds_2_1500"))
     {
         mSkipTest = true;
     }
 
-    if (mParams.surfaceType != SurfaceType::Window && !gEnableAllTraceTests)
-    {
-        printf("Test skipped. Use --enable-all-trace-tests to run.\n");
-        mSkipTest = true;
-    }
-
-    if (mParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE &&
-        !gEnableAllTraceTests)
-    {
-        printf("Test skipped. Use --enable-all-trace-tests to run.\n");
-        mSkipTest = true;
-    }
-
-    if (mParams.testID == RestrictedTraceID::cod_mobile)
+    if (traceNameIs("cod_mobile"))
     {
         // TODO: http://anglebug.com/4967 Vulkan: GL_EXT_color_buffer_float not supported on Pixel 2
         // The COD:Mobile trace uses a framebuffer attachment with:
@@ -675,62 +691,62 @@
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::brawl_stars)
+    if (traceNameIs("brawl_stars"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
     }
 
-    if (mParams.testID == RestrictedTraceID::free_fire)
+    if (traceNameIs("free_fire"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::marvel_contest_of_champions)
+    if (traceNameIs("marvel_contest_of_champions"))
     {
         addExtensionPrerequisite("GL_EXT_color_buffer_half_float");
     }
 
-    if (mParams.testID == RestrictedTraceID::world_of_tanks_blitz)
+    if (traceNameIs("world_of_tanks_blitz"))
     {
         addExtensionPrerequisite("GL_EXT_disjoint_timer_query");
     }
 
-    if (mParams.testID == RestrictedTraceID::dragon_ball_legends)
+    if (traceNameIs("dragon_ball_legends"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::lego_legacy)
+    if (traceNameIs("lego_legacy"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
     }
 
-    if (mParams.testID == RestrictedTraceID::world_war_doh)
+    if (traceNameIs("world_war_doh"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::saint_seiya_awakening)
+    if (traceNameIs("saint_seiya_awakening"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
 
         // TODO(https://anglebug.com/5517) Linux+Intel generates "Framebuffer is incomplete" errors.
-        if (IsLinux() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::magic_tiles_3)
+    if (traceNameIs("magic_tiles_3"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::real_gangster_crime)
+    if (traceNameIs("real_gangster_crime"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // Intel doesn't support external images.
@@ -743,37 +759,36 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::asphalt_8)
+    if (traceNameIs("asphalt_8"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::hearthstone)
+    if (traceNameIs("hearthstone"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::efootball_pes_2021)
+    if (traceNameIs("efootball_pes_2021"))
     {
         // TODO(https://anglebug.com/5517) Linux+Intel and Pixel 2 generate "Framebuffer is
         // incomplete" errors with the Vulkan backend.
-        if (mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            ((IsLinux() && IsIntel()) || IsPixel2()))
+        if (mParams.isVulkan() && ((IsLinux() && IsIntel()) || IsPixel2()))
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::manhattan_31)
+    if (traceNameIs("manhattan_31"))
     {
         // TODO: http://anglebug.com/5591 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::idle_heroes)
+    if (traceNameIs("idle_heroes"))
     {
         // TODO: http://anglebug.com/5591 Trace crashes on Pixel 2
         if (IsPixel2())
@@ -782,118 +797,113 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::shadow_fight_2)
+    if (traceNameIs("shadow_fight_2"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::rise_of_kingdoms)
+    if (traceNameIs("rise_of_kingdoms"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::happy_color)
+    if (traceNameIs("happy_color"))
     {
-        if (IsWindows() && IsAMD() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsAMD() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::bus_simulator_indonesia)
+    if (traceNameIs("bus_simulator_indonesia"))
     {
         // TODO(https://anglebug.com/5629) Linux+(Intel|AMD) native GLES generates
         // GL_INVALID_OPERATION
-        if (IsLinux() && (IsIntel() || IsAMD()) &&
-            mParams.getRenderer() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && (IsIntel() || IsAMD()) && !mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::messenger_lite)
+    if (traceNameIs("messenger_lite"))
     {
-        // TODO: https://anglebug.com/5663 Incorrect pixels on Nvidia Windows for first frame
-        if (IsWindows() && IsNVIDIA() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            mParams.getDeviceType() != EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE)
+        // TODO: https://anglebug.com/5663 Incorrect pixels on NVIDIA Windows for first frame
+        if (IsWindows() && IsNVIDIA() && mParams.isVulkan() && !mParams.isSwiftshader())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::among_us)
+    if (traceNameIs("among_us"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::car_parking_multiplayer)
+    if (traceNameIs("car_parking_multiplayer"))
     {
-        // TODO: https://anglebug.com/5613 Nvidia native driver spews undefined behavior warnings
-        if (IsNVIDIA() && mParams.getRenderer() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        // TODO: https://anglebug.com/5613 NVIDIA native driver spews undefined behavior warnings
+        if (IsNVIDIA() && !mParams.isVulkan())
         {
             mSkipTest = true;
         }
         // TODO: https://anglebug.com/5724 Device lost on Win Intel
-        if (IsWindows() && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::fifa_mobile)
+    if (traceNameIs("fifa_mobile"))
     {
         // TODO: http://anglebug.com/5875 Intel Windows Vulkan flakily renders entirely black
-        if (IsWindows() && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::rope_hero_vice_town)
+    if (traceNameIs("rope_hero_vice_town"))
     {
         // TODO: http://anglebug.com/5716 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::extreme_car_driving_simulator)
+    if (traceNameIs("extreme_car_driving_simulator"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::plants_vs_zombies_2)
+    if (traceNameIs("plants_vs_zombies_2"))
     {
         // TODO: http://crbug.com/1187752 Corrupted image
-        if (IsWindows() && IsAMD() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsAMD() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::junes_journey)
+    if (traceNameIs("junes_journey"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::ragnarok_m_eternal_love)
+    if (traceNameIs("ragnarok_m_eternal_love"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5772 Pixel 2 errors with "Framebuffer is incomplete" on Vulkan
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::real_cricket_20)
+    if (traceNameIs("real_cricket_20"))
     {
         // TODO: http://anglebug.com/5777 ARM doesn't have enough VS storage blocks
         if (IsAndroid() && IsARM())
@@ -902,44 +912,43 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::league_of_legends_wild_rift)
+    if (traceNameIs("league_of_legends_wild_rift"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5815 Trace is crashing on Intel Linux
-        if (IsLinux() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::aztec_ruins)
+    if (traceNameIs("aztec_ruins"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5553 Pixel 2 errors with "Framebuffer is incomplete" on Vulkan
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::dragon_raja)
+    if (traceNameIs("dragon_raja"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
 
         // TODO: http://anglebug.com/5807 Intel Linux and Pixel 2 error with "Framebuffer is
         // incomplete" on Vulkan
-        if (((IsLinux() && IsIntel()) || IsPixel2()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (((IsLinux() && IsIntel()) || IsPixel2()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
     // Adreno gives a driver error with empty/small draw calls. http://anglebug.com/5823
-    if (mParams.testID == RestrictedTraceID::hill_climb_racing)
+    if (traceNameIs("hill_climb_racing"))
     {
         if (IsAndroid() && (IsPixel2() || IsPixel4()) &&
             mParams.driver == GLESDriverType::SystemEGL)
@@ -948,51 +957,47 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::avakin_life)
+    if (traceNameIs("avakin_life"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::professional_baseball_spirits)
+    if (traceNameIs("professional_baseball_spirits"))
     {
         // TODO(https://anglebug.com/5827) Linux+Mesa/RADV Vulkan generates
         // GL_INVALID_FRAMEBUFFER_OPERATION.
         // Mesa versions below 20.3.5 produce the same issue on Linux+Mesa/Intel Vulkan
-        if (IsLinux() && (IsAMD() || IsIntel()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            mParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE)
+        if (IsLinux() && (IsAMD() || IsIntel()) && mParams.isVulkan() && !mParams.isSwiftshader())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::call_break_offline_card_game)
+    if (traceNameIs("call_break_offline_card_game"))
     {
         // TODO: http://anglebug.com/5837 Intel Linux Vulkan errors with "Framebuffer is incomplete"
-        if ((IsLinux() && IsIntel()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if ((IsLinux() && IsIntel()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::slingshot_test1 ||
-        mParams.testID == RestrictedTraceID::slingshot_test2)
+    if (traceNameIs("slingshot_test1") || traceNameIs("slingshot_test2"))
     {
         // TODO: http://anglebug.com/5877 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::ludo_king)
+    if (traceNameIs("ludo_king"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
     // TODO: http://anglebug.com/5943 GL_INVALID_ENUM on Windows/Intel.
-    if (mParams.testID == RestrictedTraceID::summoners_war)
+    if (traceNameIs("summoners_war"))
     {
         if (IsWindows() && IsIntel() && mParams.driver != GLESDriverType::AngleEGL)
         {
@@ -1000,21 +1005,20 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::pokemon_go)
+    if (traceNameIs("pokemon_go"))
     {
         addExtensionPrerequisite("GL_EXT_texture_cube_map_array");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5989 Intel Linux crashing on teardown
         // TODO: http://anglebug.com/5994 Intel Windows timing out periodically
-        if ((IsLinux() || IsWindows()) && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if ((IsLinux() || IsWindows()) && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::cookie_run_kingdom)
+    if (traceNameIs("cookie_run_kingdom"))
     {
         addExtensionPrerequisite("GL_EXT_texture_cube_map_array");
         addExtensionPrerequisite("GL_OES_EGL_image_external");
@@ -1026,32 +1030,30 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::genshin_impact)
+    if (traceNameIs("genshin_impact"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/6023 Crashes on Pixel 2 in vulkan driver
         // TODO: http://anglebug.com/6029 Crashes on Linux Intel Vulkan
-        if (((IsLinux() && IsIntel()) || IsPixel2()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (((IsLinux() && IsIntel()) || IsPixel2()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::pubg_mobile_skydive ||
-        mParams.testID == RestrictedTraceID::pubg_mobile_battle_royale)
+    if (traceNameIs("pubg_mobile_skydive") || traceNameIs("pubg_mobile_battle_royale"))
     {
         addExtensionPrerequisite("GL_EXT_texture_buffer");
 
-        // TODO: http://anglebug.com/6240 Internal errors on Windows using Intel or Nvida
+        // TODO: http://anglebug.com/6240 Internal errors on Windows using Intel or NVIDIA
         if (IsWindows() && (IsIntel() || IsNVIDIA()) && mParams.driver == GLESDriverType::SystemWGL)
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::sakura_school_simulator)
+    if (traceNameIs("sakura_school_simulator"))
     {
         // Flaky on Intel. http://anglebug.com/6294
         if (IsWindows() && IsIntel())
@@ -1060,16 +1062,20 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::scrabble_go)
+    if (traceNameIs("scrabble_go"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::world_of_kings)
+    if (traceNameIs("world_of_kings"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
+    ASSERT(mParams.surfaceType == SurfaceType::Window || gEnableAllTraceTests);
+    ASSERT(mParams.eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE ||
+           gEnableAllTraceTests);
+
     // We already swap in TracePerfTest::drawBenchmark, no need to swap again in the harness.
     disableTestHarnessSwap();
 
@@ -1077,14 +1083,13 @@
 
     if (gTraceTestValidation)
     {
-        const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
-        mStepsToRun                = (traceInfo.endFrame - traceInfo.startFrame + 1);
+        mStepsToRun = frameCount();
     }
 }
 
 void TracePerfTest::initializeBenchmark()
 {
-    const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
+    const TraceInfo &traceInfo = mParams.traceInfo;
 
     mStartingDirectory = angle::GetCWD().value();
 
@@ -1116,11 +1121,8 @@
 
     mTraceLibrary->setValidateSerializedStateCallback(ValidateSerializedState);
 
-    std::string relativeTestDataDir = std::string("src/tests/restricted_traces/") + traceInfo.name;
-
-    constexpr size_t kMaxDataDirLen = 1000;
-    char testDataDir[kMaxDataDirLen];
-    if (!angle::FindTestDataPath(relativeTestDataDir.c_str(), testDataDir, kMaxDataDirLen))
+    char testDataDir[kMaxPath] = {};
+    if (!FindTraceTestDataPath(traceInfo.name, testDataDir, kMaxPath))
     {
         ERR() << "Could not find test data folder.";
         mSkipTest = true;
@@ -1584,8 +1586,7 @@
 
     printf("Serialization mismatch!\n");
 
-    constexpr size_t kMaxPath = 1024;
-    char aFilePath[kMaxPath]  = {};
+    char aFilePath[kMaxPath] = {};
     if (CreateTemporaryFile(aFilePath, kMaxPath))
     {
         printf("Saving \"expected\" capture serialization to \"%s\".\n", aFilePath);
@@ -1773,8 +1774,7 @@
     std::vector<uint8_t> pixelData(pixelCount * 4);
 
     // Only unbind the framebuffer on context versions where it's available.
-    const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
-    if (traceInfo.contextClientMajorVersion > 1)
+    if (mParams.traceInfo.contextClientMajorVersion > 1)
     {
         glBindFramebuffer(GL_FRAMEBUFFER, 0);
     }
@@ -1805,12 +1805,12 @@
     }
 }
 
-TracePerfParams CombineTestID(const TracePerfParams &in, RestrictedTraceID id)
+TracePerfParams CombineTestID(const TracePerfParams &in, const std::string &traceName)
 {
-    const TraceInfo &traceInfo = GetTraceInfo(id);
+    const TraceInfo &traceInfo = GetTraceInfo(traceName.c_str());
 
     TracePerfParams out = in;
-    out.testID          = id;
+    out.traceInfo       = traceInfo;
     out.majorVersion    = traceInfo.contextClientMajorVersion;
     out.minorVersion    = traceInfo.contextClientMinorVersion;
     out.windowWidth     = traceInfo.drawSurfaceWidth;
@@ -1844,6 +1844,72 @@
 
 void RegisterTraceTests()
 {
+    // To load the trace data path correctly we set the CWD to the executable dir.
+    std::string previousCWD;
+    if (!IsAndroid())
+    {
+        previousCWD        = angle::GetCWD().value();
+        std::string exeDir = angle::GetExecutableDirectory();
+        angle::SetCWD(exeDir.c_str());
+    }
+
+    char rootTracePath[kMaxPath] = {};
+    if (!FindRootTraceTestDataPath(rootTracePath, kMaxPath))
+    {
+        ERR() << "Unable to find trace folder.";
+        return;
+    }
+
+    // Open JSON file.
+    rapidjson::Document doc;
+    {
+        std::stringstream traceJsonStream;
+        traceJsonStream << rootTracePath << angle::GetPathSeparator() << "restricted_traces.json";
+        std::string traceJsonPath = traceJsonStream.str();
+
+        std::ifstream ifs(traceJsonPath);
+        if (!ifs.is_open())
+        {
+            ERR() << "Unable to open trace JSON file: " << traceJsonPath;
+            return;
+        }
+
+        rapidjson::IStreamWrapper inWrapper(ifs);
+
+        doc.ParseStream(inWrapper);
+
+        if (doc.HasParseError())
+        {
+            ERR() << "Parse error reading JSON stream from " << traceJsonPath;
+            return;
+        }
+    }
+
+    if (!doc.IsObject() || !doc.HasMember("traces") || !doc["traces"].IsArray())
+    {
+        ERR() << "Trace JSON document not formed properly.";
+        return;
+    }
+
+    // Read trace json into a list of trace names.
+    std::vector<std::string> traces;
+
+    rapidjson::Document::Array traceArray = doc["traces"].GetArray();
+    for (rapidjson::SizeType arrayIndex = 0; arrayIndex < traceArray.Size(); ++arrayIndex)
+    {
+        const rapidjson::Document::ValueType &arrayElement = traceArray[arrayIndex];
+
+        if (!arrayElement.IsString())
+        {
+            ERR() << "Trace JSON document not formed properly.";
+            return;
+        }
+
+        std::vector<std::string> traceAndVersion;
+        angle::SplitStringAlongWhitespace(arrayElement.GetString(), &traceAndVersion);
+        traces.push_back(traceAndVersion[0]);
+    }
+
     std::vector<SurfaceType> surfaceTypes = {SurfaceType::Window};
     if (gEnableAllTraceTests)
     {
@@ -1861,7 +1927,7 @@
         renderers.push_back(VulkanSwiftShader<P>);
     }
 
-    PV testsWithID = CombineWithValues({P()}, AllEnums<RestrictedTraceID>(), CombineTestID);
+    PV testsWithID          = CombineWithValues({P()}, traces, CombineTestID);
     PV testsWithSurfaceType = CombineWithValues(testsWithID, surfaceTypes, CombineWithSurfaceType);
     PV testsWithRenderer    = CombineWithFuncs(testsWithSurfaceType, renderers);
     PV filteredTests        = FilterTestParams(testsWithRenderer);
@@ -1887,4 +1953,9 @@
         testing::RegisterTest("TracePerfTest", testName.c_str(), nullptr, paramName.c_str(),
                               __FILE__, __LINE__, factory);
     }
+
+    if (!previousCWD.empty())
+    {
+        angle::SetCWD(previousCWD.c_str());
+    }
 }
diff --git a/src/tests/restricted_traces/BUILD.gn b/src/tests/restricted_traces/BUILD.gn
index 9a7a800..26f86a2 100644
--- a/src/tests/restricted_traces/BUILD.gn
+++ b/src/tests/restricted_traces/BUILD.gn
@@ -59,6 +59,8 @@
     "restricted_traces_export.h",
   ]
 
+  data = [ "restricted_traces.json" ]
+
   data_deps = _traces
   defines = [ "ANGLE_TRACE_IMPLEMENTATION" ]
 
diff --git a/src/tests/restricted_traces/gen_restricted_traces.py b/src/tests/restricted_traces/gen_restricted_traces.py
index ccec9ed..a4296b5 100755
--- a/src/tests/restricted_traces/gen_restricted_traces.py
+++ b/src/tests/restricted_traces/gen_restricted_traces.py
@@ -60,11 +60,6 @@
 
 namespace angle
 {{
-enum class RestrictedTraceID
-{{
-{trace_ids}, InvalidEnum, EnumCount = InvalidEnum
-}};
-
 static constexpr size_t kTraceInfoMaxNameLen = 32;
 
 static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3;
@@ -83,7 +78,7 @@
     char name[kTraceInfoMaxNameLen];
 }};
 
-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(RestrictedTraceID traceID);
+ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName);
 }}  // namespace angle
 
 #endif  // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
@@ -110,14 +105,29 @@
 {{
 namespace
 {{
-constexpr angle::PackedEnumMap<RestrictedTraceID, TraceInfo> kTraceInfos = {{
+constexpr size_t kNumTraces = {num_traces};
+struct TracePair
+{{
+    const char name[kTraceInfoMaxNameLen];
+    TraceInfo info;
+}};
+constexpr TracePair kTraceInfos[kNumTraces] = {{
 {trace_infos}
 }};
 }}
 
-const TraceInfo &GetTraceInfo(RestrictedTraceID traceID)
+const TraceInfo &GetTraceInfo(const char *traceName)
 {{
-    return kTraceInfos[traceID];
+    // Could be improved using std::lower_bound.
+    for (const TracePair &tracePair : kTraceInfos)
+    {{
+        if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0)
+        {{
+            return tracePair.info;
+        }}
+    }}
+    UNREACHABLE();
+    return kTraceInfos[0].info;
 }}
 }}  // namespace angle
 """
@@ -202,25 +212,25 @@
     info = []
     if contains_context_version(trace):
         info += [
-            f"{trace}::kReplayContextClientMajorVersion",
-            f"{trace}::kReplayContextClientMinorVersion"
+            f'{trace}::kReplayContextClientMajorVersion',
+            f'{trace}::kReplayContextClientMinorVersion'
         ]
     else:
         info += [
-            "kDefaultReplayContextClientMajorVersion", "kDefaultReplayContextClientMinorVersion"
+            'kDefaultReplayContextClientMajorVersion', 'kDefaultReplayContextClientMinorVersion'
         ]
 
     info += [
-        f"{trace}::kReplayFrameStart", f"{trace}::kReplayFrameEnd",
-        f"{trace}::kReplayDrawSurfaceWidth", f"{trace}::kReplayDrawSurfaceHeight"
+        f'{trace}::kReplayFrameStart', f'{trace}::kReplayFrameEnd',
+        f'{trace}::kReplayDrawSurfaceWidth', f'{trace}::kReplayDrawSurfaceHeight'
     ]
 
     if contains_colorspace(trace):
-        info += [f"{trace}::kReplayDrawSurfaceColorSpace"]
+        info += [f'{trace}::kReplayDrawSurfaceColorSpace']
     else:
-        info += ["kDefaultReplayDrawSurfaceColorSpace"]
+        info += ['kDefaultReplayDrawSurfaceColorSpace']
 
-    info += [f"\"{trace}\""]
+    info += [f'"{trace}"']
 
     return ", ".join(info)
 
@@ -240,16 +250,16 @@
             while file[start - 1].isdigit():
                 start -= 1
             context = file[start:end]
-            assert context.isnumeric(), "Failed to find trace context number"
+            assert context.isnumeric(), 'Failed to find trace context number'
             return context
 
 
 def get_header_name(trace):
-    return "%s/%s_capture_context%s.h" % (trace, trace, get_context(trace))
+    return '%s/%s_capture_context%s.h' % (trace, trace, get_context(trace))
 
 
 def get_source_name(trace):
-    return "%s/%s_capture_context%s.cpp" % (trace, trace, get_context(trace))
+    return '%s/%s_capture_context%s.cpp' % (trace, trace, get_context(trace))
 
 
 def gen_header(header_file, format_args):
@@ -346,23 +356,21 @@
         return 0
 
     format_args = {
-        "script_name": os.path.basename(__file__),
-        "data_source_name": json_file,
+        'script_name': os.path.basename(__file__),
+        'data_source_name': json_file,
     }
 
     if not gen_gni(traces, gni_file, format_args):
         print('.gni file generation failed.')
         return 1
 
-    includes = ["#include \"%s\"" % get_header_name(trace) for trace in traces]
-    trace_infos = [
-        "{RestrictedTraceID::%s, {%s}}" % (trace, get_trace_info(trace)) for trace in traces
-    ]
+    includes = ['#include "%s"' % get_header_name(trace) for trace in traces]
+    trace_infos = ['{"%s", {%s}}' % (trace, get_trace_info(trace)) for trace in traces]
 
-    format_args["filename"] = "restricted_traces_autogen"
-    format_args["trace_ids"] = ",\n".join(traces)
-    format_args["trace_includes"] = "\n".join(includes)
-    format_args["trace_infos"] = ",\n".join(trace_infos)
+    format_args['filename'] = 'restricted_traces_autogen'
+    format_args['num_traces'] = len(trace_infos)
+    format_args['trace_includes'] = '\n'.join(includes)
+    format_args['trace_infos'] = ',\n'.join(trace_infos)
     if not gen_header(header_file, format_args):
         print('.h file generation failed.')
         return 1
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.cpp b/src/tests/restricted_traces/restricted_traces_autogen.cpp
index 5ece274..8ffaf3c 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.cpp
+++ b/src/tests/restricted_traces/restricted_traces_autogen.cpp
@@ -119,73 +119,79 @@
 {
 namespace
 {
-constexpr angle::PackedEnumMap<RestrictedTraceID, TraceInfo> kTraceInfos = {
-    {RestrictedTraceID::aliexpress,
+constexpr size_t kNumTraces = 102;
+struct TracePair
+{
+    const char name[kTraceInfoMaxNameLen];
+    TraceInfo info;
+};
+constexpr TracePair kTraceInfos[kNumTraces] = {
+    {"aliexpress",
      {aliexpress::kReplayContextClientMajorVersion, aliexpress::kReplayContextClientMinorVersion,
       aliexpress::kReplayFrameStart, aliexpress::kReplayFrameEnd,
       aliexpress::kReplayDrawSurfaceWidth, aliexpress::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "aliexpress"}},
-    {RestrictedTraceID::among_us,
+    {"among_us",
      {among_us::kReplayContextClientMajorVersion, among_us::kReplayContextClientMinorVersion,
       among_us::kReplayFrameStart, among_us::kReplayFrameEnd, among_us::kReplayDrawSurfaceWidth,
       among_us::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "among_us"}},
-    {RestrictedTraceID::angry_birds_2_1500,
+    {"angry_birds_2_1500",
      {angry_birds_2_1500::kReplayContextClientMajorVersion,
       angry_birds_2_1500::kReplayContextClientMinorVersion, angry_birds_2_1500::kReplayFrameStart,
       angry_birds_2_1500::kReplayFrameEnd, angry_birds_2_1500::kReplayDrawSurfaceWidth,
       angry_birds_2_1500::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "angry_birds_2_1500"}},
-    {RestrictedTraceID::arena_of_valor,
+    {"arena_of_valor",
      {arena_of_valor::kReplayContextClientMajorVersion,
       arena_of_valor::kReplayContextClientMinorVersion, arena_of_valor::kReplayFrameStart,
       arena_of_valor::kReplayFrameEnd, arena_of_valor::kReplayDrawSurfaceWidth,
       arena_of_valor::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "arena_of_valor"}},
-    {RestrictedTraceID::asphalt_8,
+    {"asphalt_8",
      {asphalt_8::kReplayContextClientMajorVersion, asphalt_8::kReplayContextClientMinorVersion,
       asphalt_8::kReplayFrameStart, asphalt_8::kReplayFrameEnd, asphalt_8::kReplayDrawSurfaceWidth,
       asphalt_8::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "asphalt_8"}},
-    {RestrictedTraceID::avakin_life,
+    {"avakin_life",
      {avakin_life::kReplayContextClientMajorVersion, avakin_life::kReplayContextClientMinorVersion,
       avakin_life::kReplayFrameStart, avakin_life::kReplayFrameEnd,
       avakin_life::kReplayDrawSurfaceWidth, avakin_life::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "avakin_life"}},
-    {RestrictedTraceID::aztec_ruins,
+    {"aztec_ruins",
      {aztec_ruins::kReplayContextClientMajorVersion, aztec_ruins::kReplayContextClientMinorVersion,
       aztec_ruins::kReplayFrameStart, aztec_ruins::kReplayFrameEnd,
       aztec_ruins::kReplayDrawSurfaceWidth, aztec_ruins::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "aztec_ruins"}},
-    {RestrictedTraceID::beach_buggy_racing,
+    {"beach_buggy_racing",
      {beach_buggy_racing::kReplayContextClientMajorVersion,
       beach_buggy_racing::kReplayContextClientMinorVersion, beach_buggy_racing::kReplayFrameStart,
       beach_buggy_racing::kReplayFrameEnd, beach_buggy_racing::kReplayDrawSurfaceWidth,
       beach_buggy_racing::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "beach_buggy_racing"}},
-    {RestrictedTraceID::brawl_stars,
+    {"brawl_stars",
      {brawl_stars::kReplayContextClientMajorVersion, brawl_stars::kReplayContextClientMinorVersion,
       brawl_stars::kReplayFrameStart, brawl_stars::kReplayFrameEnd,
       brawl_stars::kReplayDrawSurfaceWidth, brawl_stars::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "brawl_stars"}},
-    {RestrictedTraceID::bricks_breaker_quest,
+    {"bricks_breaker_quest",
      {bricks_breaker_quest::kReplayContextClientMajorVersion,
       bricks_breaker_quest::kReplayContextClientMinorVersion,
       bricks_breaker_quest::kReplayFrameStart, bricks_breaker_quest::kReplayFrameEnd,
       bricks_breaker_quest::kReplayDrawSurfaceWidth, bricks_breaker_quest::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "bricks_breaker_quest"}},
-    {RestrictedTraceID::bubble_shooter,
+    {"bubble_shooter",
      {bubble_shooter::kReplayContextClientMajorVersion,
       bubble_shooter::kReplayContextClientMinorVersion, bubble_shooter::kReplayFrameStart,
       bubble_shooter::kReplayFrameEnd, bubble_shooter::kReplayDrawSurfaceWidth,
       bubble_shooter::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "bubble_shooter"}},
-    {RestrictedTraceID::bus_simulator_indonesia,
+    {"bus_simulator_indonesia",
      {bus_simulator_indonesia::kReplayContextClientMajorVersion,
       bus_simulator_indonesia::kReplayContextClientMinorVersion,
       bus_simulator_indonesia::kReplayFrameStart, bus_simulator_indonesia::kReplayFrameEnd,
       bus_simulator_indonesia::kReplayDrawSurfaceWidth,
       bus_simulator_indonesia::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "bus_simulator_indonesia"}},
-    {RestrictedTraceID::call_break_offline_card_game,
+    {"call_break_offline_card_game",
      {call_break_offline_card_game::kReplayContextClientMajorVersion,
       call_break_offline_card_game::kReplayContextClientMinorVersion,
       call_break_offline_card_game::kReplayFrameStart,
@@ -193,100 +199,100 @@
       call_break_offline_card_game::kReplayDrawSurfaceWidth,
       call_break_offline_card_game::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "call_break_offline_card_game"}},
-    {RestrictedTraceID::candy_crush_500,
+    {"candy_crush_500",
      {candy_crush_500::kReplayContextClientMajorVersion,
       candy_crush_500::kReplayContextClientMinorVersion, candy_crush_500::kReplayFrameStart,
       candy_crush_500::kReplayFrameEnd, candy_crush_500::kReplayDrawSurfaceWidth,
       candy_crush_500::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "candy_crush_500"}},
-    {RestrictedTraceID::candy_crush_soda_saga,
+    {"candy_crush_soda_saga",
      {candy_crush_soda_saga::kReplayContextClientMajorVersion,
       candy_crush_soda_saga::kReplayContextClientMinorVersion,
       candy_crush_soda_saga::kReplayFrameStart, candy_crush_soda_saga::kReplayFrameEnd,
       candy_crush_soda_saga::kReplayDrawSurfaceWidth,
       candy_crush_soda_saga::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "candy_crush_soda_saga"}},
-    {RestrictedTraceID::car_parking_multiplayer,
+    {"car_parking_multiplayer",
      {car_parking_multiplayer::kReplayContextClientMajorVersion,
       car_parking_multiplayer::kReplayContextClientMinorVersion,
       car_parking_multiplayer::kReplayFrameStart, car_parking_multiplayer::kReplayFrameEnd,
       car_parking_multiplayer::kReplayDrawSurfaceWidth,
       car_parking_multiplayer::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "car_parking_multiplayer"}},
-    {RestrictedTraceID::clash_of_clans,
+    {"clash_of_clans",
      {clash_of_clans::kReplayContextClientMajorVersion,
       clash_of_clans::kReplayContextClientMinorVersion, clash_of_clans::kReplayFrameStart,
       clash_of_clans::kReplayFrameEnd, clash_of_clans::kReplayDrawSurfaceWidth,
       clash_of_clans::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "clash_of_clans"}},
-    {RestrictedTraceID::clash_royale,
+    {"clash_royale",
      {clash_royale::kReplayContextClientMajorVersion,
       clash_royale::kReplayContextClientMinorVersion, clash_royale::kReplayFrameStart,
       clash_royale::kReplayFrameEnd, clash_royale::kReplayDrawSurfaceWidth,
       clash_royale::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "clash_royale"}},
-    {RestrictedTraceID::cod_mobile,
+    {"cod_mobile",
      {cod_mobile::kReplayContextClientMajorVersion, cod_mobile::kReplayContextClientMinorVersion,
       cod_mobile::kReplayFrameStart, cod_mobile::kReplayFrameEnd,
       cod_mobile::kReplayDrawSurfaceWidth, cod_mobile::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "cod_mobile"}},
-    {RestrictedTraceID::coin_master,
+    {"coin_master",
      {coin_master::kReplayContextClientMajorVersion, coin_master::kReplayContextClientMinorVersion,
       coin_master::kReplayFrameStart, coin_master::kReplayFrameEnd,
       coin_master::kReplayDrawSurfaceWidth, coin_master::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "coin_master"}},
-    {RestrictedTraceID::command_and_conquer_rivals,
+    {"command_and_conquer_rivals",
      {command_and_conquer_rivals::kReplayContextClientMajorVersion,
       command_and_conquer_rivals::kReplayContextClientMinorVersion,
       command_and_conquer_rivals::kReplayFrameStart, command_and_conquer_rivals::kReplayFrameEnd,
       command_and_conquer_rivals::kReplayDrawSurfaceWidth,
       command_and_conquer_rivals::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "command_and_conquer_rivals"}},
-    {RestrictedTraceID::cookie_run_kingdom,
+    {"cookie_run_kingdom",
      {cookie_run_kingdom::kReplayContextClientMajorVersion,
       cookie_run_kingdom::kReplayContextClientMinorVersion, cookie_run_kingdom::kReplayFrameStart,
       cookie_run_kingdom::kReplayFrameEnd, cookie_run_kingdom::kReplayDrawSurfaceWidth,
       cookie_run_kingdom::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "cookie_run_kingdom"}},
-    {RestrictedTraceID::disney_tsum_tsum,
+    {"disney_tsum_tsum",
      {disney_tsum_tsum::kReplayContextClientMajorVersion,
       disney_tsum_tsum::kReplayContextClientMinorVersion, disney_tsum_tsum::kReplayFrameStart,
       disney_tsum_tsum::kReplayFrameEnd, disney_tsum_tsum::kReplayDrawSurfaceWidth,
       disney_tsum_tsum::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "disney_tsum_tsum"}},
-    {RestrictedTraceID::dr_driving,
+    {"dr_driving",
      {dr_driving::kReplayContextClientMajorVersion, dr_driving::kReplayContextClientMinorVersion,
       dr_driving::kReplayFrameStart, dr_driving::kReplayFrameEnd,
       dr_driving::kReplayDrawSurfaceWidth, dr_driving::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "dr_driving"}},
-    {RestrictedTraceID::dragon_ball_legends,
+    {"dragon_ball_legends",
      {dragon_ball_legends::kReplayContextClientMajorVersion,
       dragon_ball_legends::kReplayContextClientMinorVersion, dragon_ball_legends::kReplayFrameStart,
       dragon_ball_legends::kReplayFrameEnd, dragon_ball_legends::kReplayDrawSurfaceWidth,
       dragon_ball_legends::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "dragon_ball_legends"}},
-    {RestrictedTraceID::dragon_raja,
+    {"dragon_raja",
      {dragon_raja::kReplayContextClientMajorVersion, dragon_raja::kReplayContextClientMinorVersion,
       dragon_raja::kReplayFrameStart, dragon_raja::kReplayFrameEnd,
       dragon_raja::kReplayDrawSurfaceWidth, dragon_raja::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "dragon_raja"}},
-    {RestrictedTraceID::efootball_pes_2021,
+    {"efootball_pes_2021",
      {efootball_pes_2021::kReplayContextClientMajorVersion,
       efootball_pes_2021::kReplayContextClientMinorVersion, efootball_pes_2021::kReplayFrameStart,
       efootball_pes_2021::kReplayFrameEnd, efootball_pes_2021::kReplayDrawSurfaceWidth,
       efootball_pes_2021::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "efootball_pes_2021"}},
-    {RestrictedTraceID::egypt_1500,
+    {"egypt_1500",
      {egypt_1500::kReplayContextClientMajorVersion, egypt_1500::kReplayContextClientMinorVersion,
       egypt_1500::kReplayFrameStart, egypt_1500::kReplayFrameEnd,
       egypt_1500::kReplayDrawSurfaceWidth, egypt_1500::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "egypt_1500"}},
-    {RestrictedTraceID::eight_ball_pool,
+    {"eight_ball_pool",
      {eight_ball_pool::kReplayContextClientMajorVersion,
       eight_ball_pool::kReplayContextClientMinorVersion, eight_ball_pool::kReplayFrameStart,
       eight_ball_pool::kReplayFrameEnd, eight_ball_pool::kReplayDrawSurfaceWidth,
       eight_ball_pool::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "eight_ball_pool"}},
-    {RestrictedTraceID::extreme_car_driving_simulator,
+    {"extreme_car_driving_simulator",
      {extreme_car_driving_simulator::kReplayContextClientMajorVersion,
       extreme_car_driving_simulator::kReplayContextClientMinorVersion,
       extreme_car_driving_simulator::kReplayFrameStart,
@@ -294,198 +300,198 @@
       extreme_car_driving_simulator::kReplayDrawSurfaceWidth,
       extreme_car_driving_simulator::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "extreme_car_driving_simulator"}},
-    {RestrictedTraceID::fallout_shelter_online,
+    {"fallout_shelter_online",
      {fallout_shelter_online::kReplayContextClientMajorVersion,
       fallout_shelter_online::kReplayContextClientMinorVersion,
       fallout_shelter_online::kReplayFrameStart, fallout_shelter_online::kReplayFrameEnd,
       fallout_shelter_online::kReplayDrawSurfaceWidth,
       fallout_shelter_online::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "fallout_shelter_online"}},
-    {RestrictedTraceID::farm_heroes_saga,
+    {"farm_heroes_saga",
      {farm_heroes_saga::kReplayContextClientMajorVersion,
       farm_heroes_saga::kReplayContextClientMinorVersion, farm_heroes_saga::kReplayFrameStart,
       farm_heroes_saga::kReplayFrameEnd, farm_heroes_saga::kReplayDrawSurfaceWidth,
       farm_heroes_saga::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "farm_heroes_saga"}},
-    {RestrictedTraceID::fate_grand_order,
+    {"fate_grand_order",
      {fate_grand_order::kReplayContextClientMajorVersion,
       fate_grand_order::kReplayContextClientMinorVersion, fate_grand_order::kReplayFrameStart,
       fate_grand_order::kReplayFrameEnd, fate_grand_order::kReplayDrawSurfaceWidth,
       fate_grand_order::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "fate_grand_order"}},
-    {RestrictedTraceID::fifa_mobile,
+    {"fifa_mobile",
      {fifa_mobile::kReplayContextClientMajorVersion, fifa_mobile::kReplayContextClientMinorVersion,
       fifa_mobile::kReplayFrameStart, fifa_mobile::kReplayFrameEnd,
       fifa_mobile::kReplayDrawSurfaceWidth, fifa_mobile::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "fifa_mobile"}},
-    {RestrictedTraceID::final_fantasy,
+    {"final_fantasy",
      {final_fantasy::kReplayContextClientMajorVersion,
       final_fantasy::kReplayContextClientMinorVersion, final_fantasy::kReplayFrameStart,
       final_fantasy::kReplayFrameEnd, final_fantasy::kReplayDrawSurfaceWidth,
       final_fantasy::kReplayDrawSurfaceHeight, final_fantasy::kReplayDrawSurfaceColorSpace,
       "final_fantasy"}},
-    {RestrictedTraceID::free_fire,
+    {"free_fire",
      {free_fire::kReplayContextClientMajorVersion, free_fire::kReplayContextClientMinorVersion,
       free_fire::kReplayFrameStart, free_fire::kReplayFrameEnd, free_fire::kReplayDrawSurfaceWidth,
       free_fire::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "free_fire"}},
-    {RestrictedTraceID::gardenscapes,
+    {"gardenscapes",
      {gardenscapes::kReplayContextClientMajorVersion,
       gardenscapes::kReplayContextClientMinorVersion, gardenscapes::kReplayFrameStart,
       gardenscapes::kReplayFrameEnd, gardenscapes::kReplayDrawSurfaceWidth,
       gardenscapes::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "gardenscapes"}},
-    {RestrictedTraceID::genshin_impact,
+    {"genshin_impact",
      {genshin_impact::kReplayContextClientMajorVersion,
       genshin_impact::kReplayContextClientMinorVersion, genshin_impact::kReplayFrameStart,
       genshin_impact::kReplayFrameEnd, genshin_impact::kReplayDrawSurfaceWidth,
       genshin_impact::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "genshin_impact"}},
-    {RestrictedTraceID::google_maps,
+    {"google_maps",
      {google_maps::kReplayContextClientMajorVersion, google_maps::kReplayContextClientMinorVersion,
       google_maps::kReplayFrameStart, google_maps::kReplayFrameEnd,
       google_maps::kReplayDrawSurfaceWidth, google_maps::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "google_maps"}},
-    {RestrictedTraceID::happy_color,
+    {"happy_color",
      {happy_color::kReplayContextClientMajorVersion, happy_color::kReplayContextClientMinorVersion,
       happy_color::kReplayFrameStart, happy_color::kReplayFrameEnd,
       happy_color::kReplayDrawSurfaceWidth, happy_color::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "happy_color"}},
-    {RestrictedTraceID::hay_day,
+    {"hay_day",
      {hay_day::kReplayContextClientMajorVersion, hay_day::kReplayContextClientMinorVersion,
       hay_day::kReplayFrameStart, hay_day::kReplayFrameEnd, hay_day::kReplayDrawSurfaceWidth,
       hay_day::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "hay_day"}},
-    {RestrictedTraceID::hearthstone,
+    {"hearthstone",
      {hearthstone::kReplayContextClientMajorVersion, hearthstone::kReplayContextClientMinorVersion,
       hearthstone::kReplayFrameStart, hearthstone::kReplayFrameEnd,
       hearthstone::kReplayDrawSurfaceWidth, hearthstone::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "hearthstone"}},
-    {RestrictedTraceID::higgs_domino_island,
+    {"higgs_domino_island",
      {higgs_domino_island::kReplayContextClientMajorVersion,
       higgs_domino_island::kReplayContextClientMinorVersion, higgs_domino_island::kReplayFrameStart,
       higgs_domino_island::kReplayFrameEnd, higgs_domino_island::kReplayDrawSurfaceWidth,
       higgs_domino_island::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "higgs_domino_island"}},
-    {RestrictedTraceID::hill_climb_racing,
+    {"hill_climb_racing",
      {hill_climb_racing::kReplayContextClientMajorVersion,
       hill_climb_racing::kReplayContextClientMinorVersion, hill_climb_racing::kReplayFrameStart,
       hill_climb_racing::kReplayFrameEnd, hill_climb_racing::kReplayDrawSurfaceWidth,
       hill_climb_racing::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "hill_climb_racing"}},
-    {RestrictedTraceID::homescapes,
+    {"homescapes",
      {homescapes::kReplayContextClientMajorVersion, homescapes::kReplayContextClientMinorVersion,
       homescapes::kReplayFrameStart, homescapes::kReplayFrameEnd,
       homescapes::kReplayDrawSurfaceWidth, homescapes::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "homescapes"}},
-    {RestrictedTraceID::idle_heroes,
+    {"idle_heroes",
      {idle_heroes::kReplayContextClientMajorVersion, idle_heroes::kReplayContextClientMinorVersion,
       idle_heroes::kReplayFrameStart, idle_heroes::kReplayFrameEnd,
       idle_heroes::kReplayDrawSurfaceWidth, idle_heroes::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "idle_heroes"}},
-    {RestrictedTraceID::junes_journey,
+    {"junes_journey",
      {junes_journey::kReplayContextClientMajorVersion,
       junes_journey::kReplayContextClientMinorVersion, junes_journey::kReplayFrameStart,
       junes_journey::kReplayFrameEnd, junes_journey::kReplayDrawSurfaceWidth,
       junes_journey::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "junes_journey"}},
-    {RestrictedTraceID::kartrider_rush,
+    {"kartrider_rush",
      {kartrider_rush::kReplayContextClientMajorVersion,
       kartrider_rush::kReplayContextClientMinorVersion, kartrider_rush::kReplayFrameStart,
       kartrider_rush::kReplayFrameEnd, kartrider_rush::kReplayDrawSurfaceWidth,
       kartrider_rush::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "kartrider_rush"}},
-    {RestrictedTraceID::klondike_adventures,
+    {"klondike_adventures",
      {klondike_adventures::kReplayContextClientMajorVersion,
       klondike_adventures::kReplayContextClientMinorVersion, klondike_adventures::kReplayFrameStart,
       klondike_adventures::kReplayFrameEnd, klondike_adventures::kReplayDrawSurfaceWidth,
       klondike_adventures::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "klondike_adventures"}},
-    {RestrictedTraceID::league_of_legends_wild_rift,
+    {"league_of_legends_wild_rift",
      {league_of_legends_wild_rift::kReplayContextClientMajorVersion,
       league_of_legends_wild_rift::kReplayContextClientMinorVersion,
       league_of_legends_wild_rift::kReplayFrameStart, league_of_legends_wild_rift::kReplayFrameEnd,
       league_of_legends_wild_rift::kReplayDrawSurfaceWidth,
       league_of_legends_wild_rift::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "league_of_legends_wild_rift"}},
-    {RestrictedTraceID::lego_legacy,
+    {"lego_legacy",
      {lego_legacy::kReplayContextClientMajorVersion, lego_legacy::kReplayContextClientMinorVersion,
       lego_legacy::kReplayFrameStart, lego_legacy::kReplayFrameEnd,
       lego_legacy::kReplayDrawSurfaceWidth, lego_legacy::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "lego_legacy"}},
-    {RestrictedTraceID::lineage_m,
+    {"lineage_m",
      {lineage_m::kReplayContextClientMajorVersion, lineage_m::kReplayContextClientMinorVersion,
       lineage_m::kReplayFrameStart, lineage_m::kReplayFrameEnd, lineage_m::kReplayDrawSurfaceWidth,
       lineage_m::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "lineage_m"}},
-    {RestrictedTraceID::ludo_king,
+    {"ludo_king",
      {ludo_king::kReplayContextClientMajorVersion, ludo_king::kReplayContextClientMinorVersion,
       ludo_king::kReplayFrameStart, ludo_king::kReplayFrameEnd, ludo_king::kReplayDrawSurfaceWidth,
       ludo_king::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "ludo_king"}},
-    {RestrictedTraceID::magic_tiles_3,
+    {"magic_tiles_3",
      {magic_tiles_3::kReplayContextClientMajorVersion,
       magic_tiles_3::kReplayContextClientMinorVersion, magic_tiles_3::kReplayFrameStart,
       magic_tiles_3::kReplayFrameEnd, magic_tiles_3::kReplayDrawSurfaceWidth,
       magic_tiles_3::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "magic_tiles_3"}},
-    {RestrictedTraceID::manhattan_10,
+    {"manhattan_10",
      {manhattan_10::kReplayContextClientMajorVersion,
       manhattan_10::kReplayContextClientMinorVersion, manhattan_10::kReplayFrameStart,
       manhattan_10::kReplayFrameEnd, manhattan_10::kReplayDrawSurfaceWidth,
       manhattan_10::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "manhattan_10"}},
-    {RestrictedTraceID::manhattan_31,
+    {"manhattan_31",
      {manhattan_31::kReplayContextClientMajorVersion,
       manhattan_31::kReplayContextClientMinorVersion, manhattan_31::kReplayFrameStart,
       manhattan_31::kReplayFrameEnd, manhattan_31::kReplayDrawSurfaceWidth,
       manhattan_31::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "manhattan_31"}},
-    {RestrictedTraceID::mario_kart_tour,
+    {"mario_kart_tour",
      {mario_kart_tour::kReplayContextClientMajorVersion,
       mario_kart_tour::kReplayContextClientMinorVersion, mario_kart_tour::kReplayFrameStart,
       mario_kart_tour::kReplayFrameEnd, mario_kart_tour::kReplayDrawSurfaceWidth,
       mario_kart_tour::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "mario_kart_tour"}},
-    {RestrictedTraceID::marvel_contest_of_champions,
+    {"marvel_contest_of_champions",
      {marvel_contest_of_champions::kReplayContextClientMajorVersion,
       marvel_contest_of_champions::kReplayContextClientMinorVersion,
       marvel_contest_of_champions::kReplayFrameStart, marvel_contest_of_champions::kReplayFrameEnd,
       marvel_contest_of_champions::kReplayDrawSurfaceWidth,
       marvel_contest_of_champions::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "marvel_contest_of_champions"}},
-    {RestrictedTraceID::messenger_lite,
+    {"messenger_lite",
      {messenger_lite::kReplayContextClientMajorVersion,
       messenger_lite::kReplayContextClientMinorVersion, messenger_lite::kReplayFrameStart,
       messenger_lite::kReplayFrameEnd, messenger_lite::kReplayDrawSurfaceWidth,
       messenger_lite::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "messenger_lite"}},
-    {RestrictedTraceID::minecraft,
+    {"minecraft",
      {minecraft::kReplayContextClientMajorVersion, minecraft::kReplayContextClientMinorVersion,
       minecraft::kReplayFrameStart, minecraft::kReplayFrameEnd, minecraft::kReplayDrawSurfaceWidth,
       minecraft::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "minecraft"}},
-    {RestrictedTraceID::mobile_legends,
+    {"mobile_legends",
      {mobile_legends::kReplayContextClientMajorVersion,
       mobile_legends::kReplayContextClientMinorVersion, mobile_legends::kReplayFrameStart,
       mobile_legends::kReplayFrameEnd, mobile_legends::kReplayDrawSurfaceWidth,
       mobile_legends::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "mobile_legends"}},
-    {RestrictedTraceID::nba2k20_800,
+    {"nba2k20_800",
      {nba2k20_800::kReplayContextClientMajorVersion, nba2k20_800::kReplayContextClientMinorVersion,
       nba2k20_800::kReplayFrameStart, nba2k20_800::kReplayFrameEnd,
       nba2k20_800::kReplayDrawSurfaceWidth, nba2k20_800::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "nba2k20_800"}},
-    {RestrictedTraceID::one_punch_man,
+    {"one_punch_man",
      {one_punch_man::kReplayContextClientMajorVersion,
       one_punch_man::kReplayContextClientMinorVersion, one_punch_man::kReplayFrameStart,
       one_punch_man::kReplayFrameEnd, one_punch_man::kReplayDrawSurfaceWidth,
       one_punch_man::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "one_punch_man"}},
-    {RestrictedTraceID::plants_vs_zombies_2,
+    {"plants_vs_zombies_2",
      {plants_vs_zombies_2::kReplayContextClientMajorVersion,
       plants_vs_zombies_2::kReplayContextClientMinorVersion, plants_vs_zombies_2::kReplayFrameStart,
       plants_vs_zombies_2::kReplayFrameEnd, plants_vs_zombies_2::kReplayDrawSurfaceWidth,
       plants_vs_zombies_2::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "plants_vs_zombies_2"}},
-    {RestrictedTraceID::pokemon_go,
+    {"pokemon_go",
      {pokemon_go::kReplayContextClientMajorVersion, pokemon_go::kReplayContextClientMinorVersion,
       pokemon_go::kReplayFrameStart, pokemon_go::kReplayFrameEnd,
       pokemon_go::kReplayDrawSurfaceWidth, pokemon_go::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "pokemon_go"}},
-    {RestrictedTraceID::professional_baseball_spirits,
+    {"professional_baseball_spirits",
      {professional_baseball_spirits::kReplayContextClientMajorVersion,
       professional_baseball_spirits::kReplayContextClientMinorVersion,
       professional_baseball_spirits::kReplayFrameStart,
@@ -493,39 +499,39 @@
       professional_baseball_spirits::kReplayDrawSurfaceWidth,
       professional_baseball_spirits::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "professional_baseball_spirits"}},
-    {RestrictedTraceID::pubg_mobile_battle_royale,
+    {"pubg_mobile_battle_royale",
      {pubg_mobile_battle_royale::kReplayContextClientMajorVersion,
       pubg_mobile_battle_royale::kReplayContextClientMinorVersion,
       pubg_mobile_battle_royale::kReplayFrameStart, pubg_mobile_battle_royale::kReplayFrameEnd,
       pubg_mobile_battle_royale::kReplayDrawSurfaceWidth,
       pubg_mobile_battle_royale::kReplayDrawSurfaceHeight,
       pubg_mobile_battle_royale::kReplayDrawSurfaceColorSpace, "pubg_mobile_battle_royale"}},
-    {RestrictedTraceID::pubg_mobile_lite,
+    {"pubg_mobile_lite",
      {pubg_mobile_lite::kReplayContextClientMajorVersion,
       pubg_mobile_lite::kReplayContextClientMinorVersion, pubg_mobile_lite::kReplayFrameStart,
       pubg_mobile_lite::kReplayFrameEnd, pubg_mobile_lite::kReplayDrawSurfaceWidth,
       pubg_mobile_lite::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "pubg_mobile_lite"}},
-    {RestrictedTraceID::pubg_mobile_skydive,
+    {"pubg_mobile_skydive",
      {pubg_mobile_skydive::kReplayContextClientMajorVersion,
       pubg_mobile_skydive::kReplayContextClientMinorVersion, pubg_mobile_skydive::kReplayFrameStart,
       pubg_mobile_skydive::kReplayFrameEnd, pubg_mobile_skydive::kReplayDrawSurfaceWidth,
       pubg_mobile_skydive::kReplayDrawSurfaceHeight,
       pubg_mobile_skydive::kReplayDrawSurfaceColorSpace, "pubg_mobile_skydive"}},
-    {RestrictedTraceID::ragnarok_m_eternal_love,
+    {"ragnarok_m_eternal_love",
      {ragnarok_m_eternal_love::kReplayContextClientMajorVersion,
       ragnarok_m_eternal_love::kReplayContextClientMinorVersion,
       ragnarok_m_eternal_love::kReplayFrameStart, ragnarok_m_eternal_love::kReplayFrameEnd,
       ragnarok_m_eternal_love::kReplayDrawSurfaceWidth,
       ragnarok_m_eternal_love::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "ragnarok_m_eternal_love"}},
-    {RestrictedTraceID::raid_shadow_legends,
+    {"raid_shadow_legends",
      {raid_shadow_legends::kReplayContextClientMajorVersion,
       raid_shadow_legends::kReplayContextClientMinorVersion, raid_shadow_legends::kReplayFrameStart,
       raid_shadow_legends::kReplayFrameEnd, raid_shadow_legends::kReplayDrawSurfaceWidth,
       raid_shadow_legends::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "raid_shadow_legends"}},
-    {RestrictedTraceID::real_commando_secret_mission,
+    {"real_commando_secret_mission",
      {real_commando_secret_mission::kReplayContextClientMajorVersion,
       real_commando_secret_mission::kReplayContextClientMinorVersion,
       real_commando_secret_mission::kReplayFrameStart,
@@ -533,181 +539,190 @@
       real_commando_secret_mission::kReplayDrawSurfaceWidth,
       real_commando_secret_mission::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "real_commando_secret_mission"}},
-    {RestrictedTraceID::real_cricket_20,
+    {"real_cricket_20",
      {real_cricket_20::kReplayContextClientMajorVersion,
       real_cricket_20::kReplayContextClientMinorVersion, real_cricket_20::kReplayFrameStart,
       real_cricket_20::kReplayFrameEnd, real_cricket_20::kReplayDrawSurfaceWidth,
       real_cricket_20::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "real_cricket_20"}},
-    {RestrictedTraceID::real_gangster_crime,
+    {"real_gangster_crime",
      {real_gangster_crime::kReplayContextClientMajorVersion,
       real_gangster_crime::kReplayContextClientMinorVersion, real_gangster_crime::kReplayFrameStart,
       real_gangster_crime::kReplayFrameEnd, real_gangster_crime::kReplayDrawSurfaceWidth,
       real_gangster_crime::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "real_gangster_crime"}},
-    {RestrictedTraceID::rise_of_kingdoms,
+    {"rise_of_kingdoms",
      {rise_of_kingdoms::kReplayContextClientMajorVersion,
       rise_of_kingdoms::kReplayContextClientMinorVersion, rise_of_kingdoms::kReplayFrameStart,
       rise_of_kingdoms::kReplayFrameEnd, rise_of_kingdoms::kReplayDrawSurfaceWidth,
       rise_of_kingdoms::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "rise_of_kingdoms"}},
-    {RestrictedTraceID::romancing_saga,
+    {"romancing_saga",
      {romancing_saga::kReplayContextClientMajorVersion,
       romancing_saga::kReplayContextClientMinorVersion, romancing_saga::kReplayFrameStart,
       romancing_saga::kReplayFrameEnd, romancing_saga::kReplayDrawSurfaceWidth,
       romancing_saga::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "romancing_saga"}},
-    {RestrictedTraceID::rope_hero_vice_town,
+    {"rope_hero_vice_town",
      {rope_hero_vice_town::kReplayContextClientMajorVersion,
       rope_hero_vice_town::kReplayContextClientMinorVersion, rope_hero_vice_town::kReplayFrameStart,
       rope_hero_vice_town::kReplayFrameEnd, rope_hero_vice_town::kReplayDrawSurfaceWidth,
       rope_hero_vice_town::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "rope_hero_vice_town"}},
-    {RestrictedTraceID::saint_seiya_awakening,
+    {"saint_seiya_awakening",
      {saint_seiya_awakening::kReplayContextClientMajorVersion,
       saint_seiya_awakening::kReplayContextClientMinorVersion,
       saint_seiya_awakening::kReplayFrameStart, saint_seiya_awakening::kReplayFrameEnd,
       saint_seiya_awakening::kReplayDrawSurfaceWidth,
       saint_seiya_awakening::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "saint_seiya_awakening"}},
-    {RestrictedTraceID::sakura_school_simulator,
+    {"sakura_school_simulator",
      {sakura_school_simulator::kReplayContextClientMajorVersion,
       sakura_school_simulator::kReplayContextClientMinorVersion,
       sakura_school_simulator::kReplayFrameStart, sakura_school_simulator::kReplayFrameEnd,
       sakura_school_simulator::kReplayDrawSurfaceWidth,
       sakura_school_simulator::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "sakura_school_simulator"}},
-    {RestrictedTraceID::scrabble_go,
+    {"scrabble_go",
      {scrabble_go::kReplayContextClientMajorVersion, scrabble_go::kReplayContextClientMinorVersion,
       scrabble_go::kReplayFrameStart, scrabble_go::kReplayFrameEnd,
       scrabble_go::kReplayDrawSurfaceWidth, scrabble_go::kReplayDrawSurfaceHeight,
       scrabble_go::kReplayDrawSurfaceColorSpace, "scrabble_go"}},
-    {RestrictedTraceID::shadow_fight_2,
+    {"shadow_fight_2",
      {shadow_fight_2::kReplayContextClientMajorVersion,
       shadow_fight_2::kReplayContextClientMinorVersion, shadow_fight_2::kReplayFrameStart,
       shadow_fight_2::kReplayFrameEnd, shadow_fight_2::kReplayDrawSurfaceWidth,
       shadow_fight_2::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "shadow_fight_2"}},
-    {RestrictedTraceID::slingshot_test1,
+    {"slingshot_test1",
      {slingshot_test1::kReplayContextClientMajorVersion,
       slingshot_test1::kReplayContextClientMinorVersion, slingshot_test1::kReplayFrameStart,
       slingshot_test1::kReplayFrameEnd, slingshot_test1::kReplayDrawSurfaceWidth,
       slingshot_test1::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "slingshot_test1"}},
-    {RestrictedTraceID::slingshot_test2,
+    {"slingshot_test2",
      {slingshot_test2::kReplayContextClientMajorVersion,
       slingshot_test2::kReplayContextClientMinorVersion, slingshot_test2::kReplayFrameStart,
       slingshot_test2::kReplayFrameEnd, slingshot_test2::kReplayDrawSurfaceWidth,
       slingshot_test2::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "slingshot_test2"}},
-    {RestrictedTraceID::sniper_3d,
+    {"sniper_3d",
      {sniper_3d::kReplayContextClientMajorVersion, sniper_3d::kReplayContextClientMinorVersion,
       sniper_3d::kReplayFrameStart, sniper_3d::kReplayFrameEnd, sniper_3d::kReplayDrawSurfaceWidth,
       sniper_3d::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "sniper_3d"}},
-    {RestrictedTraceID::sonic_the_hedgehog,
+    {"sonic_the_hedgehog",
      {sonic_the_hedgehog::kReplayContextClientMajorVersion,
       sonic_the_hedgehog::kReplayContextClientMinorVersion, sonic_the_hedgehog::kReplayFrameStart,
       sonic_the_hedgehog::kReplayFrameEnd, sonic_the_hedgehog::kReplayDrawSurfaceWidth,
       sonic_the_hedgehog::kReplayDrawSurfaceHeight,
       sonic_the_hedgehog::kReplayDrawSurfaceColorSpace, "sonic_the_hedgehog"}},
-    {RestrictedTraceID::standoff_2,
+    {"standoff_2",
      {standoff_2::kReplayContextClientMajorVersion, standoff_2::kReplayContextClientMinorVersion,
       standoff_2::kReplayFrameStart, standoff_2::kReplayFrameEnd,
       standoff_2::kReplayDrawSurfaceWidth, standoff_2::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "standoff_2"}},
-    {RestrictedTraceID::subway_princess_runner,
+    {"subway_princess_runner",
      {subway_princess_runner::kReplayContextClientMajorVersion,
       subway_princess_runner::kReplayContextClientMinorVersion,
       subway_princess_runner::kReplayFrameStart, subway_princess_runner::kReplayFrameEnd,
       subway_princess_runner::kReplayDrawSurfaceWidth,
       subway_princess_runner::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "subway_princess_runner"}},
-    {RestrictedTraceID::subway_surfers,
+    {"subway_surfers",
      {subway_surfers::kReplayContextClientMajorVersion,
       subway_surfers::kReplayContextClientMinorVersion, subway_surfers::kReplayFrameStart,
       subway_surfers::kReplayFrameEnd, subway_surfers::kReplayDrawSurfaceWidth,
       subway_surfers::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "subway_surfers"}},
-    {RestrictedTraceID::summoners_war,
+    {"summoners_war",
      {summoners_war::kReplayContextClientMajorVersion,
       summoners_war::kReplayContextClientMinorVersion, summoners_war::kReplayFrameStart,
       summoners_war::kReplayFrameEnd, summoners_war::kReplayDrawSurfaceWidth,
       summoners_war::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "summoners_war"}},
-    {RestrictedTraceID::talking_tom_hero_dash,
+    {"talking_tom_hero_dash",
      {talking_tom_hero_dash::kReplayContextClientMajorVersion,
       talking_tom_hero_dash::kReplayContextClientMinorVersion,
       talking_tom_hero_dash::kReplayFrameStart, talking_tom_hero_dash::kReplayFrameEnd,
       talking_tom_hero_dash::kReplayDrawSurfaceWidth,
       talking_tom_hero_dash::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "talking_tom_hero_dash"}},
-    {RestrictedTraceID::temple_run_2,
+    {"temple_run_2",
      {temple_run_2::kReplayContextClientMajorVersion,
       temple_run_2::kReplayContextClientMinorVersion, temple_run_2::kReplayFrameStart,
       temple_run_2::kReplayFrameEnd, temple_run_2::kReplayDrawSurfaceWidth,
       temple_run_2::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "temple_run_2"}},
-    {RestrictedTraceID::temple_run_300,
+    {"temple_run_300",
      {temple_run_300::kReplayContextClientMajorVersion,
       temple_run_300::kReplayContextClientMinorVersion, temple_run_300::kReplayFrameStart,
       temple_run_300::kReplayFrameEnd, temple_run_300::kReplayDrawSurfaceWidth,
       temple_run_300::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "temple_run_300"}},
-    {RestrictedTraceID::toon_blast,
+    {"toon_blast",
      {toon_blast::kReplayContextClientMajorVersion, toon_blast::kReplayContextClientMinorVersion,
       toon_blast::kReplayFrameStart, toon_blast::kReplayFrameEnd,
       toon_blast::kReplayDrawSurfaceWidth, toon_blast::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "toon_blast"}},
-    {RestrictedTraceID::township,
+    {"township",
      {township::kReplayContextClientMajorVersion, township::kReplayContextClientMinorVersion,
       township::kReplayFrameStart, township::kReplayFrameEnd, township::kReplayDrawSurfaceWidth,
       township::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "township"}},
-    {RestrictedTraceID::trex_200,
+    {"trex_200",
      {trex_200::kReplayContextClientMajorVersion, trex_200::kReplayContextClientMinorVersion,
       trex_200::kReplayFrameStart, trex_200::kReplayFrameEnd, trex_200::kReplayDrawSurfaceWidth,
       trex_200::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "trex_200"}},
-    {RestrictedTraceID::whatsapp,
+    {"whatsapp",
      {whatsapp::kReplayContextClientMajorVersion, whatsapp::kReplayContextClientMinorVersion,
       whatsapp::kReplayFrameStart, whatsapp::kReplayFrameEnd, whatsapp::kReplayDrawSurfaceWidth,
       whatsapp::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace, "whatsapp"}},
-    {RestrictedTraceID::words_with_friends_2,
+    {"words_with_friends_2",
      {words_with_friends_2::kReplayContextClientMajorVersion,
       words_with_friends_2::kReplayContextClientMinorVersion,
       words_with_friends_2::kReplayFrameStart, words_with_friends_2::kReplayFrameEnd,
       words_with_friends_2::kReplayDrawSurfaceWidth, words_with_friends_2::kReplayDrawSurfaceHeight,
       words_with_friends_2::kReplayDrawSurfaceColorSpace, "words_with_friends_2"}},
-    {RestrictedTraceID::wordscapes,
+    {"wordscapes",
      {wordscapes::kReplayContextClientMajorVersion, wordscapes::kReplayContextClientMinorVersion,
       wordscapes::kReplayFrameStart, wordscapes::kReplayFrameEnd,
       wordscapes::kReplayDrawSurfaceWidth, wordscapes::kReplayDrawSurfaceHeight,
       wordscapes::kReplayDrawSurfaceColorSpace, "wordscapes"}},
-    {RestrictedTraceID::world_of_kings,
+    {"world_of_kings",
      {world_of_kings::kReplayContextClientMajorVersion,
       world_of_kings::kReplayContextClientMinorVersion, world_of_kings::kReplayFrameStart,
       world_of_kings::kReplayFrameEnd, world_of_kings::kReplayDrawSurfaceWidth,
       world_of_kings::kReplayDrawSurfaceHeight, world_of_kings::kReplayDrawSurfaceColorSpace,
       "world_of_kings"}},
-    {RestrictedTraceID::world_of_tanks_blitz,
+    {"world_of_tanks_blitz",
      {world_of_tanks_blitz::kReplayContextClientMajorVersion,
       world_of_tanks_blitz::kReplayContextClientMinorVersion,
       world_of_tanks_blitz::kReplayFrameStart, world_of_tanks_blitz::kReplayFrameEnd,
       world_of_tanks_blitz::kReplayDrawSurfaceWidth, world_of_tanks_blitz::kReplayDrawSurfaceHeight,
       kDefaultReplayDrawSurfaceColorSpace, "world_of_tanks_blitz"}},
-    {RestrictedTraceID::world_war_doh,
+    {"world_war_doh",
      {world_war_doh::kReplayContextClientMajorVersion,
       world_war_doh::kReplayContextClientMinorVersion, world_war_doh::kReplayFrameStart,
       world_war_doh::kReplayFrameEnd, world_war_doh::kReplayDrawSurfaceWidth,
       world_war_doh::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "world_war_doh"}},
-    {RestrictedTraceID::worms_zone_io,
+    {"worms_zone_io",
      {worms_zone_io::kReplayContextClientMajorVersion,
       worms_zone_io::kReplayContextClientMinorVersion, worms_zone_io::kReplayFrameStart,
       worms_zone_io::kReplayFrameEnd, worms_zone_io::kReplayDrawSurfaceWidth,
       worms_zone_io::kReplayDrawSurfaceHeight, kDefaultReplayDrawSurfaceColorSpace,
       "worms_zone_io"}}};
-}
+}  // namespace
 
-const TraceInfo &GetTraceInfo(RestrictedTraceID traceID)
+const TraceInfo &GetTraceInfo(const char *traceName)
 {
-    return kTraceInfos[traceID];
+    // Could be improved using std::lower_bound.
+    for (const TracePair &tracePair : kTraceInfos)
+    {
+        if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0)
+        {
+            return tracePair.info;
+        }
+    }
+    UNREACHABLE();
+    return kTraceInfos[0].info;
 }
 }  // namespace angle
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.h b/src/tests/restricted_traces/restricted_traces_autogen.h
index e3cb434..a8a5e64 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.h
+++ b/src/tests/restricted_traces/restricted_traces_autogen.h
@@ -27,114 +27,6 @@
 
 namespace angle
 {
-enum class RestrictedTraceID
-{
-    aliexpress,
-    among_us,
-    angry_birds_2_1500,
-    arena_of_valor,
-    asphalt_8,
-    avakin_life,
-    aztec_ruins,
-    beach_buggy_racing,
-    brawl_stars,
-    bricks_breaker_quest,
-    bubble_shooter,
-    bus_simulator_indonesia,
-    call_break_offline_card_game,
-    candy_crush_500,
-    candy_crush_soda_saga,
-    car_parking_multiplayer,
-    clash_of_clans,
-    clash_royale,
-    cod_mobile,
-    coin_master,
-    command_and_conquer_rivals,
-    cookie_run_kingdom,
-    disney_tsum_tsum,
-    dr_driving,
-    dragon_ball_legends,
-    dragon_raja,
-    efootball_pes_2021,
-    egypt_1500,
-    eight_ball_pool,
-    extreme_car_driving_simulator,
-    fallout_shelter_online,
-    farm_heroes_saga,
-    fate_grand_order,
-    fifa_mobile,
-    final_fantasy,
-    free_fire,
-    gardenscapes,
-    genshin_impact,
-    google_maps,
-    happy_color,
-    hay_day,
-    hearthstone,
-    higgs_domino_island,
-    hill_climb_racing,
-    homescapes,
-    idle_heroes,
-    junes_journey,
-    kartrider_rush,
-    klondike_adventures,
-    league_of_legends_wild_rift,
-    lego_legacy,
-    lineage_m,
-    ludo_king,
-    magic_tiles_3,
-    manhattan_10,
-    manhattan_31,
-    mario_kart_tour,
-    marvel_contest_of_champions,
-    messenger_lite,
-    minecraft,
-    mobile_legends,
-    nba2k20_800,
-    one_punch_man,
-    plants_vs_zombies_2,
-    pokemon_go,
-    professional_baseball_spirits,
-    pubg_mobile_battle_royale,
-    pubg_mobile_lite,
-    pubg_mobile_skydive,
-    ragnarok_m_eternal_love,
-    raid_shadow_legends,
-    real_commando_secret_mission,
-    real_cricket_20,
-    real_gangster_crime,
-    rise_of_kingdoms,
-    romancing_saga,
-    rope_hero_vice_town,
-    saint_seiya_awakening,
-    sakura_school_simulator,
-    scrabble_go,
-    shadow_fight_2,
-    slingshot_test1,
-    slingshot_test2,
-    sniper_3d,
-    sonic_the_hedgehog,
-    standoff_2,
-    subway_princess_runner,
-    subway_surfers,
-    summoners_war,
-    talking_tom_hero_dash,
-    temple_run_2,
-    temple_run_300,
-    toon_blast,
-    township,
-    trex_200,
-    whatsapp,
-    words_with_friends_2,
-    wordscapes,
-    world_of_kings,
-    world_of_tanks_blitz,
-    world_war_doh,
-    worms_zone_io,
-    InvalidEnum,
-    EnumCount = InvalidEnum
-};
-
 static constexpr size_t kTraceInfoMaxNameLen = 32;
 
 static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3;
@@ -153,7 +45,7 @@
     char name[kTraceInfoMaxNameLen];
 };
 
-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(RestrictedTraceID traceID);
+ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName);
 }  // namespace angle
 
 #endif  // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
diff --git a/src/tests/test_utils/angle_test_configs.cpp b/src/tests/test_utils/angle_test_configs.cpp
index 2950127..259cc81 100644
--- a/src/tests/test_utils/angle_test_configs.cpp
+++ b/src/tests/test_utils/angle_test_configs.cpp
@@ -49,6 +49,16 @@
     return eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE;
 }
 
+bool PlatformParameters::isVulkan() const
+{
+    return eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE;
+}
+
+bool PlatformParameters::isANGLE() const
+{
+    return driver == GLESDriverType::AngleEGL;
+}
+
 EGLint PlatformParameters::getAllocateNonZeroMemoryFeature() const
 {
     return eglParameters.allocateNonZeroMemoryFeature;
diff --git a/src/tests/test_utils/angle_test_configs.h b/src/tests/test_utils/angle_test_configs.h
index ff482b6..7931d35 100644
--- a/src/tests/test_utils/angle_test_configs.h
+++ b/src/tests/test_utils/angle_test_configs.h
@@ -34,6 +34,8 @@
     EGLint getRenderer() const;
     EGLint getDeviceType() const;
     bool isSwiftshader() const;
+    bool isVulkan() const;
+    bool isANGLE() const;
     EGLint getAllocateNonZeroMemoryFeature() const;
 
     void initDefaultParameters();