Update gpu_info.json with new GPUs

Change-Id: Ia8f926927a80e06f859fe083e9a7d17e91eac864
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/206081
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
diff --git a/src/dawn/gpu_info.json b/src/dawn/gpu_info.json
index 2617f1d..cf71025 100644
--- a/src/dawn/gpu_info.json
+++ b/src/dawn/gpu_info.json
@@ -92,22 +92,17 @@
       "id": "0x1002",
 
       "devices": [{
-        "mask": "0xFF00",
-        "architecture": {
-          "GCN 2": ["0x1300"],
-          "GCN 5": ["0x1500", "0x1600"],
-          "RDNA 2": ["0x7400"]
-        }
-      }, {
         "mask": "0xFFF0",
         "architecture": {
-          "GCN 1": ["0x6600", "0x6610", "0x6660", "0x6790", "0x6800", "0x6810", "0x6820", "0x6830"],
+          "GCN 1": ["0x1300", "0x1310", "0x6600", "0x6610", "0x6660", "0x6790", "0x6800", "0x6810", "0x6820", "0x6830"],
           "GCN 2": ["0x6640", "0x6650", "0x67A0", "0x67B0", "0x9830", "0x9850"],
           "GCN 3": ["0x6900", "0x6920", "0x6930", "0x7300", "0x9870", "0x98E0"],
-          "GCN 4": ["0x67C0", "0x67D0", "0x67E0", "0x67F0", "0x6980", "0x6990", "0x6FD0"],
-          "GCN 5": ["0x66A0", "0x6860", "0x6870", "0x6940", "0x69A0"],
+          "GCN 4": ["0x67C0", "0x67D0", "0x67E0", "0x67F0", "0x6980", "0x6990", "0x6FD0", "0x9920"],
+          "GCN 5": ["0x66A0", "0x6860", "0x6870", "0x6940", "0x69A0", "0x15D0", "0x1630"],
           "RDNA 1": ["0x7310", "0x7340", "0x7360"],
-          "RDNA 2": ["0x73A0", "0x73B0", "0x73D0", "0x73E0", "0x73F0"]
+          "RDNA 2": ["0x73A0", "0x73B0", "0x73D0", "0x73E0", "0x73F0", "0x7400", "0x7420", "0x7430", "0x1430", "0x1500", "0x15E0", "0x1640", "0x1680"],
+          "RDNA 3": ["0x7440", "0x7470", "0x7480", "0x15B0"],
+          "CDNA 1": ["0x7380"]
         }
       }]
     },
@@ -138,7 +133,26 @@
 
           "Midgard": ["0x00000000"],
           "Bifrost": ["0x60000000", "0x70000000"],
-          "Valhall": ["0x90000000", "0xA0000000", "0xB0000000"]
+          "Valhall": ["0x90000000", "0xA0000000", "0xB0000000"],
+          "Gen 5": ["0xC0000000"]
+        }
+      }]
+    },
+
+    "Broadcom": {
+      "id": "0x14e4",
+
+      "devices": [{
+        "mask": "0x00000000",
+        "architecture": {
+          "_comment": [
+            "The Broadcom GPUs are rare (used by Raspberry Pi and similar low-power devices) and",
+            "have device IDs that are all over place, so they're all going to get lumped into a",
+            "single 'VideoCore' architecture unless someone comes up with a better way to break",
+            "them down."
+          ],
+
+          "VideoCore": ["0x00000000"]
         }
       }]
     },
@@ -154,7 +168,16 @@
     },
 
     "Img Tec": {
-      "id": "0x1010"
+      "id": "0x1010",
+
+      "devices": [{
+        "mask": "0xFF000000",
+        "architecture": {
+          "Rogue": ["0x00000000", "0x22000000", "0x24000000"],
+          "Furian": ["0x1b000000"],
+          "Albiorix": ["0x35000000", "0x36000000"]
+        }
+      }]
     },
 
     "Intel": {
@@ -165,8 +188,8 @@
         "architecture": {
           "Gen 7": ["0x0100", "0x0400", "0x0A00", "0x0D00", "0x0F00"],
           "Gen 8": ["0x1600", "0x2200"],
-          "Gen 9": ["0x1900", "0x3100", "0x3E00", "0x5A00", "0x5900", "0x9B00"],
-          "Gen 11": ["0x8A00", "0x4E00"],
+          "Gen 9": ["0x1900", "0x3100", "0x3E00", "0x5A00", "0x5900", "0x8700", "0x9B00"],
+          "Gen 11": ["0x8A00", "0x4E00", "0x9800"],
           "Gen 12 LP": ["0x4600", "0x4C00", "0x4900", "0x9A00", "0xA700", "0x7D00"],
           "Gen 12 HP": ["0x4F00", "0x5600"],
           "Gen 13 LP": ["0x6400"],
@@ -206,7 +229,7 @@
           "Maxwell": ["0x1300", "0x1400", "0x1600", "0x1700"],
           "Pascal": ["0x1500", "0x1B00", "0x1C00", "0x1D00"],
           "Turing": ["0x1E00", "0x1F00", "0x2100"],
-          "Ampere": ["0x2200", "0x2400", "0x2500"],
+          "Ampere": ["0x2200", "0x2400", "0x2500", "0x2000"],
           "Lovelace": ["0x2600", "0x2700", "0x2800"]
         }
       }, {
@@ -215,7 +238,9 @@
         "architecture": {
           "Kepler": ["0x1e000000"],
           "Maxwell": ["0x92000000"],
-          "Pascal": ["0x93000000"]
+          "Pascal": ["0x93000000"],
+          "Ampere": ["0x97000000"],
+          "Volta": ["0xa5000000"]
         }
       }]
     },
@@ -237,15 +262,29 @@
 
     "Qualcomm_ACPI": {
       "name_override": "Qualcomm",
-      "id": "0x4D4F4351"
+      "id": "0x4D4F4351",
+
+      "devices": [{
+        "mask": "0xFF000000",
+        "architecture": {
+          "Adreno 8xx": ["0x36000000"]
+        }
+      }]
+
     },
 
     "Samsung": {
       "id": "0x144d",
 
       "devices": [{
+        "_comment": [
+          "Haven't seen enough of these to determine a good masking pattern, so just using full",
+          "device IDs of known devices in the meantime."
+        ],
+        "mask": "0xFFFFFFFF",
         "architecture": {
-          "RDNA 2": ["0x73A0"]
+          "RDNA 2": ["0x000073A0", "0x01300100"],
+          "RDNA 3": ["0x02600200"]
         }
       }]
     }
diff --git a/src/dawn/updating_gpu_info.md b/src/dawn/updating_gpu_info.md
new file mode 100644
index 0000000..63a1e1d
--- /dev/null
+++ b/src/dawn/updating_gpu_info.md
@@ -0,0 +1,37 @@
+# Updating gpu_info.json
+
+Dawn uses `gpu_info.json` to group GPUs by vendor and architecture when calling `adapter.info`. It uses
+vendor and masked PCI device IDs to identify the GPUs, and as such will need to be updated from time to time as new
+devices come on the market.
+
+## Guidelines for adding a new device or set of devices
+
+There are no automated processes to add devices to `gpu_info.json`. Everything is inserted by hand. Fortunately the
+file is intended to be human readable, and should be relatively easy to update following the comments at the top of the
+file and referencing the existing entries.
+
+When adding new devices use of a `mask` is encouraged when applicable to capture more devices with less entries.
+However, it's important to ensure that the masked device IDs are not overly broad or capture devices which do not belong
+to a given architecture. Many GPU vendors do not use very consistent patterns in their IDs, or have strange exceptions
+to the patterns that do exist.
+
+When in doubt, prefer adding an explicit device ID without a `mask` over adding an masked ID that might accidentally
+capture more devices than intended.
+
+A GPUs `architecture` should be the vendor's terminology for a given family of devices when possible. An `architecture`
+group should not be detailed enough to identify specific devices, but should ideally group all devices made within a
+span of a couple of years or longer. It is OK to have significant performance disparities between devices in a single
+`architecture` group, as long as the capabilities and behavior of the devices are roughly similar.
+
+## Rolling new devices
+
+Capturing new devices that need to be added to `gpu_info.json` right now is unfortunately a fairly awkward process. The
+method used so far has been to checkout https://github.com/kainino0x/gpuinfo-vulkan-query, update the data submodule
+with the latest records from https://gpuinfo.org using the script at https://github.com/kainino0x/gpuinfo-vulkan-slurp
+(Ask kainino@ or bajones@ for access), and then run `device_id.py` with the path to the `gpu_info.json` file you are
+updating. That script will compare all the records to the entries in `gpu_info.json` and print out how each of them are
+categorized followed by a list of all the uncategorized device IDs and descriptions sorted by vendor. You'll have to
+manually look at the device descriptions and research their architectural design in order to categorize them.
+
+Good luck!
+