Auto merge of #27536 - kunalmohan:update-wgpu, r=kvark

Major fixes in error reporting in GPUCommandEncoder and ErrorScope Model

<!-- Please describe your changes on the following line: -->
1. Update wgpu to use the error model on wgpu-core side. Register error Ids separately.
2. ~~Record errors only in `GPUCommandEncoder.finish()`. Errors are no longer recorded in ErrorScopes in transfer commands or while recording passes. Any errors that occur are stored on the server-side in `error_command_encoders: HashMap<id::CommandEncoderId, String>` and reported on `CommandEncoderFinish`. Note: This should be reverted when the spec gets updated.~~
3. Correct a major flaw in ErrorScope Model. If multiple operations are issued inside scope and an early operation fails, the promise resolves and script execution continues. The scope, however, was not popped until the results of all its operations were received. This meant that if the user issues another operation, it was assumed to be issued in an error scope that has already been popped by the user, which led to the failure of a number of tests. This is solved by storing a `popped` boolean to check whether `popErrorScope()` has been called on a scope or not. Operation is now issued in the lastest scope for which `popped == false`.

One of the tests used to crash, but it no longer does (All subtests under it fail now). That explains the large number of failing test expectations that have been added. Most of them fail due to the tests being outdated. I'll switch to the updated branch in the next PR.

r?@kvark

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors

<!-- Either: -->
- [X] There are tests for these changes

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
bors-servo 2020-08-07 15:38:17 -04:00 committed by GitHub
commit 53467b80b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 1200 additions and 508 deletions

4
Cargo.lock generated
View file

@ -6945,7 +6945,7 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-core" name = "wgpu-core"
version = "0.5.0" version = "0.5.0"
source = "git+https://github.com/gfx-rs/wgpu#872a6c4c2bab5591838219c34e0cbf5fa9c2ec85" source = "git+https://github.com/gfx-rs/wgpu#8057acf120f9944056a6b5de6cf326f18ae7671d"
dependencies = [ dependencies = [
"arrayvec 0.5.1", "arrayvec 0.5.1",
"bitflags", "bitflags",
@ -6972,7 +6972,7 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-types" name = "wgpu-types"
version = "0.5.0" version = "0.5.0"
source = "git+https://github.com/gfx-rs/wgpu#872a6c4c2bab5591838219c34e0cbf5fa9c2ec85" source = "git+https://github.com/gfx-rs/wgpu#8057acf120f9944056a6b5de6cf326f18ae7671d"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"serde", "serde",

View file

@ -125,14 +125,32 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
&self, &self,
descriptor: &GPUComputePassDescriptor, descriptor: &GPUComputePassDescriptor,
) -> DomRoot<GPUComputePassEncoder> { ) -> DomRoot<GPUComputePassEncoder> {
let scope_id = self.device.use_current_scope();
self.set_state( self.set_state(
GPUCommandEncoderState::EncodingComputePass, GPUCommandEncoderState::EncodingComputePass,
GPUCommandEncoderState::Open, GPUCommandEncoderState::Open,
); );
let (compute_pass, res) = if !self.valid.get() {
(
None,
WebGPUOpResult::ValidationError(String::from(
"CommandEncoder is not in Open State",
)),
)
} else {
(
Some(wgpu_com::ComputePass::new(self.encoder.0)),
WebGPUOpResult::Success,
)
};
self.device.handle_server_msg(scope_id, res);
GPUComputePassEncoder::new( GPUComputePassEncoder::new(
&self.global(), &self.global(),
self.channel.clone(), self.channel.clone(),
&self, &self,
compute_pass,
descriptor.parent.label.as_ref().cloned(), descriptor.parent.label.as_ref().cloned(),
) )
} }
@ -142,102 +160,118 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
&self, &self,
descriptor: &GPURenderPassDescriptor, descriptor: &GPURenderPassDescriptor,
) -> DomRoot<GPURenderPassEncoder> { ) -> DomRoot<GPURenderPassEncoder> {
let scope_id = self.device.use_current_scope();
self.set_state( self.set_state(
GPUCommandEncoderState::EncodingRenderPass, GPUCommandEncoderState::EncodingRenderPass,
GPUCommandEncoderState::Open, GPUCommandEncoderState::Open,
); );
let depth_stencil = descriptor.depthStencilAttachment.as_ref().map(|depth| { let (render_pass, res) = if !self.valid.get() {
let (depth_load_op, clear_depth) = match depth.depthLoadValue { (
GPULoadOpOrFloat::GPULoadOp(_) => (wgpu_com::LoadOp::Load, 0.0f32), None,
GPULoadOpOrFloat::Float(f) => (wgpu_com::LoadOp::Clear, *f), WebGPUOpResult::ValidationError(String::from(
}; "CommandEncoder is not in Open State",
let (stencil_load_op, clear_stencil) = match depth.stencilLoadValue { )),
GPUStencilLoadValue::GPULoadOp(_) => (wgpu_com::LoadOp::Load, 0u32), )
GPUStencilLoadValue::RangeEnforcedUnsignedLong(l) => (wgpu_com::LoadOp::Clear, l), } else {
}; let depth_stencil = descriptor.depthStencilAttachment.as_ref().map(|depth| {
let depth_channel = wgpu_com::PassChannel { let (depth_load_op, clear_depth) = match depth.depthLoadValue {
load_op: depth_load_op, GPULoadOpOrFloat::GPULoadOp(_) => (wgpu_com::LoadOp::Load, 0.0f32),
store_op: match depth.depthStoreOp { GPULoadOpOrFloat::Float(f) => (wgpu_com::LoadOp::Clear, *f),
GPUStoreOp::Store => wgpu_com::StoreOp::Store, };
GPUStoreOp::Clear => wgpu_com::StoreOp::Clear, let (stencil_load_op, clear_stencil) = match depth.stencilLoadValue {
}, GPUStencilLoadValue::GPULoadOp(_) => (wgpu_com::LoadOp::Load, 0u32),
clear_value: clear_depth, GPUStencilLoadValue::RangeEnforcedUnsignedLong(l) => {
read_only: depth.depthReadOnly, (wgpu_com::LoadOp::Clear, l)
}; },
let stencil_channel = wgpu_com::PassChannel { };
load_op: stencil_load_op, let depth_channel = wgpu_com::PassChannel {
store_op: match depth.stencilStoreOp { load_op: depth_load_op,
GPUStoreOp::Store => wgpu_com::StoreOp::Store, store_op: match depth.depthStoreOp {
GPUStoreOp::Clear => wgpu_com::StoreOp::Clear, GPUStoreOp::Store => wgpu_com::StoreOp::Store,
}, GPUStoreOp::Clear => wgpu_com::StoreOp::Clear,
clear_value: clear_stencil, },
read_only: depth.stencilReadOnly, clear_value: clear_depth,
}; read_only: depth.depthReadOnly,
wgpu_com::DepthStencilAttachmentDescriptor { };
attachment: depth.attachment.id().0, let stencil_channel = wgpu_com::PassChannel {
depth: depth_channel, load_op: stencil_load_op,
stencil: stencil_channel, store_op: match depth.stencilStoreOp {
} GPUStoreOp::Store => wgpu_com::StoreOp::Store,
}); GPUStoreOp::Clear => wgpu_com::StoreOp::Clear,
},
clear_value: clear_stencil,
read_only: depth.stencilReadOnly,
};
wgpu_com::DepthStencilAttachmentDescriptor {
attachment: depth.attachment.id().0,
depth: depth_channel,
stencil: stencil_channel,
}
});
let desc = wgpu_com::RenderPassDescriptor { let desc = wgpu_com::RenderPassDescriptor {
color_attachments: Cow::Owned( color_attachments: Cow::Owned(
descriptor descriptor
.colorAttachments .colorAttachments
.iter() .iter()
.map(|color| { .map(|color| {
let (load_op, clear_value) = match color.loadValue { let (load_op, clear_value) = match color.loadValue {
GPUColorLoad::GPULoadOp(_) => { GPUColorLoad::GPULoadOp(_) => {
(wgpu_com::LoadOp::Load, wgt::Color::TRANSPARENT) (wgpu_com::LoadOp::Load, wgt::Color::TRANSPARENT)
}, },
GPUColorLoad::DoubleSequence(ref s) => { GPUColorLoad::DoubleSequence(ref s) => {
let mut w = s.clone(); let mut w = s.clone();
if w.len() < 3 { if w.len() < 3 {
w.resize(3, Finite::wrap(0.0f64)); w.resize(3, Finite::wrap(0.0f64));
} }
w.resize(4, Finite::wrap(1.0f64)); w.resize(4, Finite::wrap(1.0f64));
( (
wgpu_com::LoadOp::Clear,
wgt::Color {
r: *w[0],
g: *w[1],
b: *w[2],
a: *w[3],
},
)
},
GPUColorLoad::GPUColorDict(ref d) => (
wgpu_com::LoadOp::Clear, wgpu_com::LoadOp::Clear,
wgt::Color { wgt::Color {
r: *w[0], r: *d.r,
g: *w[1], g: *d.g,
b: *w[2], b: *d.b,
a: *w[3], a: *d.a,
}, },
) ),
}, };
GPUColorLoad::GPUColorDict(ref d) => ( let channel = wgpu_com::PassChannel {
wgpu_com::LoadOp::Clear, load_op,
wgt::Color { store_op: match color.storeOp {
r: *d.r, GPUStoreOp::Store => wgpu_com::StoreOp::Store,
g: *d.g, GPUStoreOp::Clear => wgpu_com::StoreOp::Clear,
b: *d.b,
a: *d.a,
}, },
), clear_value,
}; read_only: false,
let channel = wgpu_com::PassChannel { };
load_op, wgpu_com::ColorAttachmentDescriptor {
store_op: match color.storeOp { attachment: color.attachment.id().0,
GPUStoreOp::Store => wgpu_com::StoreOp::Store, resolve_target: color.resolveTarget.as_ref().map(|t| t.id().0),
GPUStoreOp::Clear => wgpu_com::StoreOp::Clear, channel,
}, }
clear_value, })
read_only: false, .collect::<Vec<_>>(),
}; ),
wgpu_com::ColorAttachmentDescriptor { depth_stencil_attachment: depth_stencil.as_ref(),
attachment: color.attachment.id().0, };
resolve_target: color.resolveTarget.as_ref().map(|t| t.id().0), (
channel, Some(wgpu_com::RenderPass::new(self.encoder.0, desc)),
} WebGPUOpResult::Success,
}) )
.collect::<Vec<_>>(),
),
depth_stencil_attachment: depth_stencil.as_ref(),
}; };
let render_pass = wgpu_com::RenderPass::new(self.encoder.0, desc); self.device.handle_server_msg(scope_id, res);
GPURenderPassEncoder::new( GPURenderPassEncoder::new(
&self.global(), &self.global(),
@ -257,10 +291,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
destination_offset: GPUSize64, destination_offset: GPUSize64,
size: GPUSize64, size: GPUSize64,
) { ) {
let valid = *self.state.borrow() == GPUCommandEncoderState::Open;
let scope_id = self.device.use_current_scope(); let scope_id = self.device.use_current_scope();
if !valid { if !(*self.state.borrow() == GPUCommandEncoderState::Open) {
self.device.handle_server_msg( self.device.handle_server_msg(
scope_id, scope_id,
WebGPUOpResult::ValidationError(String::from( WebGPUOpResult::ValidationError(String::from(
@ -299,10 +332,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
destination: &GPUTextureCopyView, destination: &GPUTextureCopyView,
copy_size: GPUExtent3D, copy_size: GPUExtent3D,
) { ) {
let valid = *self.state.borrow() == GPUCommandEncoderState::Open;
let scope_id = self.device.use_current_scope(); let scope_id = self.device.use_current_scope();
if !valid { if !(*self.state.borrow() == GPUCommandEncoderState::Open) {
self.device.handle_server_msg( self.device.handle_server_msg(
scope_id, scope_id,
WebGPUOpResult::ValidationError(String::from( WebGPUOpResult::ValidationError(String::from(
@ -341,10 +373,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
destination: &GPUBufferCopyView, destination: &GPUBufferCopyView,
copy_size: GPUExtent3D, copy_size: GPUExtent3D,
) { ) {
let valid = *self.state.borrow() == GPUCommandEncoderState::Open;
let scope_id = self.device.use_current_scope(); let scope_id = self.device.use_current_scope();
if !valid { if !(*self.state.borrow() == GPUCommandEncoderState::Open) {
self.device.handle_server_msg( self.device.handle_server_msg(
scope_id, scope_id,
WebGPUOpResult::ValidationError(String::from( WebGPUOpResult::ValidationError(String::from(
@ -383,10 +414,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
destination: &GPUTextureCopyView, destination: &GPUTextureCopyView,
copy_size: GPUExtent3D, copy_size: GPUExtent3D,
) { ) {
let valid = *self.state.borrow() == GPUCommandEncoderState::Open;
let scope_id = self.device.use_current_scope(); let scope_id = self.device.use_current_scope();
if !valid { if !(*self.state.borrow() == GPUCommandEncoderState::Open) {
self.device.handle_server_msg( self.device.handle_server_msg(
scope_id, scope_id,
WebGPUOpResult::ValidationError(String::from( WebGPUOpResult::ValidationError(String::from(
@ -423,6 +453,7 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
WebGPURequest::CommandEncoderFinish { WebGPURequest::CommandEncoderFinish {
command_encoder_id: self.encoder.0, command_encoder_id: self.encoder.0,
device_id: self.device.id().0, device_id: self.device.id().0,
is_error: !self.valid.get(),
// TODO(zakorgy): We should use `_descriptor` here after it's not empty // TODO(zakorgy): We should use `_descriptor` here after it's not empty
// and the underlying wgpu-core struct is serializable // and the underlying wgpu-core struct is serializable
}, },

View file

@ -33,13 +33,14 @@ impl GPUComputePassEncoder {
fn new_inherited( fn new_inherited(
channel: WebGPU, channel: WebGPU,
parent: &GPUCommandEncoder, parent: &GPUCommandEncoder,
compute_pass: Option<ComputePass>,
label: Option<USVString>, label: Option<USVString>,
) -> Self { ) -> Self {
Self { Self {
channel, channel,
reflector_: Reflector::new(), reflector_: Reflector::new(),
label: DomRefCell::new(label), label: DomRefCell::new(label),
compute_pass: DomRefCell::new(Some(ComputePass::new(parent.id().0))), compute_pass: DomRefCell::new(compute_pass),
command_encoder: Dom::from_ref(parent), command_encoder: Dom::from_ref(parent),
} }
} }
@ -48,10 +49,16 @@ impl GPUComputePassEncoder {
global: &GlobalScope, global: &GlobalScope,
channel: WebGPU, channel: WebGPU,
parent: &GPUCommandEncoder, parent: &GPUCommandEncoder,
compute_pass: Option<ComputePass>,
label: Option<USVString>, label: Option<USVString>,
) -> DomRoot<Self> { ) -> DomRoot<Self> {
reflect_dom_object( reflect_dom_object(
Box::new(GPUComputePassEncoder::new_inherited(channel, parent, label)), Box::new(GPUComputePassEncoder::new_inherited(
channel,
parent,
compute_pass,
label,
)),
global, global,
) )
} }
@ -88,24 +95,23 @@ impl GPUComputePassEncoderMethods for GPUComputePassEncoder {
/// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-endpass /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-endpass
fn EndPass(&self) { fn EndPass(&self) {
if let Some(compute_pass) = self.compute_pass.borrow_mut().take() { let compute_pass = self.compute_pass.borrow_mut().take();
self.channel self.channel
.0 .0
.send(( .send((
self.command_encoder.device().use_current_scope(), self.command_encoder.device().use_current_scope(),
WebGPURequest::RunComputePass { WebGPURequest::RunComputePass {
command_encoder_id: self.command_encoder.id().0, command_encoder_id: self.command_encoder.id().0,
device_id: self.command_encoder.device().id().0, device_id: self.command_encoder.device().id().0,
compute_pass, compute_pass,
}, },
)) ))
.expect("Failed to send RunComputePass"); .expect("Failed to send RunComputePass");
self.command_encoder.set_state( self.command_encoder.set_state(
GPUCommandEncoderState::Open, GPUCommandEncoderState::Open,
GPUCommandEncoderState::EncodingComputePass, GPUCommandEncoderState::EncodingComputePass,
); );
}
} }
/// https://gpuweb.github.io/gpuweb/#dom-gpuprogrammablepassencoder-setbindgroup /// https://gpuweb.github.io/gpuweb/#dom-gpuprogrammablepassencoder-setbindgroup

View file

@ -64,7 +64,7 @@ use crate::script_runtime::JSContext as SafeJSContext;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use js::jsapi::{Heap, JSObject}; use js::jsapi::{Heap, JSObject};
use std::borrow::Cow; use std::borrow::Cow;
use std::cell::RefCell; use std::cell::{Cell, RefCell};
use std::collections::HashMap; use std::collections::HashMap;
use std::ptr::NonNull; use std::ptr::NonNull;
use std::rc::Rc; use std::rc::Rc;
@ -82,10 +82,17 @@ struct ErrorScopeInfo {
promise: Option<Rc<Promise>>, promise: Option<Rc<Promise>>,
} }
#[derive(JSTraceable, MallocSizeOf)]
struct ErrorScopeMetadata {
id: ErrorScopeId,
filter: GPUErrorFilter,
popped: Cell<bool>,
}
#[derive(JSTraceable, MallocSizeOf)] #[derive(JSTraceable, MallocSizeOf)]
struct ScopeContext { struct ScopeContext {
error_scopes: HashMap<ErrorScopeId, ErrorScopeInfo>, error_scopes: HashMap<ErrorScopeId, ErrorScopeInfo>,
scope_stack: Vec<(ErrorScopeId, GPUErrorFilter)>, scope_stack: Vec<ErrorScopeMetadata>,
next_scope_id: ErrorScopeId, next_scope_id: ErrorScopeId,
} }
@ -189,8 +196,8 @@ impl GPUDevice {
.scope_stack .scope_stack
.iter() .iter()
.rev() .rev()
.find(|&&(id, fil)| id <= s_id && fil == filter) .find(|meta| meta.id <= s_id && meta.filter == filter)
.map(|(id, _)| *id); .map(|meta| meta.id);
if let Some(s) = scop { if let Some(s) = scop {
self.handle_error(s, err); self.handle_error(s, err);
} else { } else {
@ -237,14 +244,19 @@ impl GPUDevice {
}; };
if remove { if remove {
let _ = context.error_scopes.remove(&scope); let _ = context.error_scopes.remove(&scope);
context.scope_stack.retain(|(id, _)| *id != scope); context.scope_stack.retain(|meta| meta.id != scope);
} }
} }
pub fn use_current_scope(&self) -> Option<ErrorScopeId> { pub fn use_current_scope(&self) -> Option<ErrorScopeId> {
let mut context = self.scope_context.borrow_mut(); let mut context = self.scope_context.borrow_mut();
let scope_id = context.scope_stack.last().copied(); let scope_id = context
scope_id.and_then(|(s_id, _)| { .scope_stack
.iter()
.rev()
.find(|meta| !meta.popped.get())
.map(|meta| meta.id);
scope_id.and_then(|s_id| {
context.error_scopes.get_mut(&s_id).map(|mut scope| { context.error_scopes.get_mut(&s_id).map(|mut scope| {
scope.op_count += 1; scope.op_count += 1;
s_id s_id
@ -293,15 +305,12 @@ impl GPUDeviceMethods for GPUDevice {
/// https://gpuweb.github.io/gpuweb/#dom-gpudevice-createbuffer /// https://gpuweb.github.io/gpuweb/#dom-gpudevice-createbuffer
fn CreateBuffer(&self, descriptor: &GPUBufferDescriptor) -> DomRoot<GPUBuffer> { fn CreateBuffer(&self, descriptor: &GPUBufferDescriptor) -> DomRoot<GPUBuffer> {
let wgpu_descriptor = wgt::BufferDescriptor { let desc = wgt::BufferUsage::from_bits(descriptor.usage).map(|usg| wgt::BufferDescriptor {
label: descriptor.parent.label.as_ref().map(|s| s.to_string()), label: descriptor.parent.label.as_ref().map(|s| s.to_string()),
size: descriptor.size, size: descriptor.size,
usage: match wgt::BufferUsage::from_bits(descriptor.usage) { usage: usg,
Some(u) => u,
None => wgt::BufferUsage::empty(),
},
mapped_at_creation: descriptor.mappedAtCreation, mapped_at_creation: descriptor.mappedAtCreation,
}; });
let id = self let id = self
.global() .global()
.wgpu_id_hub() .wgpu_id_hub()
@ -309,6 +318,13 @@ impl GPUDeviceMethods for GPUDevice {
.create_buffer_id(self.device.0.backend()); .create_buffer_id(self.device.0.backend());
let scope_id = self.use_current_scope(); let scope_id = self.use_current_scope();
if desc.is_none() {
self.handle_server_msg(
scope_id,
WebGPUOpResult::ValidationError(String::from("Invalid GPUBufferUsage")),
);
}
self.channel self.channel
.0 .0
.send(( .send((
@ -316,7 +332,7 @@ impl GPUDeviceMethods for GPUDevice {
WebGPURequest::CreateBuffer { WebGPURequest::CreateBuffer {
device_id: self.device.0, device_id: self.device.0,
buffer_id: id, buffer_id: id,
descriptor: wgpu_descriptor, descriptor: desc,
}, },
)) ))
.expect("Failed to create WebGPU buffer"); .expect("Failed to create WebGPU buffer");
@ -357,13 +373,17 @@ impl GPUDeviceMethods for GPUDevice {
&self, &self,
descriptor: &GPUBindGroupLayoutDescriptor, descriptor: &GPUBindGroupLayoutDescriptor,
) -> DomRoot<GPUBindGroupLayout> { ) -> DomRoot<GPUBindGroupLayout> {
let mut valid = true;
let entries = descriptor let entries = descriptor
.entries .entries
.iter() .iter()
.map(|bind| { .map(|bind| {
let visibility = match wgt::ShaderStage::from_bits(bind.visibility) { let visibility = match wgt::ShaderStage::from_bits(bind.visibility) {
Some(visibility) => visibility, Some(visibility) => visibility,
None => wgt::ShaderStage::from_bits(0).unwrap(), None => {
valid = false;
wgt::ShaderStage::empty()
},
}; };
let ty = match bind.type_ { let ty = match bind.type_ {
GPUBindingType::Uniform_buffer => wgt::BindingType::UniformBuffer { GPUBindingType::Uniform_buffer => wgt::BindingType::UniformBuffer {
@ -435,13 +455,21 @@ impl GPUDeviceMethods for GPUDevice {
let scope_id = self.use_current_scope(); let scope_id = self.use_current_scope();
let desc = wgt::BindGroupLayoutDescriptor { let desc = if valid {
label: descriptor Some(wgt::BindGroupLayoutDescriptor {
.parent label: descriptor
.label .parent
.as_ref() .label
.map(|s| Cow::Owned(s.to_string())), .as_ref()
entries: Cow::Owned(entries), .map(|s| Cow::Owned(s.to_string())),
entries: Cow::Owned(entries),
})
} else {
self.handle_server_msg(
scope_id,
WebGPUOpResult::ValidationError(String::from("Invalid GPUShaderStage")),
);
None
}; };
let bind_group_layout_id = self let bind_group_layout_id = self
@ -695,22 +723,20 @@ impl GPUDeviceMethods for GPUDevice {
/// https://gpuweb.github.io/gpuweb/#dom-gpudevice-createtexture /// https://gpuweb.github.io/gpuweb/#dom-gpudevice-createtexture
fn CreateTexture(&self, descriptor: &GPUTextureDescriptor) -> DomRoot<GPUTexture> { fn CreateTexture(&self, descriptor: &GPUTextureDescriptor) -> DomRoot<GPUTexture> {
let size = convert_texture_size_to_dict(&descriptor.size); let size = convert_texture_size_to_dict(&descriptor.size);
let desc = wgt::TextureDescriptor { let desc =
label: descriptor.parent.label.as_ref().map(|s| s.to_string()), wgt::TextureUsage::from_bits(descriptor.usage).map(|usg| wgt::TextureDescriptor {
size: convert_texture_size_to_wgt(&size), label: descriptor.parent.label.as_ref().map(|s| s.to_string()),
mip_level_count: descriptor.mipLevelCount, size: convert_texture_size_to_wgt(&size),
sample_count: descriptor.sampleCount, mip_level_count: descriptor.mipLevelCount,
dimension: match descriptor.dimension { sample_count: descriptor.sampleCount,
GPUTextureDimension::_1d => wgt::TextureDimension::D1, dimension: match descriptor.dimension {
GPUTextureDimension::_2d => wgt::TextureDimension::D2, GPUTextureDimension::_1d => wgt::TextureDimension::D1,
GPUTextureDimension::_3d => wgt::TextureDimension::D3, GPUTextureDimension::_2d => wgt::TextureDimension::D2,
}, GPUTextureDimension::_3d => wgt::TextureDimension::D3,
format: convert_texture_format(descriptor.format), },
usage: match wgt::TextureUsage::from_bits(descriptor.usage) { format: convert_texture_format(descriptor.format),
Some(t) => t, usage: usg,
None => wgt::TextureUsage::empty(), });
},
};
let texture_id = self let texture_id = self
.global() .global()
@ -719,7 +745,12 @@ impl GPUDeviceMethods for GPUDevice {
.create_texture_id(self.device.0.backend()); .create_texture_id(self.device.0.backend());
let scope_id = self.use_current_scope(); let scope_id = self.use_current_scope();
if desc.is_none() {
self.handle_server_msg(
scope_id,
WebGPUOpResult::ValidationError(String::from("Invalid GPUTextureUsage")),
);
}
self.channel self.channel
.0 .0
.send(( .send((
@ -803,110 +834,124 @@ impl GPUDeviceMethods for GPUDevice {
) -> DomRoot<GPURenderPipeline> { ) -> DomRoot<GPURenderPipeline> {
let ref rs_desc = descriptor.rasterizationState; let ref rs_desc = descriptor.rasterizationState;
let ref vs_desc = descriptor.vertexState; let ref vs_desc = descriptor.vertexState;
let scope_id = self.use_current_scope();
let desc = wgpu_pipe::RenderPipelineDescriptor { let mut valid = true;
layout: descriptor.parent.layout.id().0, let color_states = Cow::Owned(
vertex_stage: wgpu_pipe::ProgrammableStageDescriptor { descriptor
module: descriptor.vertexStage.module.id().0, .colorStates
entry_point: Cow::Owned(descriptor.vertexStage.entryPoint.to_string()), .iter()
}, .map(|state| wgt::ColorStateDescriptor {
fragment_stage: descriptor.fragmentStage.as_ref().map(|stage| { format: convert_texture_format(state.format),
wgpu_pipe::ProgrammableStageDescriptor { alpha_blend: convert_blend_descriptor(&state.alphaBlend),
module: stage.module.id().0, color_blend: convert_blend_descriptor(&state.colorBlend),
entry_point: Cow::Owned(stage.entryPoint.to_string()), write_mask: match wgt::ColorWrite::from_bits(state.writeMask) {
} Some(mask) => mask,
}), None => {
rasterization_state: Some(wgt::RasterizationStateDescriptor { valid = false;
front_face: match rs_desc.frontFace { wgt::ColorWrite::empty()
GPUFrontFace::Ccw => wgt::FrontFace::Ccw,
GPUFrontFace::Cw => wgt::FrontFace::Cw,
},
cull_mode: match rs_desc.cullMode {
GPUCullMode::None => wgt::CullMode::None,
GPUCullMode::Front => wgt::CullMode::Front,
GPUCullMode::Back => wgt::CullMode::Back,
},
clamp_depth: rs_desc.clampDepth,
depth_bias: rs_desc.depthBias,
depth_bias_slope_scale: *rs_desc.depthBiasSlopeScale,
depth_bias_clamp: *rs_desc.depthBiasClamp,
}),
primitive_topology: match descriptor.primitiveTopology {
GPUPrimitiveTopology::Point_list => wgt::PrimitiveTopology::PointList,
GPUPrimitiveTopology::Line_list => wgt::PrimitiveTopology::LineList,
GPUPrimitiveTopology::Line_strip => wgt::PrimitiveTopology::LineStrip,
GPUPrimitiveTopology::Triangle_list => wgt::PrimitiveTopology::TriangleList,
GPUPrimitiveTopology::Triangle_strip => wgt::PrimitiveTopology::TriangleStrip,
},
color_states: Cow::Owned(
descriptor
.colorStates
.iter()
.map(|state| wgt::ColorStateDescriptor {
format: convert_texture_format(state.format),
alpha_blend: convert_blend_descriptor(&state.alphaBlend),
color_blend: convert_blend_descriptor(&state.colorBlend),
write_mask: match wgt::ColorWrite::from_bits(state.writeMask) {
Some(mask) => mask,
None => wgt::ColorWrite::empty(),
}, },
})
.collect::<Vec<_>>(),
),
depth_stencil_state: descriptor.depthStencilState.as_ref().map(|dss_desc| {
wgt::DepthStencilStateDescriptor {
format: convert_texture_format(dss_desc.format),
depth_write_enabled: dss_desc.depthWriteEnabled,
depth_compare: convert_compare_function(dss_desc.depthCompare),
stencil_front: wgt::StencilStateFaceDescriptor {
compare: convert_compare_function(dss_desc.stencilFront.compare),
fail_op: convert_stencil_op(dss_desc.stencilFront.failOp),
depth_fail_op: convert_stencil_op(dss_desc.stencilFront.depthFailOp),
pass_op: convert_stencil_op(dss_desc.stencilFront.passOp),
}, },
stencil_back: wgt::StencilStateFaceDescriptor { })
compare: convert_compare_function(dss_desc.stencilBack.compare), .collect::<Vec<_>>(),
fail_op: convert_stencil_op(dss_desc.stencilBack.failOp), );
depth_fail_op: convert_stencil_op(dss_desc.stencilBack.depthFailOp),
pass_op: convert_stencil_op(dss_desc.stencilBack.passOp), let desc = if valid {
}, Some(wgpu_pipe::RenderPipelineDescriptor {
stencil_read_mask: dss_desc.stencilReadMask, layout: descriptor.parent.layout.id().0,
stencil_write_mask: dss_desc.stencilWriteMask, vertex_stage: wgpu_pipe::ProgrammableStageDescriptor {
} module: descriptor.vertexStage.module.id().0,
}), entry_point: Cow::Owned(descriptor.vertexStage.entryPoint.to_string()),
vertex_state: wgt::VertexStateDescriptor {
index_format: match vs_desc.indexFormat {
GPUIndexFormat::Uint16 => wgt::IndexFormat::Uint16,
GPUIndexFormat::Uint32 => wgt::IndexFormat::Uint32,
}, },
vertex_buffers: Cow::Owned( fragment_stage: descriptor.fragmentStage.as_ref().map(|stage| {
vs_desc wgpu_pipe::ProgrammableStageDescriptor {
.vertexBuffers module: stage.module.id().0,
.iter() entry_point: Cow::Owned(stage.entryPoint.to_string()),
.map(|buffer| wgt::VertexBufferDescriptor { }
stride: buffer.arrayStride, }),
step_mode: match buffer.stepMode { rasterization_state: Some(wgt::RasterizationStateDescriptor {
GPUInputStepMode::Vertex => wgt::InputStepMode::Vertex, front_face: match rs_desc.frontFace {
GPUInputStepMode::Instance => wgt::InputStepMode::Instance, GPUFrontFace::Ccw => wgt::FrontFace::Ccw,
}, GPUFrontFace::Cw => wgt::FrontFace::Cw,
attributes: Cow::Owned( },
buffer cull_mode: match rs_desc.cullMode {
.attributes GPUCullMode::None => wgt::CullMode::None,
.iter() GPUCullMode::Front => wgt::CullMode::Front,
.map(|att| wgt::VertexAttributeDescriptor { GPUCullMode::Back => wgt::CullMode::Back,
format: convert_vertex_format(att.format), },
offset: att.offset, clamp_depth: rs_desc.clampDepth,
shader_location: att.shaderLocation, depth_bias: rs_desc.depthBias,
}) depth_bias_slope_scale: *rs_desc.depthBiasSlopeScale,
.collect::<Vec<_>>(), depth_bias_clamp: *rs_desc.depthBiasClamp,
), }),
}) primitive_topology: match descriptor.primitiveTopology {
.collect::<Vec<_>>(), GPUPrimitiveTopology::Point_list => wgt::PrimitiveTopology::PointList,
), GPUPrimitiveTopology::Line_list => wgt::PrimitiveTopology::LineList,
}, GPUPrimitiveTopology::Line_strip => wgt::PrimitiveTopology::LineStrip,
sample_count: descriptor.sampleCount, GPUPrimitiveTopology::Triangle_list => wgt::PrimitiveTopology::TriangleList,
sample_mask: descriptor.sampleMask, GPUPrimitiveTopology::Triangle_strip => wgt::PrimitiveTopology::TriangleStrip,
alpha_to_coverage_enabled: descriptor.alphaToCoverageEnabled, },
color_states,
depth_stencil_state: descriptor.depthStencilState.as_ref().map(|dss_desc| {
wgt::DepthStencilStateDescriptor {
format: convert_texture_format(dss_desc.format),
depth_write_enabled: dss_desc.depthWriteEnabled,
depth_compare: convert_compare_function(dss_desc.depthCompare),
stencil_front: wgt::StencilStateFaceDescriptor {
compare: convert_compare_function(dss_desc.stencilFront.compare),
fail_op: convert_stencil_op(dss_desc.stencilFront.failOp),
depth_fail_op: convert_stencil_op(dss_desc.stencilFront.depthFailOp),
pass_op: convert_stencil_op(dss_desc.stencilFront.passOp),
},
stencil_back: wgt::StencilStateFaceDescriptor {
compare: convert_compare_function(dss_desc.stencilBack.compare),
fail_op: convert_stencil_op(dss_desc.stencilBack.failOp),
depth_fail_op: convert_stencil_op(dss_desc.stencilBack.depthFailOp),
pass_op: convert_stencil_op(dss_desc.stencilBack.passOp),
},
stencil_read_mask: dss_desc.stencilReadMask,
stencil_write_mask: dss_desc.stencilWriteMask,
}
}),
vertex_state: wgt::VertexStateDescriptor {
index_format: match vs_desc.indexFormat {
GPUIndexFormat::Uint16 => wgt::IndexFormat::Uint16,
GPUIndexFormat::Uint32 => wgt::IndexFormat::Uint32,
},
vertex_buffers: Cow::Owned(
vs_desc
.vertexBuffers
.iter()
.map(|buffer| wgt::VertexBufferDescriptor {
stride: buffer.arrayStride,
step_mode: match buffer.stepMode {
GPUInputStepMode::Vertex => wgt::InputStepMode::Vertex,
GPUInputStepMode::Instance => wgt::InputStepMode::Instance,
},
attributes: Cow::Owned(
buffer
.attributes
.iter()
.map(|att| wgt::VertexAttributeDescriptor {
format: convert_vertex_format(att.format),
offset: att.offset,
shader_location: att.shaderLocation,
})
.collect::<Vec<_>>(),
),
})
.collect::<Vec<_>>(),
),
},
sample_count: descriptor.sampleCount,
sample_mask: descriptor.sampleMask,
alpha_to_coverage_enabled: descriptor.alphaToCoverageEnabled,
})
} else {
self.handle_server_msg(
scope_id,
WebGPUOpResult::ValidationError(String::from("Invalid GPUColorWriteFlags")),
);
None
}; };
let render_pipeline_id = self let render_pipeline_id = self
@ -915,8 +960,6 @@ impl GPUDeviceMethods for GPUDevice {
.lock() .lock()
.create_render_pipeline_id(self.device.0.backend()); .create_render_pipeline_id(self.device.0.backend());
let scope_id = self.use_current_scope();
self.channel self.channel
.0 .0
.send(( .send((
@ -986,7 +1029,11 @@ impl GPUDeviceMethods for GPUDevice {
promise: None, promise: None,
}; };
let res = context.error_scopes.insert(scope_id, err_scope); let res = context.error_scopes.insert(scope_id, err_scope);
context.scope_stack.push((scope_id, filter)); context.scope_stack.push(ErrorScopeMetadata {
id: scope_id,
filter,
popped: Cell::new(false),
});
assert!(res.is_none()); assert!(res.is_none());
} }
@ -994,12 +1041,14 @@ impl GPUDeviceMethods for GPUDevice {
fn PopErrorScope(&self, comp: InRealm) -> Rc<Promise> { fn PopErrorScope(&self, comp: InRealm) -> Rc<Promise> {
let mut context = self.scope_context.borrow_mut(); let mut context = self.scope_context.borrow_mut();
let promise = Promise::new_in_current_realm(&self.global(), comp); let promise = Promise::new_in_current_realm(&self.global(), comp);
let scope_id = if let Some((e, _)) = context.scope_stack.last() { let scope_id =
*e if let Some(meta) = context.scope_stack.iter().rev().find(|m| !m.popped.get()) {
} else { meta.popped.set(true);
promise.reject_error(Error::Operation); meta.id
return promise; } else {
}; promise.reject_error(Error::Operation);
return promise;
};
let remove = if let Some(mut err_scope) = context.error_scopes.get_mut(&scope_id) { let remove = if let Some(mut err_scope) = context.error_scopes.get_mut(&scope_id) {
if let Some(ref e) = err_scope.error { if let Some(ref e) = err_scope.error {
match e { match e {
@ -1017,7 +1066,7 @@ impl GPUDeviceMethods for GPUDevice {
}; };
if remove { if remove {
let _ = context.error_scopes.remove(&scope_id); let _ = context.error_scopes.remove(&scope_id);
let _ = context.scope_stack.pop(); context.scope_stack.retain(|meta| meta.id != scope_id);
} }
promise promise
} }

View file

@ -35,7 +35,7 @@ pub struct GPURenderPassEncoder {
impl GPURenderPassEncoder { impl GPURenderPassEncoder {
fn new_inherited( fn new_inherited(
channel: WebGPU, channel: WebGPU,
render_pass: RenderPass, render_pass: Option<RenderPass>,
parent: &GPUCommandEncoder, parent: &GPUCommandEncoder,
label: Option<USVString>, label: Option<USVString>,
) -> Self { ) -> Self {
@ -43,7 +43,7 @@ impl GPURenderPassEncoder {
channel, channel,
reflector_: Reflector::new(), reflector_: Reflector::new(),
label: DomRefCell::new(label), label: DomRefCell::new(label),
render_pass: DomRefCell::new(Some(render_pass)), render_pass: DomRefCell::new(render_pass),
command_encoder: Dom::from_ref(parent), command_encoder: Dom::from_ref(parent),
} }
} }
@ -51,7 +51,7 @@ impl GPURenderPassEncoder {
pub fn new( pub fn new(
global: &GlobalScope, global: &GlobalScope,
channel: WebGPU, channel: WebGPU,
render_pass: RenderPass, render_pass: Option<RenderPass>,
parent: &GPUCommandEncoder, parent: &GPUCommandEncoder,
label: Option<USVString>, label: Option<USVString>,
) -> DomRoot<Self> { ) -> DomRoot<Self> {
@ -126,27 +126,27 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder {
/// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setblendcolor /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setblendcolor
fn SetBlendColor(&self, color: GPUColor) { fn SetBlendColor(&self, color: GPUColor) {
let colors = match color {
GPUColor::GPUColorDict(d) => wgt::Color {
r: *d.r,
g: *d.g,
b: *d.b,
a: *d.a,
},
GPUColor::DoubleSequence(mut s) => {
if s.len() < 3 {
s.resize(3, Finite::wrap(0.0f64));
}
s.resize(4, Finite::wrap(1.0f64));
wgt::Color {
r: *s[0],
g: *s[1],
b: *s[2],
a: *s[3],
}
},
};
if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() {
let colors = match color {
GPUColor::GPUColorDict(d) => wgt::Color {
r: *d.r,
g: *d.g,
b: *d.b,
a: *d.a,
},
GPUColor::DoubleSequence(mut s) => {
if s.len() < 3 {
s.resize(3, Finite::wrap(0.0f64));
}
s.resize(4, Finite::wrap(1.0f64));
wgt::Color {
r: *s[0],
g: *s[1],
b: *s[2],
a: *s[3],
}
},
};
wgpu_render::wgpu_render_pass_set_blend_color(render_pass, &colors); wgpu_render::wgpu_render_pass_set_blend_color(render_pass, &colors);
} }
} }
@ -160,24 +160,23 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder {
/// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-endpass /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-endpass
fn EndPass(&self) { fn EndPass(&self) {
if let Some(render_pass) = self.render_pass.borrow_mut().take() { let render_pass = self.render_pass.borrow_mut().take();
self.channel self.channel
.0 .0
.send(( .send((
self.command_encoder.device().use_current_scope(), self.command_encoder.device().use_current_scope(),
WebGPURequest::RunRenderPass { WebGPURequest::RunRenderPass {
command_encoder_id: self.command_encoder.id().0, command_encoder_id: self.command_encoder.id().0,
device_id: self.command_encoder.device().id().0, device_id: self.command_encoder.device().id().0,
render_pass, render_pass,
}, },
)) ))
.expect("Failed to send RunRenderPass"); .expect("Failed to send RunRenderPass");
self.command_encoder.set_state( self.command_encoder.set_state(
GPUCommandEncoderState::Open, GPUCommandEncoderState::Open,
GPUCommandEncoderState::EncodingRenderPass, GPUCommandEncoderState::EncodingRenderPass,
); );
}
} }
/// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-setpipeline /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-setpipeline

View file

@ -16,8 +16,11 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::gpudevice::{convert_texture_format, convert_texture_view_dimension, GPUDevice}; use crate::dom::gpudevice::{convert_texture_format, convert_texture_view_dimension, GPUDevice};
use crate::dom::gputextureview::GPUTextureView; use crate::dom::gputextureview::GPUTextureView;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use std::num::NonZeroU32;
use std::string::String; use std::string::String;
use webgpu::{wgt, WebGPU, WebGPURequest, WebGPUTexture, WebGPUTextureView}; use webgpu::{
identity::WebGPUOpResult, wgt, WebGPU, WebGPURequest, WebGPUTexture, WebGPUTextureView,
};
#[dom_struct] #[dom_struct]
pub struct GPUTexture { pub struct GPUTexture {
@ -137,24 +140,48 @@ impl GPUTextureMethods for GPUTexture {
}; };
let format = descriptor.format.unwrap_or(self.format); let format = descriptor.format.unwrap_or(self.format);
let scope_id = self.device.use_current_scope();
let mut valid = true;
let level_count = descriptor.mipLevelCount.and_then(|count| {
if count == 0 {
valid = false;
}
NonZeroU32::new(count)
});
let array_layer_count = descriptor.arrayLayerCount.and_then(|count| {
if count == 0 {
valid = false;
}
NonZeroU32::new(count)
});
let desc = wgt::TextureViewDescriptor { let desc = if valid {
label: descriptor Some(wgt::TextureViewDescriptor {
.parent label: descriptor
.label .parent
.as_ref() .label
.map(|s| String::from(s.as_ref())), .as_ref()
format: convert_texture_format(format), .map(|s| String::from(s.as_ref())),
dimension: convert_texture_view_dimension(dimension), format: convert_texture_format(format),
aspect: match descriptor.aspect { dimension: convert_texture_view_dimension(dimension),
GPUTextureAspect::All => wgt::TextureAspect::All, aspect: match descriptor.aspect {
GPUTextureAspect::Stencil_only => wgt::TextureAspect::StencilOnly, GPUTextureAspect::All => wgt::TextureAspect::All,
GPUTextureAspect::Depth_only => wgt::TextureAspect::DepthOnly, GPUTextureAspect::Stencil_only => wgt::TextureAspect::StencilOnly,
}, GPUTextureAspect::Depth_only => wgt::TextureAspect::DepthOnly,
base_mip_level: descriptor.baseMipLevel, },
level_count: descriptor.mipLevelCount.as_ref().copied(), base_mip_level: descriptor.baseMipLevel,
base_array_layer: descriptor.baseArrayLayer, level_count,
array_layer_count: descriptor.arrayLayerCount.as_ref().copied(), base_array_layer: descriptor.baseArrayLayer,
array_layer_count,
})
} else {
self.device.handle_server_msg(
scope_id,
WebGPUOpResult::ValidationError(String::from(
"arrayLayerCount and mipLevelCount cannot be 0",
)),
);
None
}; };
let texture_view_id = self let texture_view_id = self
@ -163,8 +190,6 @@ impl GPUTextureMethods for GPUTexture {
.lock() .lock()
.create_texture_view_id(self.device.id().0.backend()); .create_texture_view_id(self.device.id().0.backend());
let scope_id = self.device.use_current_scope();
self.channel self.channel
.0 .0
.send(( .send((

View file

@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize};
use servo_config::pref; use servo_config::pref;
use smallvec::SmallVec; use smallvec::SmallVec;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashMap; use std::collections::{HashMap, HashSet};
use std::ffi::CString; use std::ffi::CString;
use std::num::NonZeroU64; use std::num::NonZeroU64;
use std::ptr; use std::ptr;
@ -77,6 +77,7 @@ pub enum WebGPURequest {
CommandEncoderFinish { CommandEncoderFinish {
command_encoder_id: id::CommandEncoderId, command_encoder_id: id::CommandEncoderId,
device_id: id::DeviceId, device_id: id::DeviceId,
is_error: bool,
// TODO(zakorgy): Serialize CommandBufferDescriptor in wgpu-core // TODO(zakorgy): Serialize CommandBufferDescriptor in wgpu-core
// wgpu::command::CommandBufferDescriptor, // wgpu::command::CommandBufferDescriptor,
}, },
@ -118,12 +119,12 @@ pub enum WebGPURequest {
CreateBindGroupLayout { CreateBindGroupLayout {
device_id: id::DeviceId, device_id: id::DeviceId,
bind_group_layout_id: id::BindGroupLayoutId, bind_group_layout_id: id::BindGroupLayoutId,
descriptor: wgt::BindGroupLayoutDescriptor<'static>, descriptor: Option<wgt::BindGroupLayoutDescriptor<'static>>,
}, },
CreateBuffer { CreateBuffer {
device_id: id::DeviceId, device_id: id::DeviceId,
buffer_id: id::BufferId, buffer_id: id::BufferId,
descriptor: wgt::BufferDescriptor<Option<String>>, descriptor: Option<wgt::BufferDescriptor<Option<String>>>,
}, },
CreateCommandEncoder { CreateCommandEncoder {
device_id: id::DeviceId, device_id: id::DeviceId,
@ -146,7 +147,7 @@ pub enum WebGPURequest {
CreateRenderPipeline { CreateRenderPipeline {
device_id: id::DeviceId, device_id: id::DeviceId,
render_pipeline_id: id::RenderPipelineId, render_pipeline_id: id::RenderPipelineId,
descriptor: RenderPipelineDescriptor<'static>, descriptor: Option<RenderPipelineDescriptor<'static>>,
}, },
CreateSampler { CreateSampler {
device_id: id::DeviceId, device_id: id::DeviceId,
@ -169,13 +170,13 @@ pub enum WebGPURequest {
CreateTexture { CreateTexture {
device_id: id::DeviceId, device_id: id::DeviceId,
texture_id: id::TextureId, texture_id: id::TextureId,
descriptor: wgt::TextureDescriptor<Option<String>>, descriptor: Option<wgt::TextureDescriptor<Option<String>>>,
}, },
CreateTextureView { CreateTextureView {
texture_id: id::TextureId, texture_id: id::TextureId,
texture_view_id: id::TextureViewId, texture_view_id: id::TextureViewId,
device_id: id::DeviceId, device_id: id::DeviceId,
descriptor: wgt::TextureViewDescriptor<Option<String>>, descriptor: Option<wgt::TextureViewDescriptor<Option<String>>>,
}, },
DestroyBuffer(id::BufferId), DestroyBuffer(id::BufferId),
DestroySwapChain { DestroySwapChain {
@ -207,12 +208,12 @@ pub enum WebGPURequest {
RunComputePass { RunComputePass {
command_encoder_id: id::CommandEncoderId, command_encoder_id: id::CommandEncoderId,
device_id: id::DeviceId, device_id: id::DeviceId,
compute_pass: ComputePass, compute_pass: Option<ComputePass>,
}, },
RunRenderPass { RunRenderPass {
command_encoder_id: id::CommandEncoderId, command_encoder_id: id::CommandEncoderId,
device_id: id::DeviceId, device_id: id::DeviceId,
render_pass: RenderPass, render_pass: Option<RenderPass>,
}, },
Submit { Submit {
queue_id: id::QueueId, queue_id: id::QueueId,
@ -337,6 +338,8 @@ struct WGPU<'a> {
// Presentation Buffers with pending mapping // Presentation Buffers with pending mapping
present_buffer_maps: present_buffer_maps:
HashMap<id::BufferId, Rc<BufferMapInfo<'a, (Option<ErrorScopeId>, WebGPURequest)>>>, HashMap<id::BufferId, Rc<BufferMapInfo<'a, (Option<ErrorScopeId>, WebGPURequest)>>>,
//TODO: Remove this (https://github.com/gfx-rs/wgpu/issues/867)
error_command_buffers: HashSet<id::CommandBufferId>,
webrender_api: webrender_api::RenderApi, webrender_api: webrender_api::RenderApi,
webrender_document: webrender_api::DocumentId, webrender_document: webrender_api::DocumentId,
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>, external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
@ -368,6 +371,7 @@ impl<'a> WGPU<'a> {
_invalid_adapters: Vec::new(), _invalid_adapters: Vec::new(),
buffer_maps: HashMap::new(), buffer_maps: HashMap::new(),
present_buffer_maps: HashMap::new(), present_buffer_maps: HashMap::new(),
error_command_buffers: HashSet::new(),
webrender_api: webrender_api_sender.create_api(), webrender_api: webrender_api_sender.create_api(),
webrender_document, webrender_document,
external_images, external_images,
@ -450,12 +454,21 @@ impl<'a> WGPU<'a> {
WebGPURequest::CommandEncoderFinish { WebGPURequest::CommandEncoderFinish {
command_encoder_id, command_encoder_id,
device_id, device_id,
is_error,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(command_encoder_id => global.command_encoder_finish( let result = if is_error {
command_encoder_id, Err(String::from("Invalid GPUCommandEncoder"))
&wgt::CommandBufferDescriptor::default() } else {
)); gfx_select!(command_encoder_id => global.command_encoder_finish(
command_encoder_id,
&wgt::CommandBufferDescriptor::default()
))
.map_err(|e| format!("{:?}", e))
};
if result.is_err() {
self.error_command_buffers.insert(command_encoder_id);
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CopyBufferToBuffer { WebGPURequest::CopyBufferToBuffer {
@ -534,6 +547,9 @@ impl<'a> WGPU<'a> {
let global = &self.global; let global = &self.global;
let result = gfx_select!(bind_group_id => let result = gfx_select!(bind_group_id =>
global.device_create_bind_group(device_id, &descriptor, bind_group_id)); global.device_create_bind_group(device_id, &descriptor, bind_group_id));
if result.is_err() {
let _ = gfx_select!(bind_group_id => global.bind_group_error(bind_group_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CreateBindGroupLayout { WebGPURequest::CreateBindGroupLayout {
@ -542,9 +558,18 @@ impl<'a> WGPU<'a> {
descriptor, descriptor,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(bind_group_layout_id => if let Some(desc) = descriptor {
global.device_create_bind_group_layout(device_id, &descriptor, bind_group_layout_id)); let result = gfx_select!(bind_group_layout_id =>
self.send_result(device_id, scope_id, result); global.device_create_bind_group_layout(device_id, &desc, bind_group_layout_id));
if result.is_err() {
let _ = gfx_select!(bind_group_layout_id =>
global.bind_group_layout_error(bind_group_layout_id));
}
self.send_result(device_id, scope_id, result);
} else {
let _ = gfx_select!(bind_group_layout_id =>
global.bind_group_layout_error(bind_group_layout_id));
}
}, },
WebGPURequest::CreateBuffer { WebGPURequest::CreateBuffer {
device_id, device_id,
@ -552,17 +577,24 @@ impl<'a> WGPU<'a> {
descriptor, descriptor,
} => { } => {
let global = &self.global; let global = &self.global;
let st; if let Some(desc) = descriptor {
let label = match descriptor.label { let st;
Some(ref s) => { let label = match desc.label {
st = CString::new(s.as_bytes()).unwrap(); Some(ref s) => {
st.as_ptr() st = CString::new(s.as_bytes()).unwrap();
}, st.as_ptr()
None => ptr::null(), },
}; None => ptr::null(),
let result = gfx_select!(buffer_id => };
global.device_create_buffer(device_id, &descriptor.map_label(|_| label), buffer_id)); let result = gfx_select!(buffer_id =>
self.send_result(device_id, scope_id, result); global.device_create_buffer(device_id, &desc.map_label(|_| label), buffer_id));
if result.is_err() {
let _ = gfx_select!(buffer_id => global.buffer_error(buffer_id));
}
self.send_result(device_id, scope_id, result);
} else {
let _ = gfx_select!(buffer_id => global.buffer_error(buffer_id));
}
}, },
WebGPURequest::CreateCommandEncoder { WebGPURequest::CreateCommandEncoder {
device_id, device_id,
@ -581,6 +613,9 @@ impl<'a> WGPU<'a> {
let desc = wgt::CommandEncoderDescriptor { label }; let desc = wgt::CommandEncoderDescriptor { label };
let result = gfx_select!(command_encoder_id => let result = gfx_select!(command_encoder_id =>
global.device_create_command_encoder(device_id, &desc, command_encoder_id)); global.device_create_command_encoder(device_id, &desc, command_encoder_id));
if result.is_err() {
let _ = gfx_select!(command_encoder_id => global.command_encoder_error(command_encoder_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CreateComputePipeline { WebGPURequest::CreateComputePipeline {
@ -591,6 +626,10 @@ impl<'a> WGPU<'a> {
let global = &self.global; let global = &self.global;
let result = gfx_select!(compute_pipeline_id => let result = gfx_select!(compute_pipeline_id =>
global.device_create_compute_pipeline(device_id, &descriptor, compute_pipeline_id)); global.device_create_compute_pipeline(device_id, &descriptor, compute_pipeline_id));
if result.is_err() {
let _ = gfx_select!(compute_pipeline_id =>
global.compute_pipeline_error(compute_pipeline_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CreateContext(sender) => { WebGPURequest::CreateContext(sender) => {
@ -611,18 +650,28 @@ impl<'a> WGPU<'a> {
let global = &self.global; let global = &self.global;
let result = gfx_select!(pipeline_layout_id => let result = gfx_select!(pipeline_layout_id =>
global.device_create_pipeline_layout(device_id, &descriptor, pipeline_layout_id)); global.device_create_pipeline_layout(device_id, &descriptor, pipeline_layout_id));
if result.is_err() {
let _ = gfx_select!(pipeline_layout_id => global.pipeline_layout_error(pipeline_layout_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
//TODO: consider https://github.com/gfx-rs/wgpu/issues/684
WebGPURequest::CreateRenderPipeline { WebGPURequest::CreateRenderPipeline {
device_id, device_id,
render_pipeline_id, render_pipeline_id,
descriptor, descriptor,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(render_pipeline_id => if let Some(desc) = descriptor {
global.device_create_render_pipeline(device_id, &descriptor, render_pipeline_id)); let result = gfx_select!(render_pipeline_id =>
self.send_result(device_id, scope_id, result); global.device_create_render_pipeline(device_id, &desc, render_pipeline_id));
if result.is_err() {
let _ = gfx_select!(render_pipeline_id =>
global.render_pipeline_error(render_pipeline_id));
}
self.send_result(device_id, scope_id, result);
} else {
let _ = gfx_select!(render_pipeline_id => global.render_pipeline_error(render_pipeline_id));
}
}, },
WebGPURequest::CreateSampler { WebGPURequest::CreateSampler {
device_id, device_id,
@ -643,6 +692,9 @@ impl<'a> WGPU<'a> {
&descriptor.map_label(|_| label), &descriptor.map_label(|_| label),
sampler_id sampler_id
)); ));
if result.is_err() {
let _ = gfx_select!(sampler_id => global.sampler_error(sampler_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CreateShaderModule { WebGPURequest::CreateShaderModule {
@ -655,6 +707,10 @@ impl<'a> WGPU<'a> {
wgpu_core::pipeline::ShaderModuleSource::SpirV(Cow::Owned(program)); wgpu_core::pipeline::ShaderModuleSource::SpirV(Cow::Owned(program));
let result = gfx_select!(program_id => let result = gfx_select!(program_id =>
global.device_create_shader_module(device_id, source, program_id)); global.device_create_shader_module(device_id, source, program_id));
if result.is_err() {
let _ =
gfx_select!(program_id => global.shader_module_error(program_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::CreateSwapChain { WebGPURequest::CreateSwapChain {
@ -705,20 +761,27 @@ impl<'a> WGPU<'a> {
descriptor, descriptor,
} => { } => {
let global = &self.global; let global = &self.global;
let st; if let Some(desc) = descriptor {
let label = match descriptor.label { let st;
Some(ref s) => { let label = match desc.label {
st = CString::new(s.as_bytes()).unwrap(); Some(ref s) => {
st.as_ptr() st = CString::new(s.as_bytes()).unwrap();
}, st.as_ptr()
None => ptr::null(), },
}; None => ptr::null(),
let result = gfx_select!(texture_id => global.device_create_texture( };
device_id, let result = gfx_select!(texture_id => global.device_create_texture(
&descriptor.map_label(|_| label), device_id,
texture_id &desc.map_label(|_| label),
)); texture_id
self.send_result(device_id, scope_id, result); ));
if result.is_err() {
let _ = gfx_select!(texture_id => global.texture_error(texture_id));
}
self.send_result(device_id, scope_id, result);
} else {
let _ = gfx_select!(texture_id => global.texture_error(texture_id));
}
}, },
WebGPURequest::CreateTextureView { WebGPURequest::CreateTextureView {
texture_id, texture_id,
@ -727,24 +790,31 @@ impl<'a> WGPU<'a> {
descriptor, descriptor,
} => { } => {
let global = &self.global; let global = &self.global;
let st; if let Some(desc) = descriptor {
let label = match descriptor.label { let st;
Some(ref s) => { let label = match desc.label {
st = CString::new(s.as_bytes()).unwrap(); Some(ref s) => {
st.as_ptr() st = CString::new(s.as_bytes()).unwrap();
}, st.as_ptr()
None => ptr::null(), },
}; None => ptr::null(),
let result = gfx_select!(texture_view_id => global.texture_create_view( };
texture_id, let result = gfx_select!(texture_view_id => global.texture_create_view(
Some(&descriptor.map_label(|_| label)), texture_id,
texture_view_id Some(&desc.map_label(|_| label)),
)); texture_view_id
self.send_result(device_id, scope_id, result); ));
if result.is_err() {
let _ = gfx_select!(texture_view_id => global.texture_view_error(texture_view_id));
}
self.send_result(device_id, scope_id, result);
} else {
let _ = gfx_select!(texture_view_id => global.texture_view_error(texture_view_id));
}
}, },
WebGPURequest::DestroyBuffer(buffer) => { WebGPURequest::DestroyBuffer(buffer) => {
let global = &self.global; let global = &self.global;
gfx_select!(buffer => global.buffer_destroy(buffer, false)); gfx_select!(buffer => global.buffer_drop(buffer, false));
}, },
WebGPURequest::DestroySwapChain { WebGPURequest::DestroySwapChain {
external_id, external_id,
@ -758,10 +828,10 @@ impl<'a> WGPU<'a> {
.unwrap(); .unwrap();
let global = &self.global; let global = &self.global;
for b_id in data.available_buffer_ids.iter() { for b_id in data.available_buffer_ids.iter() {
gfx_select!(b_id => global.buffer_destroy(*b_id, false)); gfx_select!(b_id => global.buffer_drop(*b_id, false));
} }
for b_id in data.queued_buffer_ids.iter() { for b_id in data.queued_buffer_ids.iter() {
gfx_select!(b_id => global.buffer_destroy(*b_id, false)); gfx_select!(b_id => global.buffer_drop(*b_id, false));
} }
for b_id in data.unassigned_buffer_ids.iter() { for b_id in data.unassigned_buffer_ids.iter() {
if let Err(e) = self.script_sender.send(WebGPUMsg::FreeBuffer(*b_id)) { if let Err(e) = self.script_sender.send(WebGPUMsg::FreeBuffer(*b_id)) {
@ -775,7 +845,7 @@ impl<'a> WGPU<'a> {
}, },
WebGPURequest::DestroyTexture(texture) => { WebGPURequest::DestroyTexture(texture) => {
let global = &self.global; let global = &self.global;
gfx_select!(texture => global.texture_destroy(texture)); gfx_select!(texture => global.texture_drop(texture));
}, },
WebGPURequest::Exit(sender) => { WebGPURequest::Exit(sender) => {
if let Err(e) = self.script_sender.send(WebGPUMsg::Exit) { if let Err(e) = self.script_sender.send(WebGPUMsg::Exit) {
@ -816,6 +886,9 @@ impl<'a> WGPU<'a> {
&descriptor.map_label(|_| label), &descriptor.map_label(|_| label),
render_bundle_id render_bundle_id
)); ));
if result.is_err() {
let _ = gfx_select!(render_bundle_id => global.render_bundle_error(render_bundle_id));
}
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::RequestAdapter { WebGPURequest::RequestAdapter {
@ -823,15 +896,13 @@ impl<'a> WGPU<'a> {
options, options,
ids, ids,
} => { } => {
let adapter_id = match self.global.pick_adapter( let adapter_id = match self.global.request_adapter(
&options, &options,
wgpu::instance::AdapterInputs::IdSet(&ids, |id| id.backend()), wgpu::instance::AdapterInputs::IdSet(&ids, |id| id.backend()),
) { ) {
Some(id) => id, Ok(id) => id,
None => { Err(w) => {
if let Err(e) = if let Err(e) = sender.send(Err(format!("{:?}", w))) {
sender.send(Err("Failed to get webgpu adapter".to_string()))
{
warn!( warn!(
"Failed to send response to WebGPURequest::RequestAdapter ({})", "Failed to send response to WebGPURequest::RequestAdapter ({})",
e e
@ -843,7 +914,8 @@ impl<'a> WGPU<'a> {
let adapter = WebGPUAdapter(adapter_id); let adapter = WebGPUAdapter(adapter_id);
self.adapters.push(adapter); self.adapters.push(adapter);
let global = &self.global; let global = &self.global;
let info = gfx_select!(adapter_id => global.adapter_get_info(adapter_id)); let info =
gfx_select!(adapter_id => global.adapter_get_info(adapter_id)).unwrap();
if let Err(e) = sender.send(Ok(WebGPUResponse::RequestAdapter { if let Err(e) = sender.send(Ok(WebGPUResponse::RequestAdapter {
adapter_name: info.name, adapter_name: info.name,
adapter_id: adapter, adapter_id: adapter,
@ -872,6 +944,7 @@ impl<'a> WGPU<'a> {
)) { )) {
Ok(id) => id, Ok(id) => id,
Err(e) => { Err(e) => {
let _ = gfx_select!(device_id => global.device_error(device_id));
if let Err(w) = sender.send(Err(format!("{:?}", e))) { if let Err(w) = sender.send(Err(format!("{:?}", e))) {
warn!( warn!(
"Failed to send response to WebGPURequest::RequestDevice ({})", "Failed to send response to WebGPURequest::RequestDevice ({})",
@ -904,10 +977,14 @@ impl<'a> WGPU<'a> {
compute_pass, compute_pass,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(command_encoder_id => global.command_encoder_run_compute_pass( let result = if let Some(pass) = compute_pass {
command_encoder_id, gfx_select!(command_encoder_id => global.command_encoder_run_compute_pass(
&compute_pass command_encoder_id,
)); &pass
)).map_err(|e| format!("{:?}", e))
} else {
Err(String::from("Invalid ComputePass"))
};
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::RunRenderPass { WebGPURequest::RunRenderPass {
@ -916,10 +993,14 @@ impl<'a> WGPU<'a> {
render_pass, render_pass,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(command_encoder_id => global.command_encoder_run_render_pass( let result = if let Some(pass) = render_pass {
command_encoder_id, gfx_select!(command_encoder_id => global.command_encoder_run_render_pass(
&render_pass command_encoder_id,
)); &pass
)).map_err(|e| format!("{:?}", e))
} else {
Err(String::from("Invalid RenderPass"))
};
self.send_result(device_id, scope_id, result); self.send_result(device_id, scope_id, result);
}, },
WebGPURequest::Submit { WebGPURequest::Submit {
@ -927,7 +1008,15 @@ impl<'a> WGPU<'a> {
command_buffers, command_buffers,
} => { } => {
let global = &self.global; let global = &self.global;
let result = gfx_select!(queue_id => global.queue_submit(queue_id, &command_buffers)); let cmd_id = command_buffers
.iter()
.find(|id| self.error_command_buffers.contains(id));
let result = if cmd_id.is_some() {
Err(String::from("Invalid command buffer submitted"))
} else {
gfx_select!(queue_id => global.queue_submit(queue_id, &command_buffers))
.map_err(|e| format!("{:?}", e))
};
self.send_result(queue_id, scope_id, result); self.send_result(queue_id, scope_id, result);
}, },
WebGPURequest::SwapChainPresent { WebGPURequest::SwapChainPresent {

View file

@ -3890,15 +3890,6 @@
[webgpu:api,validation,error_scope:if_no_error_scope_handles_an_error_it_fires_an_uncapturederror_event:] [webgpu:api,validation,error_scope:if_no_error_scope_handles_an_error_it_fires_an_uncapturederror_event:]
expected: FAIL expected: FAIL
[webgpu:api,validation,error_scope:if_an_error_scope_matches_an_error_it_does_not_bubble_to_the_parent_scope:]
expected: FAIL
[webgpu:api,validation,error_scope:errors_bubble_to_the_parent_scope_if_not_handled_by_the_current_scope:]
expected: FAIL
[webgpu:api,validation,error_scope:simple_case_where_the_error_scope_catches_an_error:]
expected: FAIL
[cts.html?q=webgpu:api,validation,createBindGroupLayout:*] [cts.html?q=webgpu:api,validation,createBindGroupLayout:*]
expected: ERROR expected: ERROR
@ -4692,7 +4683,6 @@
[cts.html?q=webgpu:api,validation,setBlendColor:*] [cts.html?q=webgpu:api,validation,setBlendColor:*]
[cts.html?q=webgpu:api,validation,render_pass_descriptor:*] [cts.html?q=webgpu:api,validation,render_pass_descriptor:*]
expected: CRASH
[webgpu:api,validation,render_pass_descriptor:check_the_use_of_multisampled_textures_as_color_attachments:] [webgpu:api,validation,render_pass_descriptor:check_the_use_of_multisampled_textures_as_color_attachments:]
expected: FAIL expected: FAIL
@ -4751,7 +4741,606 @@
expected: ERROR expected: ERROR
[cts.html?q=webgpu:api,operation,resource_init,depth_stencil_attachment_clear:*] [cts.html?q=webgpu:api,operation,resource_init,depth_stencil_attachment_clear:*]
expected: CRASH [webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="all";mipLevelCount=1;sampleCount=1;uninitializeMethod="StoreOpClear";readMethod="DepthTest";dimension="2d";sliceCount=1;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=5;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="all";mipLevelCount=1;sampleCount=4;uninitializeMethod="Creation";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth32float";aspect="depth-only";mipLevelCount=1;sampleCount=1;uninitializeMethod="Creation";readMethod="DepthTest";dimension="2d";sliceCount=7;nonPowerOfTwo=false]
expected: FAIL
[webgpu:api,operation,resource_init,depth_stencil_attachment_clear:uninitialized_texture_is_zero:format="depth24plus-stencil8";aspect="stencil-only";mipLevelCount=1;sampleCount=4;uninitializeMethod="StoreOpClear";readMethod="StencilTest";dimension="2d";sliceCount=1;nonPowerOfTwo=true]
expected: FAIL
[cts.html?q=webgpu:api,operation,buffers,map_detach:*] [cts.html?q=webgpu:api,operation,buffers,map_detach:*]
[webgpu:api,operation,buffers,map_detach:create_mapped:unmap=false;destroy=true] [webgpu:api,operation,buffers,map_detach:create_mapped:unmap=false;destroy=true]
@ -15598,102 +16187,6 @@
[cts.html?q=webgpu:web-platform,canvas,context_creation:*] [cts.html?q=webgpu:web-platform,canvas,context_creation:*]
[cts.html?q=webgpu:api,validation,setBindGroup:*] [cts.html?q=webgpu:api,validation,setBindGroup:*]
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[0,4294967295\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[1024,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[0,4294967295\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[1,2\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[0,1024\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[0,512\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[4294967295,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[4294967295,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_passed_but_not_expected,compute_pass:type="renderpass"]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[256\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[0,512\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[1,2\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[0,4294967295\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[256,0,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[256,0,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[4294967295,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[0,512\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[0,1024\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[256\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[256,0,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[1,2\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[512,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[1024,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[512,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[1024,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_passed_but_not_expected,compute_pass:type="compute"]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="compute";dynamicOffsets=[512,0\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderpass";dynamicOffsets=[0,1024\]]
expected: FAIL
[webgpu:api,validation,setBindGroup:dynamic_offsets_match_expectations_in_pass_encoder:type="renderbundle";dynamicOffsets=[256\]]
expected: FAIL
[cts.html?q=webgpu:api,operation,command_buffer,render,rendering:*] [cts.html?q=webgpu:api,operation,command_buffer,render,rendering:*]
[webgpu:api,operation,command_buffer,render,rendering:fullscreen_quad:] [webgpu:api,operation,command_buffer,render,rendering:fullscreen_quad:]