1// Copyright 2023 Google LLC 2// 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5 6package device_specific_configs 7 8import ( 9 "fmt" 10 "sort" 11) 12 13// Config represents a Bazel config that communicates information about the device under test. 14// 15// This struct is used to generate file //bazel/devicesrc. 16// 17// Configurations of this kind should not be used to set build time settings, such as the target 18// Bazel platform (e.g. Linux, Android), optimization level (e.g. Debug, Release) or local vs. RBE. 19// For that kind of information, please pass a second --config flag using one of the configurations 20// defined in //bazel/buildrc. 21type Config struct { 22 // Name of the config (the <foo> that gets passed to Bazel via --config=<foo>). 23 Name string 24 25 // Any device-specific key/value pairs to include in Gold and Perf traces produced by GM and 26 // benchmark tests, except for keys "cpu_or_gpu" and "cpu_or_gpu_value". See fields CPU and GPU. 27 Keys map[string]string 28 29 // CPU is the name of the CPU on this device. 30 // 31 // When a GM or benchmark test case is executed, the corresponding test runner will set the 32 // "cpu_or_gpu_value" key of the resulting Gold or Perf trace with the contents of this field 33 // if the test case is CPU-bound, in which case it will also set the "cpu_or_gpu" key to "CPU". 34 CPU string 35 36 // GPU is the name of the GPU on this device. 37 // 38 // This field is the GPU analogous of the CPU field; see its documentation for details. 39 GPU string 40 41 // SwarmingDimensions are the Swarming dimensions that a CI task must exhibit in order to get 42 // scheduled to run on a machine that corresponds with the device under test indicated by the 43 // Bazel config. 44 SwarmingDimensions map[string]string 45} 46 47// Model returns the "model" key in the Keys dictionary. 48func (d Config) Model() string { 49 model, ok := d.Keys["model"] 50 if !ok { 51 // Should never happen. We have a unit test that ensures all configs have this key. 52 panic(fmt.Sprintf("config %q does not contain key \"model\"", d.Name)) 53 } 54 return model 55} 56 57// TestRunnerArgs returns the command-line arguments that should be passed to the Bazel test 58// target. 59func (d Config) TestRunnerArgs() []string { 60 args := []string{ 61 // Pass the name of the Bazel configuration as an argument. Android tests use this to infer the 62 // model of the device under test. Specifically, adb_test_runner.go will take device-specific 63 // setup and teardown steps based on the model. C++ tests running on the same machine as Bazel 64 // will ignore this flag. 65 "--device-specific-bazel-config", 66 d.Name, 67 } 68 69 // Sort keys for determinism. 70 var keys []string 71 for key := range d.Keys { 72 keys = append(keys, key) 73 } 74 sort.Strings(keys) 75 76 // Add key/value pairs. 77 args = append(args, "--key") 78 for _, key := range keys { 79 args = append(args, key, d.Keys[key]) 80 } 81 82 if d.CPU != "" { 83 args = append(args, "--cpuName", d.CPU) 84 } 85 86 if d.GPU != "" { 87 args = append(args, "--gpuName", d.GPU) 88 } 89 90 return args 91} 92 93// Configs contains all known device-specific Bazel configs. 94// 95// The contents of this map are used to generate file //bazel/devicesrc. 96// 97// TODO(lovisolo): Populate field SwarmingDimensions for all configs. 98var Configs = map[string]Config{ 99 "AlphaR2": { 100 Name: "AlphaR2", 101 Keys: map[string]string{ 102 "arch": "x86_64", 103 "model": "AlphaR2", 104 "os": "Win10", 105 }, 106 GPU: "RadeonR9M470X", 107 }, 108 "AndroidOne": { 109 Name: "AndroidOne", 110 Keys: map[string]string{ 111 "arch": "arm", 112 "model": "AndroidOne", 113 "os": "Android", 114 }, 115 GPU: "Mali400MP2", 116 }, 117 "GCE_Debian10_AVX2": { 118 Name: "GCE_Debian10_AVX2", 119 Keys: map[string]string{ 120 "arch": "x86_64", 121 "model": "GCE", 122 "os": "Debian10", 123 }, 124 CPU: "AVX2", 125 GPU: "SwiftShader", 126 }, 127 "GCE_Debian10_AVX512": { 128 Name: "GCE_Debian10_AVX512", 129 Keys: map[string]string{ 130 "arch": "x86_64", 131 "model": "GCE", 132 "os": "Debian10", 133 }, 134 CPU: "AVX512", 135 GPU: "SwiftShader", 136 }, 137 "GCE_Debian10_Rome": { 138 Name: "GCE_Debian10_Rome", 139 Keys: map[string]string{ 140 "arch": "x86_64", 141 "model": "GCE", 142 "os": "Debian10", 143 }, 144 CPU: "Rome", 145 GPU: "SwiftShader", 146 }, 147 "GCE_Win2019_AVX2": { 148 Name: "GCE_Win2019_AVX2", 149 Keys: map[string]string{ 150 "arch": "x86_64", 151 "model": "GCE", 152 "os": "Win2019", 153 }, 154 CPU: "AVX2", 155 GPU: "SwiftShader", 156 }, 157 "GCE_Win2019_AVX512": { 158 Name: "GCE_Win2019_AVX512", 159 Keys: map[string]string{ 160 "arch": "x86_64", 161 "model": "GCE", 162 "os": "Win2019", 163 }, 164 CPU: "AVX512", 165 GPU: "SwiftShader", 166 }, 167 "GCE_Win2019_Rome": { 168 Name: "GCE_Win2019_Rome", 169 Keys: map[string]string{ 170 "arch": "x86_64", 171 "model": "GCE", 172 "os": "Win2019", 173 }, 174 CPU: "Rome", 175 GPU: "SwiftShader", 176 }, 177 "GCE_x86_Debian10_AVX2": { 178 Name: "GCE_x86_Debian10_AVX2", 179 Keys: map[string]string{ 180 "arch": "x86", 181 "model": "GCE", 182 "os": "Debian10", 183 }, 184 CPU: "AVX2", 185 GPU: "SwiftShader", 186 }, 187 "GCE_x86_Debian10_AVX512": { 188 Name: "GCE_x86_Debian10_AVX512", 189 Keys: map[string]string{ 190 "arch": "x86", 191 "model": "GCE", 192 "os": "Debian10", 193 }, 194 CPU: "AVX512", 195 GPU: "SwiftShader", 196 }, 197 "GCE_x86_Debian10_Rome": { 198 Name: "GCE_x86_Debian10_Rome", 199 Keys: map[string]string{ 200 "arch": "x86", 201 "model": "GCE", 202 "os": "Debian10", 203 }, 204 CPU: "Rome", 205 GPU: "SwiftShader", 206 }, 207 "GCE_x86_Win2019_AVX2": { 208 Name: "GCE_x86_Win2019_AVX2", 209 Keys: map[string]string{ 210 "arch": "x86", 211 "model": "GCE", 212 "os": "Win2019", 213 }, 214 CPU: "AVX2", 215 GPU: "SwiftShader", 216 }, 217 "GCE_x86_Win2019_AVX512": { 218 Name: "GCE_x86_Win2019_AVX512", 219 Keys: map[string]string{ 220 "arch": "x86", 221 "model": "GCE", 222 "os": "Win2019", 223 }, 224 CPU: "AVX512", 225 GPU: "SwiftShader", 226 }, 227 "GCE_x86_Win2019_Rome": { 228 Name: "GCE_x86_Win2019_Rome", 229 Keys: map[string]string{ 230 "arch": "x86", 231 "model": "GCE", 232 "os": "Win2019", 233 }, 234 CPU: "Rome", 235 GPU: "SwiftShader", 236 }, 237 "GalaxyS20": { 238 Name: "GalaxyS20", 239 Keys: map[string]string{ 240 "arch": "arm64", 241 "model": "GalaxyS20", 242 "os": "Android", 243 }, 244 GPU: "MaliG77", 245 }, 246 "GalaxyS7_G930FD": { 247 Name: "GalaxyS7_G930FD", 248 Keys: map[string]string{ 249 "arch": "arm64", 250 "model": "GalaxyS7_G930FD", 251 "os": "Android", 252 }, 253 GPU: "MaliT880", 254 }, 255 "GalaxyS9": { 256 Name: "GalaxyS9", 257 Keys: map[string]string{ 258 "arch": "arm64", 259 "model": "GalaxyS9", 260 "os": "Android", 261 }, 262 GPU: "MaliG72", 263 }, 264 "Golo_wasm_Ubuntu18": { 265 Name: "Golo_wasm_Ubuntu18", 266 Keys: map[string]string{ 267 "arch": "wasm", 268 "model": "Golo", 269 "os": "Ubuntu18", 270 }, 271 GPU: "QuadroP400", 272 }, 273 "Golo_wasm_Win10": { 274 Name: "Golo_wasm_Win10", 275 Keys: map[string]string{ 276 "arch": "wasm", 277 "model": "Golo", 278 "os": "Win10", 279 }, 280 GPU: "QuadroP400", 281 }, 282 "Golo_x86_64_Ubuntu18": { 283 Name: "Golo_x86_64_Ubuntu18", 284 Keys: map[string]string{ 285 "arch": "x86_64", 286 "model": "Golo", 287 "os": "Ubuntu18", 288 }, 289 GPU: "QuadroP400", 290 }, 291 "Golo_x86_64_Win10": { 292 Name: "Golo_x86_64_Win10", 293 Keys: map[string]string{ 294 "arch": "x86_64", 295 "model": "Golo", 296 "os": "Win10", 297 }, 298 GPU: "QuadroP400", 299 }, 300 "JioNext": { 301 Name: "JioNext", 302 Keys: map[string]string{ 303 "arch": "arm", 304 "model": "JioNext", 305 "os": "Android", 306 }, 307 CPU: "SnapdragonQM215", 308 GPU: "Adreno308", 309 }, 310 "Kevin": { 311 Name: "Kevin", 312 Keys: map[string]string{ 313 "arch": "arm", 314 "model": "Kevin", 315 "os": "ChromeOS", 316 }, 317 GPU: "MaliT860", 318 }, 319 "MacBook10.1": { 320 Name: "MacBook10.1", 321 Keys: map[string]string{ 322 "arch": "x86_64", 323 "model": "MacBook10.1", 324 "os": "Mac10.13", 325 }, 326 GPU: "IntelHD615", 327 }, 328 "MacBookAir7.2": { 329 Name: "MacBookAir7.2", 330 Keys: map[string]string{ 331 "arch": "x86_64", 332 "model": "MacBookAir7.2", 333 "os": "Mac10.15.1", 334 }, 335 GPU: "IntelHD6000", 336 }, 337 "MacBookPro11.5_Mac10.13": { 338 Name: "MacBookPro11.5_Mac10.13", 339 Keys: map[string]string{ 340 "arch": "x86_64", 341 "model": "MacBookPro11.5", 342 "os": "Mac10.13", 343 }, 344 CPU: "AVX2", 345 GPU: "RadeonHD8870M", 346 }, 347 "MacBookPro11.5_Mac10.15.7": { 348 Name: "MacBookPro11.5_Mac10.15.7", 349 Keys: map[string]string{ 350 "arch": "x86_64", 351 "model": "MacBookPro11.5", 352 "os": "Mac10.15.7", 353 }, 354 CPU: "AVX2", 355 GPU: "RadeonHD8870M", 356 }, 357 "MacBookPro16.2": { 358 Name: "MacBookPro16.2", 359 Keys: map[string]string{ 360 "arch": "x86_64", 361 "model": "MacBookPro16.2", 362 "os": "Mac12", 363 }, 364 CPU: "AppleIntel", 365 GPU: "IntelIrisPlus", 366 }, 367 "MacMini7.1_Mac10.13": { 368 Name: "MacMini7.1_Mac10.13", 369 Keys: map[string]string{ 370 "arch": "x86_64", 371 "model": "MacMini7.1", 372 "os": "Mac10.13", 373 }, 374 CPU: "AVX2", 375 GPU: "IntelIris5100", 376 }, 377 "MacMini7.1_Mac10.14": { 378 Name: "MacMini7.1_Mac10.14", 379 Keys: map[string]string{ 380 "arch": "x86_64", 381 "model": "MacMini7.1", 382 "os": "Mac10.14", 383 }, 384 CPU: "AVX2", 385 GPU: "IntelIris5100", 386 }, 387 "MacMini7.1_Mac10.15.7": { 388 Name: "MacMini7.1_Mac10.15.7", 389 Keys: map[string]string{ 390 "arch": "x86_64", 391 "model": "MacMini7.1", 392 "os": "Mac10.15.7", 393 }, 394 CPU: "AVX2", 395 GPU: "IntelIris5100", 396 }, 397 "MacMini9.1_Mac11": { 398 Name: "MacMini9.1_Mac11", 399 Keys: map[string]string{ 400 "arch": "arm64", 401 "model": "MacMini9.1", 402 "os": "Mac11", 403 }, 404 CPU: "AppleM1", 405 GPU: "AppleM1", 406 }, 407 "MacMini9.1_Mac12": { 408 Name: "MacMini9.1_Mac12", 409 Keys: map[string]string{ 410 "arch": "arm64", 411 "model": "MacMini9.1", 412 "os": "Mac12", 413 }, 414 CPU: "AppleM1", 415 GPU: "AppleM1", 416 }, 417 "MacMini9.1_Mac13": { 418 Name: "MacMini9.1_Mac13", 419 Keys: map[string]string{ 420 "arch": "arm64", 421 "model": "MacMini9.1", 422 "os": "Mac13", 423 }, 424 CPU: "AppleM1", 425 GPU: "AppleM1", 426 }, 427 "NUC11TZi5_Debian11": { 428 Name: "NUC11TZi5_Debian11", 429 Keys: map[string]string{ 430 "arch": "x86_64", 431 "model": "NUC11TZi5", 432 "os": "Debian11", 433 }, 434 CPU: "AVX2", 435 GPU: "IntelIrisXe", 436 }, 437 "NUC11TZi5_Win10": { 438 Name: "NUC11TZi5_Win10", 439 Keys: map[string]string{ 440 "arch": "x86_64", 441 "model": "NUC11TZi5", 442 "os": "Win10", 443 }, 444 CPU: "AVX2", 445 GPU: "IntelIrisXe", 446 }, 447 "NUC5PPYH": { 448 Name: "NUC5PPYH", 449 Keys: map[string]string{ 450 "arch": "x86_64", 451 "model": "NUC5PPYH", 452 "os": "Debian10", 453 }, 454 GPU: "IntelHD405", 455 }, 456 "NUC5i7RYH": { 457 Name: "NUC5i7RYH", 458 Keys: map[string]string{ 459 "arch": "x86_64", 460 "model": "NUC5i7RYH", 461 "os": "Win10", 462 }, 463 CPU: "AVX2", 464 GPU: "IntelIris6100", 465 }, 466 "NUC6i5SYK": { 467 Name: "NUC6i5SYK", 468 Keys: map[string]string{ 469 "arch": "x86_64", 470 "model": "NUC6i5SYK", 471 "os": "Win10", 472 }, 473 GPU: "IntelIris540", 474 }, 475 "NUC8i5BEK": { 476 Name: "NUC8i5BEK", 477 Keys: map[string]string{ 478 "arch": "x86_64", 479 "model": "NUC8i5BEK", 480 "os": "Win10", 481 }, 482 GPU: "IntelIris655", 483 }, 484 "NUC9i7QN_Debian11": { 485 Name: "NUC9i7QN_Debian11", 486 Keys: map[string]string{ 487 "arch": "x86_64", 488 "model": "NUC9i7QN", 489 "os": "Debian11", 490 }, 491 CPU: "AVX2", 492 GPU: "RTX3060", 493 // Based on 494 // https://skia.googlesource.com/skia/+/5606ef899116266132253e979a793fea97f12604/infra/bots/gen_tasks_logic/gen_tasks_logic.go#952. 495 SwarmingDimensions: map[string]string{ 496 "os": "Debian-11.5", 497 "cpu": "x86-64-i7-9750H", 498 }, 499 }, 500 "NUC9i7QN_Win10": { 501 Name: "NUC9i7QN_Win10", 502 Keys: map[string]string{ 503 "arch": "x86_64", 504 "model": "NUC9i7QN", 505 "os": "Win10", 506 }, 507 CPU: "AVX2", 508 GPU: "RTX3060", 509 }, 510 "NUCD34010WYKH": { 511 Name: "NUCD34010WYKH", 512 Keys: map[string]string{ 513 "arch": "x86_64", 514 "model": "NUCD34010WYKH", 515 "os": "Win10", 516 }, 517 GPU: "IntelHD4400", 518 }, 519 "NUCDE3815TYKHE": { 520 Name: "NUCDE3815TYKHE", 521 Keys: map[string]string{ 522 "arch": "x86_64", 523 "model": "NUCDE3815TYKHE", 524 "os": "Debian10", 525 }, 526 GPU: "IntelBayTrail", 527 }, 528 "Nexus7": { 529 Name: "Nexus7", 530 Keys: map[string]string{ 531 "arch": "arm", 532 "model": "Nexus7", 533 "os": "Android", 534 }, 535 GPU: "Tegra3", 536 }, 537 "P30": { 538 Name: "P30", 539 Keys: map[string]string{ 540 "arch": "arm64", 541 "model": "P30", 542 "os": "Android", 543 }, 544 GPU: "MaliG76", 545 }, 546 "Pixel2XL": { 547 Name: "Pixel2XL", 548 Keys: map[string]string{ 549 "arch": "arm64", 550 "model": "Pixel2XL", 551 "os": "Android", 552 }, 553 GPU: "Adreno540", 554 }, 555 "Pixel3": { 556 Name: "Pixel3", 557 Keys: map[string]string{ 558 "arch": "arm64", 559 "model": "Pixel3", 560 "os": "Android", 561 }, 562 GPU: "Adreno630", 563 }, 564 "Pixel4": { 565 Name: "Pixel4", 566 Keys: map[string]string{ 567 "arch": "arm64", 568 "model": "Pixel4", 569 "os": "Android", 570 }, 571 CPU: "Snapdragon855", 572 GPU: "Adreno640", 573 }, 574 "Pixel4XL": { 575 Name: "Pixel4XL", 576 Keys: map[string]string{ 577 "arch": "arm64", 578 "model": "Pixel4XL", 579 "os": "Android", 580 }, 581 GPU: "Adreno640", 582 }, 583 "Pixel5": { 584 Name: "Pixel5", 585 Keys: map[string]string{ 586 "arch": "arm64", 587 "model": "Pixel5", 588 "os": "Android", 589 }, 590 GPU: "Adreno620", 591 // Based on 592 // https://skia.googlesource.com/skia/+/f8daeeb7f092abe1674bc2303c0781f9fb1756ab/infra/bots/gen_tasks_logic/gen_tasks_logic.go#836. 593 SwarmingDimensions: map[string]string{ 594 "os": "Android", 595 "device_type": "redfin", 596 "device_os": "RD1A.200810.022.A4", 597 }, 598 }, 599 "Pixel5_Android12": { 600 Name: "Pixel5_Android12", 601 Keys: map[string]string{ 602 "arch": "arm64", 603 "model": "Pixel5", 604 "os": "Android12", 605 }, 606 GPU: "Adreno620", 607 // Based on 608 // https://skia.googlesource.com/skia/+/f8daeeb7f092abe1674bc2303c0781f9fb1756ab/infra/bots/gen_tasks_logic/gen_tasks_logic.go#910. 609 SwarmingDimensions: map[string]string{ 610 "os": "Android", 611 "device_type": "redfin", 612 "device_os": "SP2A.220305.012", 613 }, 614 }, 615 "Pixel6": { 616 Name: "Pixel6", 617 Keys: map[string]string{ 618 "arch": "arm64", 619 "model": "Pixel6", 620 "os": "Android", 621 }, 622 GPU: "MaliG78", 623 }, 624 "Pixel7": { 625 Name: "Pixel7", 626 Keys: map[string]string{ 627 "arch": "arm64", 628 "model": "Pixel7", 629 "os": "Android", 630 }, 631 GPU: "MaliG710", 632 }, 633 "RUBYR5_Debian11": { 634 Name: "RUBYR5_Debian11", 635 Keys: map[string]string{ 636 "arch": "x86_64", 637 "model": "RUBYR5", 638 "os": "Debian11", 639 }, 640 GPU: "RadeonVega6", 641 }, 642 "RUBYR5_Win10": { 643 Name: "RUBYR5_Win10", 644 Keys: map[string]string{ 645 "arch": "x86_64", 646 "model": "RUBYR5", 647 "os": "Win10", 648 }, 649 GPU: "RadeonVega6", 650 }, 651 "ShuttleA_Debian10_GTX660": { 652 Name: "ShuttleA_Debian10_GTX660", 653 Keys: map[string]string{ 654 "arch": "x86_64", 655 "model": "ShuttleA", 656 "os": "Debian10", 657 }, 658 GPU: "GTX660", 659 }, 660 "ShuttleA_Debian10_IntelHD2000": { 661 Name: "ShuttleA_Debian10_IntelHD2000", 662 Keys: map[string]string{ 663 "arch": "x86_64", 664 "model": "ShuttleA", 665 "os": "Debian10", 666 }, 667 GPU: "IntelHD2000", 668 }, 669 "ShuttleA_Debian10_RadeonHD7770": { 670 Name: "ShuttleA_Debian10_RadeonHD7770", 671 Keys: map[string]string{ 672 "arch": "x86_64", 673 "model": "ShuttleA", 674 "os": "Debian10", 675 }, 676 GPU: "RadeonHD7770", 677 }, 678 "ShuttleA_Win10_GTX660": { 679 Name: "ShuttleA_Win10_GTX660", 680 Keys: map[string]string{ 681 "arch": "x86_64", 682 "model": "ShuttleA", 683 "os": "Win10", 684 }, 685 GPU: "GTX660", 686 }, 687 "ShuttleA_Win10_IntelHD2000": { 688 Name: "ShuttleA_Win10_IntelHD2000", 689 Keys: map[string]string{ 690 "arch": "x86_64", 691 "model": "ShuttleA", 692 "os": "Win10", 693 }, 694 GPU: "IntelHD2000", 695 }, 696 "ShuttleA_Win10_RadeonHD7770": { 697 Name: "ShuttleA_Win10_RadeonHD7770", 698 Keys: map[string]string{ 699 "arch": "x86_64", 700 "model": "ShuttleA", 701 "os": "Win10", 702 }, 703 GPU: "RadeonHD7770", 704 }, 705 "ShuttleC": { 706 Name: "ShuttleC", 707 Keys: map[string]string{ 708 "arch": "x86_64", 709 "model": "ShuttleC", 710 "os": "Win10", 711 }, 712 GPU: "GTX960", 713 }, 714 "Sparky360": { 715 Name: "Sparky360", 716 Keys: map[string]string{ 717 "arch": "x86_64", 718 "model": "Sparky360", 719 "os": "ChromeOS", 720 }, 721 GPU: "IntelUHDGraphics605", 722 }, 723 "Spin513": { 724 Name: "Spin513", 725 Keys: map[string]string{ 726 "arch": "arm", 727 "model": "Spin513", 728 "os": "ChromeOS", 729 }, 730 GPU: "Adreno618", 731 }, 732 "Spin514": { 733 Name: "Spin514", 734 Keys: map[string]string{ 735 "arch": "x86_64", 736 "model": "Spin514", 737 "os": "ChromeOS", 738 }, 739 GPU: "RadeonVega3", 740 }, 741 "VMware7.1_Mac10.13": { 742 Name: "VMware7.1_Mac10.13", 743 Keys: map[string]string{ 744 "arch": "x86_64", 745 "model": "VMware7.1", 746 "os": "Mac10.13", 747 }, 748 CPU: "AVX", 749 }, 750 "VMware7.1_Mac10.14": { 751 Name: "VMware7.1_Mac10.14", 752 Keys: map[string]string{ 753 "arch": "x86_64", 754 "model": "VMware7.1", 755 "os": "Mac10.14", 756 }, 757 CPU: "AVX", 758 }, 759 "VMware7.1_Mac10.15.7": { 760 Name: "VMware7.1_Mac10.15.7", 761 Keys: map[string]string{ 762 "arch": "x86_64", 763 "model": "VMware7.1", 764 "os": "Mac10.15.7", 765 }, 766 CPU: "AVX", 767 }, 768 "Wembley": { 769 Name: "Wembley", 770 Keys: map[string]string{ 771 "arch": "arm", 772 "model": "Wembley", 773 "os": "Android", 774 }, 775 GPU: "PowerVRGE8320", 776 }, 777 "iPadPro": { 778 Name: "iPadPro", 779 Keys: map[string]string{ 780 "arch": "arm64", 781 "model": "iPadPro", 782 "os": "iOS", 783 }, 784 GPU: "PowerVRGT7800", 785 }, 786 "iPhone11": { 787 Name: "iPhone11", 788 Keys: map[string]string{ 789 "arch": "arm64", 790 "model": "iPhone11", 791 "os": "iOS", 792 }, 793 GPU: "AppleA13", 794 }, 795 "iPhone7": { 796 Name: "iPhone7", 797 Keys: map[string]string{ 798 "arch": "arm64", 799 "model": "iPhone7", 800 "os": "iOS", 801 }, 802 GPU: "PowerVRGT7600", 803 }, 804 "iPhone8": { 805 Name: "iPhone8", 806 Keys: map[string]string{ 807 "arch": "arm64", 808 "model": "iPhone8", 809 "os": "iOS", 810 }, 811 GPU: "AppleA11", 812 }, 813} 814