From fade3136ba430eebd029f5f5856e5156a33f926c Mon Sep 17 00:00:00 2001 From: Kenta Moriuchi Date: Wed, 7 Aug 2024 18:17:33 +0900 Subject: [PATCH] fix(webgpu): Fix `GPUAdapter#isFallbackAdapter` and `GPUAdapter#info` properties (#24914) Fixed `GPUAdapter` bugs: * `GPUAdapter#isFallbackAdapter` being `undefined` * `GPUAdapter#info` throwing `TypeError` * introduced by #24783 * `GPUAdapter#info` closing adapter resources * introduced by #23752 --- ext/webgpu/01_webgpu.js | 25 ++++++++++++++----------- ext/webgpu/lib.rs | 13 +++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ext/webgpu/01_webgpu.js b/ext/webgpu/01_webgpu.js index 2c30e47f02..36b35072c6 100644 --- a/ext/webgpu/01_webgpu.js +++ b/ext/webgpu/01_webgpu.js @@ -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 { diff --git a/ext/webgpu/lib.rs b/ext/webgpu/lib.rs index 8a423fd00c..df01c5ff97 100644 --- a/ext/webgpu/lib.rs +++ b/ext/webgpu/lib.rs @@ -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>, #[smi] adapter_rid: ResourceId, ) -> Result { - let mut state = state.borrow_mut(); + let state = state.borrow_mut(); let adapter_resource = - state.resource_table.take::(adapter_rid)?; + state.resource_table.get::(adapter_rid)?; let adapter = adapter_resource.1; let instance = state.borrow::(); let info = gfx_select!(adapter => instance.adapter_get_info(adapter))?; - adapter_resource.close(); Ok(GPUAdapterInfo { vendor: info.vendor.to_string(),