Repository: denoland/deno
Pull request: fix(webgpu): Fix `GPUAdapter#isFallbackAdapter` and `GPUAdapter#info` properties

<!--
Before submitting a PR, please read https://docs.deno.com/runtime/manual/references/contributing

1. Give the PR a descriptive title.

  Examples of good title:
    - fix(std/http): Fix race condition in server
    - docs(console): Update docstrings
    - feat(doc): Handle nested reexports

  Examples of bad title:
    - fix #7123
    - update docs
    - fix bugs

2. Ensure there is a related issue and it is referenced in the PR text.
3. Ensure there are tests that cover the changes.
4. Ensure `cargo test` passes.
5. Ensure `./tools/format.js` passes without changing files.
6. Ensure `./tools/lint.js` passes.
7. Open as a draft PR if your work is still in progress. The CI won't run
   all steps, but you can add '[ci]' to a commit message to force it to.
8. If you would like to run the benchmarks on the CI, add the 'ci-bench' label.
-->

Fixed `GPUAdapter` bugs:

* `GPUAdapter#isFallbackAdapter` being `undefined`
* `GPUAdapter#info` throwing `TypeError`
  * introduced by #24783
* `GPUAdapter#info` closing adapter resources
  * introduced by #23752


Changed files:
filename: ext/webgpu/01_webgpu.js
patch: @@ -137,6 +137,8 @@ const _mappingRange = Symbol("[[mapping_range]]");
 const _mappedRanges = Symbol("[[mapped_ranges]]");
 const _mapMode = Symbol("[[map_mode]]");
 const _adapter = Symbol("[[adapter]]");
+const _adapterInfo = Symbol("[[adapterInfo]]");
+const _invalid = Symbol("[[invalid]]");
 const _cleanup = Symbol("[[cleanup]]");
 const _vendor = Symbol("[[vendor]]");
 const _architecture = Symbol("[[architecture]]");
@@ -414,17 +416,18 @@ function createGPUAdapter(inner) {
     features: createGPUSupportedFeatures(inner.features),
     limits: createGPUSupportedLimits(inner.limits),
   };
+  adapter[_adapterInfo] = undefined;
+  adapter[_invalid] = false;
   return adapter;
 }
 
-const _invalid = Symbol("[[invalid]]");
 class GPUAdapter {
   /** @type {InnerGPUAdapter} */
   [_adapter];
-  /** @type {bool} */
-  [_invalid];
   /** @type {GPUAdapterInfo | undefined} */
-  #adapterInfo;
+  [_adapterInfo];
+  /** @type {boolean} */
+  [_invalid];
 
   /** @returns {GPUSupportedFeatures} */
   get features() {
@@ -439,7 +442,7 @@ class GPUAdapter {
   /** @returns {boolean} */
   get isFallbackAdapter() {
     webidl.assertBranded(this, GPUAdapterPrototype);
-    return this[_adapter].isFallbackAdapter;
+    return this[_adapter].isFallback;
   }
 
   constructor() {
@@ -509,16 +512,16 @@ class GPUAdapter {
   get info() {
     webidl.assertBranded(this, GPUAdapterPrototype);
 
+    if (this[_adapterInfo] !== undefined) {
+      return this[_adapterInfo];
+    }
+
     if (this[_invalid]) {
       throw new TypeError(
         "The adapter cannot be reused, as it has been invalidated by a device creation",
       );
     }
 
-    if (this.#adapterInfo !== undefined) {
-      return this.#adapterInfo;
-    }
-
     const {
       vendor,
       architecture,
@@ -531,7 +534,7 @@ class GPUAdapter {
     adapterInfo[_architecture] = architecture;
     adapterInfo[_device] = device;
     adapterInfo[_description] = description;
-    this.#adapterInfo = adapterInfo;
+    this[_adapterInfo] = adapterInfo;
     return adapterInfo;
   }
 
@@ -543,6 +546,7 @@ class GPUAdapter {
         keys: [
           "features",
           "limits",
+          "info",
           "isFallbackAdapter",
         ],
       }),
@@ -937,7 +941,6 @@ function GPUObjectBaseMixin(name, type) {
  * @property {number | undefined} rid
  * @property {GPUSupportedFeatures} features
  * @property {GPUSupportedLimits} limits
- * @property {GPUDevice} device
  */
 
 class InnerGPUDevice {

filename: ext/webgpu/lib.rs
patch: @@ -382,7 +382,7 @@ pub struct GpuAdapterRes {
   rid: ResourceId,
   limits: wgpu_types::Limits,
   features: Vec<&'static str>,
-  is_software: bool,
+  is_fallback: bool,
 }
 
 #[derive(Serialize)]
@@ -392,7 +392,6 @@ pub struct GpuDeviceRes {
   queue_rid: ResourceId,
   limits: wgpu_types::Limits,
   features: Vec<&'static str>,
-  is_software: bool,
 }
 
 #[op2]
@@ -462,7 +461,8 @@ pub fn op_webgpu_request_adapter(
     rid,
     features,
     limits: adapter_limits,
-    is_software: false,
+    // TODO(lucacasonato): report correctly from wgpu
+    is_fallback: false,
   }))
 }
 
@@ -712,8 +712,6 @@ pub fn op_webgpu_request_device(
     queue_rid,
     features,
     limits,
-    // TODO(lucacasonato): report correctly from wgpu
-    is_software: false,
   })
 }
 
@@ -732,14 +730,13 @@ pub fn op_webgpu_request_adapter_info(
   state: Rc<RefCell<OpState>>,
   #[smi] adapter_rid: ResourceId,
 ) -> Result<GPUAdapterInfo, AnyError> {
-  let mut state = state.borrow_mut();
+  let state = state.borrow_mut();
   let adapter_resource =
-    state.resource_table.take::<WebGpuAdapter>(adapter_rid)?;
+    state.resource_table.get::<WebGpuAdapter>(adapter_rid)?;
   let adapter = adapter_resource.1;
   let instance = state.borrow::<Instance>();
 
   let info = gfx_select!(adapter => instance.adapter_get_info(adapter))?;
-  adapter_resource.close();
 
   Ok(GPUAdapterInfo {
     vendor: info.vendor.to_string(),