[dawn][emscripten] Add wgpuDeviceGetAdapterInfo

Bug: 376600838
Change-Id: I224786bf42235b20184c46e60a60b1318bf0387a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/214856
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Fr <beaufort.francois@gmail.com>
diff --git a/third_party/emdawnwebgpu/library_webgpu.js b/third_party/emdawnwebgpu/library_webgpu.js
index 1fabfeb..e406c18 100644
--- a/third_party/emdawnwebgpu/library_webgpu.js
+++ b/third_party/emdawnwebgpu/library_webgpu.js
@@ -1773,6 +1773,41 @@
     return device.features.has(WebGPU.FeatureName[featureEnumValue]);
   },
 
+  wgpuDeviceGetAdapterInfo__deps: ['$stringToNewUTF8', '$lengthBytesUTF8'],
+  wgpuDeviceGetAdapterInfo: (devicePtr, adapterInfo) => {
+    // TODO(crbug.com/377760848): Avoid duplicated code with wgpuAdapterGetInfo,
+    // for example by deferring to wgpuAdapterGetInfo from webgpu.cpp.
+    var device = WebGPU.getJsObject(devicePtr);
+    {{{ gpu.makeCheckDescriptor('adapterInfo') }}}
+
+    // Append all the strings together to condense into a single malloc.
+    var strs = device.adapterInfo.vendor + device.adapterInfo.architecture + device.adapterInfo.device + device.adapterInfo.description;
+    var strPtr = stringToNewUTF8(strs);
+
+    var vendorLen = lengthBytesUTF8(device.adapterInfo.vendor);
+    WebGPU.setStringView(adapterInfo + {{{ C_STRUCTS.WGPUAdapterInfo.vendor }}}, strPtr, vendorLen);
+    strPtr += vendorLen;
+
+    var architectureLen = lengthBytesUTF8(device.adapterInfo.architecture);
+    WebGPU.setStringView(adapterInfo + {{{ C_STRUCTS.WGPUAdapterInfo.architecture }}}, strPtr, architectureLen);
+    strPtr += architectureLen;
+
+    var deviceLen = lengthBytesUTF8(device.adapterInfo.device);
+    WebGPU.setStringView(adapterInfo + {{{ C_STRUCTS.WGPUAdapterInfo.device }}}, strPtr, deviceLen);
+    strPtr += deviceLen;
+
+    var descriptionLen = lengthBytesUTF8(device.adapterInfo.description);
+    WebGPU.setStringView(adapterInfo + {{{ C_STRUCTS.WGPUAdapterInfo.description }}}, strPtr, descriptionLen);
+    strPtr += descriptionLen;
+
+    {{{ makeSetValue('adapterInfo', C_STRUCTS.WGPUAdapterInfo.backendType, gpu.BackendType.WebGPU, 'i32') }}};
+    // TODO: Set the adapter type from adapter.isFallbackAdapter (not easily available here).
+    var adapterType = {{{ gpu.AdapterType.Unknown }}};
+    {{{ makeSetValue('adapterInfo', C_STRUCTS.WGPUAdapterInfo.adapterType, 'adapterType', 'i32') }}};
+    {{{ makeSetValue('adapterInfo', C_STRUCTS.WGPUAdapterInfo.vendorID, '0', 'i32') }}};
+    {{{ makeSetValue('adapterInfo', C_STRUCTS.WGPUAdapterInfo.deviceID, '0', 'i32') }}};
+  },
+
   emwgpuDevicePopErrorScope__deps: ['emwgpuOnPopErrorScopeCompleted'],
   emwgpuDevicePopErrorScope__sig: 'vpj',
   emwgpuDevicePopErrorScope: (devicePtr, futureId) => {