Skip to content

Commit 5735f85

Browse files
authored
CreateBindGroup validation error on device mismatch (#5596)
* Fix cts_runner command invocation in readme * Remove assertDeviceMatch from deno_webgpu in createBindGroup This should be done as verification in wgpu-core. * Add device mismatched check to create_buffer_binding * Extract common logic to create_sampler_binding * Move common logic to create_texture_binding and add device mismatch check
1 parent 18ceb51 commit 5735f85

File tree

3 files changed

+116
-106
lines changed

3 files changed

+116
-106
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ To run a given set of tests:
199199

200200
```
201201
# Must be inside the `cts` folder we just checked out, else this will fail
202-
cargo run --manifest-path ../Cargo.toml --bin cts_runner -- ./tools/run_deno --verbose "<test string>"
202+
cargo run --manifest-path ../Cargo.toml -p cts_runner --bin cts_runner -- ./tools/run_deno --verbose "<test string>"
203203
```
204204

205205
To find the full list of tests, go to the [online cts viewer](https://gpuweb.github.io/cts/standalone/?runnow=0&worker=0&debug=0&q=webgpu:*).

deno_webgpu/01_webgpu.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,11 +1289,6 @@ class GPUDevice extends EventTarget {
12891289
const resource = entry.resource;
12901290
if (ObjectPrototypeIsPrototypeOf(GPUSamplerPrototype, resource)) {
12911291
const rid = assertResource(resource, prefix, context);
1292-
assertDeviceMatch(device, resource, {
1293-
prefix,
1294-
resourceContext: context,
1295-
selfContext: "this",
1296-
});
12971292
return {
12981293
binding: entry.binding,
12991294
kind: "GPUSampler",
@@ -1304,11 +1299,6 @@ class GPUDevice extends EventTarget {
13041299
) {
13051300
const rid = assertResource(resource, prefix, context);
13061301
assertResource(resource[_texture], prefix, context);
1307-
assertDeviceMatch(device, resource[_texture], {
1308-
prefix,
1309-
resourceContext: context,
1310-
selfContext: "this",
1311-
});
13121302
return {
13131303
binding: entry.binding,
13141304
kind: "GPUTextureView",
@@ -1318,11 +1308,6 @@ class GPUDevice extends EventTarget {
13181308
// deno-lint-ignore prefer-primordials
13191309
const rid = assertResource(resource.buffer, prefix, context);
13201310
// deno-lint-ignore prefer-primordials
1321-
assertDeviceMatch(device, resource.buffer, {
1322-
prefix,
1323-
resourceContext: context,
1324-
selfContext: "this",
1325-
});
13261311
return {
13271312
binding: entry.binding,
13281313
kind: "GPUBufferBinding",

wgpu-core/src/device/resource.rs

Lines changed: 115 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::{
1313
hal_api::HalApi,
1414
hal_label,
1515
hub::Hub,
16+
id,
1617
init_tracker::{
1718
BufferInitTracker, BufferInitTrackerAction, MemoryInitKind, TextureInitRange,
1819
TextureInitTracker, TextureInitTrackerAction,
@@ -1949,6 +1950,7 @@ impl<A: HalApi> Device<A> {
19491950
used: &mut BindGroupStates<A>,
19501951
storage: &'a Storage<Buffer<A>>,
19511952
limits: &wgt::Limits,
1953+
device_id: id::Id<id::markers::Device>,
19521954
snatch_guard: &'a SnatchGuard<'a>,
19531955
) -> Result<hal::BufferBinding<'a, A>, binding_model::CreateBindGroupError> {
19541956
use crate::binding_model::CreateBindGroupError as Error;
@@ -1967,6 +1969,7 @@ impl<A: HalApi> Device<A> {
19671969
})
19681970
}
19691971
};
1972+
19701973
let (pub_usage, internal_use, range_limit) = match binding_ty {
19711974
wgt::BufferBindingType::Uniform => (
19721975
wgt::BufferUsages::UNIFORM,
@@ -1999,6 +2002,10 @@ impl<A: HalApi> Device<A> {
19992002
.add_single(storage, bb.buffer_id, internal_use)
20002003
.ok_or(Error::InvalidBuffer(bb.buffer_id))?;
20012004

2005+
if buffer.device.as_info().id() != device_id {
2006+
return Err(DeviceError::WrongDevice.into());
2007+
}
2008+
20022009
check_buffer_usage(bb.buffer_id, buffer.usage, pub_usage)?;
20032010
let raw_buffer = buffer
20042011
.raw
@@ -2077,13 +2084,53 @@ impl<A: HalApi> Device<A> {
20772084
})
20782085
}
20792086

2080-
pub(crate) fn create_texture_binding(
2081-
view: &TextureView<A>,
2082-
internal_use: hal::TextureUses,
2083-
pub_usage: wgt::TextureUsages,
2087+
fn create_sampler_binding<'a>(
2088+
used: &BindGroupStates<A>,
2089+
storage: &'a Storage<Sampler<A>>,
2090+
id: id::Id<id::markers::Sampler>,
2091+
device_id: id::Id<id::markers::Device>,
2092+
) -> Result<&'a Sampler<A>, binding_model::CreateBindGroupError> {
2093+
use crate::binding_model::CreateBindGroupError as Error;
2094+
2095+
let sampler = used
2096+
.samplers
2097+
.add_single(storage, id)
2098+
.ok_or(Error::InvalidSampler(id))?;
2099+
2100+
if sampler.device.as_info().id() != device_id {
2101+
return Err(DeviceError::WrongDevice.into());
2102+
}
2103+
2104+
Ok(sampler)
2105+
}
2106+
2107+
pub(crate) fn create_texture_binding<'a>(
2108+
self: &Arc<Self>,
2109+
binding: u32,
2110+
decl: &wgt::BindGroupLayoutEntry,
2111+
storage: &'a Storage<TextureView<A>>,
2112+
id: id::Id<id::markers::TextureView>,
20842113
used: &mut BindGroupStates<A>,
20852114
used_texture_ranges: &mut Vec<TextureInitTrackerAction<A>>,
2086-
) -> Result<(), binding_model::CreateBindGroupError> {
2115+
snatch_guard: &'a SnatchGuard<'a>,
2116+
) -> Result<hal::TextureBinding<'a, A>, binding_model::CreateBindGroupError> {
2117+
use crate::binding_model::CreateBindGroupError as Error;
2118+
2119+
let view = used
2120+
.views
2121+
.add_single(storage, id)
2122+
.ok_or(Error::InvalidTextureView(id))?;
2123+
2124+
if view.device.as_info().id() != self.as_info().id() {
2125+
return Err(DeviceError::WrongDevice.into());
2126+
}
2127+
2128+
let (pub_usage, internal_use) = self.texture_use_parameters(
2129+
binding,
2130+
decl,
2131+
view,
2132+
"SampledTexture, ReadonlyStorageTexture or WriteonlyStorageTexture",
2133+
)?;
20872134
let texture = &view.parent;
20882135
let texture_id = texture.as_info().id();
20892136
// Careful here: the texture may no longer have its own ref count,
@@ -2113,7 +2160,12 @@ impl<A: HalApi> Device<A> {
21132160
kind: MemoryInitKind::NeedsInitializedMemory,
21142161
});
21152162

2116-
Ok(())
2163+
Ok(hal::TextureBinding {
2164+
view: view
2165+
.raw(snatch_guard)
2166+
.ok_or(Error::InvalidTextureView(id))?,
2167+
usage: internal_use,
2168+
})
21172169
}
21182170

21192171
// This function expects the provided bind group layout to be resolved
@@ -2175,6 +2227,7 @@ impl<A: HalApi> Device<A> {
21752227
&mut used,
21762228
&*buffer_guard,
21772229
&self.limits,
2230+
self.as_info().id(),
21782231
&snatch_guard,
21792232
)?;
21802233

@@ -2198,105 +2251,86 @@ impl<A: HalApi> Device<A> {
21982251
&mut used,
21992252
&*buffer_guard,
22002253
&self.limits,
2254+
self.as_info().id(),
22012255
&snatch_guard,
22022256
)?;
22032257
hal_buffers.push(bb);
22042258
}
22052259
(res_index, num_bindings)
22062260
}
2207-
Br::Sampler(id) => {
2208-
match decl.ty {
2209-
wgt::BindingType::Sampler(ty) => {
2210-
let sampler = used
2211-
.samplers
2212-
.add_single(&*sampler_guard, id)
2213-
.ok_or(Error::InvalidSampler(id))?;
2214-
2215-
if sampler.device.as_info().id() != self.as_info().id() {
2216-
return Err(DeviceError::WrongDevice.into());
2217-
}
2218-
2219-
// Allowed sampler values for filtering and comparison
2220-
let (allowed_filtering, allowed_comparison) = match ty {
2221-
wgt::SamplerBindingType::Filtering => (None, false),
2222-
wgt::SamplerBindingType::NonFiltering => (Some(false), false),
2223-
wgt::SamplerBindingType::Comparison => (None, true),
2224-
};
2225-
2226-
if let Some(allowed_filtering) = allowed_filtering {
2227-
if allowed_filtering != sampler.filtering {
2228-
return Err(Error::WrongSamplerFiltering {
2229-
binding,
2230-
layout_flt: allowed_filtering,
2231-
sampler_flt: sampler.filtering,
2232-
});
2233-
}
2234-
}
2261+
Br::Sampler(id) => match decl.ty {
2262+
wgt::BindingType::Sampler(ty) => {
2263+
let sampler = Self::create_sampler_binding(
2264+
&used,
2265+
&sampler_guard,
2266+
id,
2267+
self.as_info().id(),
2268+
)?;
22352269

2236-
if allowed_comparison != sampler.comparison {
2237-
return Err(Error::WrongSamplerComparison {
2270+
let (allowed_filtering, allowed_comparison) = match ty {
2271+
wgt::SamplerBindingType::Filtering => (None, false),
2272+
wgt::SamplerBindingType::NonFiltering => (Some(false), false),
2273+
wgt::SamplerBindingType::Comparison => (None, true),
2274+
};
2275+
if let Some(allowed_filtering) = allowed_filtering {
2276+
if allowed_filtering != sampler.filtering {
2277+
return Err(Error::WrongSamplerFiltering {
22382278
binding,
2239-
layout_cmp: allowed_comparison,
2240-
sampler_cmp: sampler.comparison,
2279+
layout_flt: allowed_filtering,
2280+
sampler_flt: sampler.filtering,
22412281
});
22422282
}
2243-
2244-
let res_index = hal_samplers.len();
2245-
hal_samplers.push(sampler.raw());
2246-
(res_index, 1)
22472283
}
2248-
_ => {
2249-
return Err(Error::WrongBindingType {
2284+
if allowed_comparison != sampler.comparison {
2285+
return Err(Error::WrongSamplerComparison {
22502286
binding,
2251-
actual: decl.ty,
2252-
expected: "Sampler",
2253-
})
2287+
layout_cmp: allowed_comparison,
2288+
sampler_cmp: sampler.comparison,
2289+
});
22542290
}
2291+
2292+
let res_index = hal_samplers.len();
2293+
hal_samplers.push(sampler.raw());
2294+
(res_index, 1)
22552295
}
2256-
}
2296+
_ => {
2297+
return Err(Error::WrongBindingType {
2298+
binding,
2299+
actual: decl.ty,
2300+
expected: "Sampler",
2301+
})
2302+
}
2303+
},
22572304
Br::SamplerArray(ref bindings_array) => {
22582305
let num_bindings = bindings_array.len();
22592306
Self::check_array_binding(self.features, decl.count, num_bindings)?;
22602307

22612308
let res_index = hal_samplers.len();
22622309
for &id in bindings_array.iter() {
2263-
let sampler = used
2264-
.samplers
2265-
.add_single(&*sampler_guard, id)
2266-
.ok_or(Error::InvalidSampler(id))?;
2267-
if sampler.device.as_info().id() != self.as_info().id() {
2268-
return Err(DeviceError::WrongDevice.into());
2269-
}
2310+
let sampler = Self::create_sampler_binding(
2311+
&used,
2312+
&sampler_guard,
2313+
id,
2314+
self.as_info().id(),
2315+
)?;
2316+
22702317
hal_samplers.push(sampler.raw());
22712318
}
22722319

22732320
(res_index, num_bindings)
22742321
}
22752322
Br::TextureView(id) => {
2276-
let view = used
2277-
.views
2278-
.add_single(&*texture_view_guard, id)
2279-
.ok_or(Error::InvalidTextureView(id))?;
2280-
let (pub_usage, internal_use) = self.texture_use_parameters(
2323+
let tb = self.create_texture_binding(
22812324
binding,
22822325
decl,
2283-
view,
2284-
"SampledTexture, ReadonlyStorageTexture or WriteonlyStorageTexture",
2285-
)?;
2286-
Self::create_texture_binding(
2287-
view,
2288-
internal_use,
2289-
pub_usage,
2326+
&texture_view_guard,
2327+
id,
22902328
&mut used,
22912329
&mut used_texture_ranges,
2330+
&snatch_guard,
22922331
)?;
22932332
let res_index = hal_textures.len();
2294-
hal_textures.push(hal::TextureBinding {
2295-
view: view
2296-
.raw(&snatch_guard)
2297-
.ok_or(Error::InvalidTextureView(id))?,
2298-
usage: internal_use,
2299-
});
2333+
hal_textures.push(tb);
23002334
(res_index, 1)
23012335
}
23022336
Br::TextureViewArray(ref bindings_array) => {
@@ -2305,26 +2339,17 @@ impl<A: HalApi> Device<A> {
23052339

23062340
let res_index = hal_textures.len();
23072341
for &id in bindings_array.iter() {
2308-
let view = used
2309-
.views
2310-
.add_single(&*texture_view_guard, id)
2311-
.ok_or(Error::InvalidTextureView(id))?;
2312-
let (pub_usage, internal_use) =
2313-
self.texture_use_parameters(binding, decl, view,
2314-
"SampledTextureArray, ReadonlyStorageTextureArray or WriteonlyStorageTextureArray")?;
2315-
Self::create_texture_binding(
2316-
view,
2317-
internal_use,
2318-
pub_usage,
2342+
let tb = self.create_texture_binding(
2343+
binding,
2344+
decl,
2345+
&texture_view_guard,
2346+
id,
23192347
&mut used,
23202348
&mut used_texture_ranges,
2349+
&snatch_guard,
23212350
)?;
2322-
hal_textures.push(hal::TextureBinding {
2323-
view: view
2324-
.raw(&snatch_guard)
2325-
.ok_or(Error::InvalidTextureView(id))?,
2326-
usage: internal_use,
2327-
});
2351+
2352+
hal_textures.push(tb);
23282353
}
23292354

23302355
(res_index, num_bindings)

0 commit comments

Comments
 (0)