From c6cd3c8e02812c2d1373c92bfc95758b5582d9ea Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 4 May 2026 16:23:00 -0700 Subject: [PATCH 1/2] fix(deno): Reject invalid texture usage with validation error --- deno_webgpu/device.rs | 11 +++++++++-- deno_webgpu/texture.rs | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/deno_webgpu/device.rs b/deno_webgpu/device.rs index 9c45bb86b63..c7d48e6e529 100644 --- a/deno_webgpu/device.rs +++ b/deno_webgpu/device.rs @@ -34,6 +34,7 @@ use crate::query_set::GPUQuerySet; use crate::render_bundle::GPURenderBundleEncoder; use crate::render_pipeline::GPURenderPipeline; use crate::shader::GPUCompilationInfo; +use crate::webidl::GPUTextureUsageFlags; use crate::Instance; /// External memory associated with device and queue, to encourage V8 to garbage @@ -214,6 +215,12 @@ impl GPUDevice { &self, #[webidl] descriptor: super::texture::GPUTextureDescriptor, ) -> Result { + // Validation of the usage needs to happen on the device timeline, so + // don't raise an error immediately if it isn't valid. wgpu will + // reject `TextureUsages::empty()`. + let usage = wgpu_types::TextureUsages::from_bits(descriptor.usage) + .unwrap_or(wgpu_types::TextureUsages::empty()); + let wgpu_descriptor = wgpu_core::resource::TextureDescriptor { label: crate::transform_label(descriptor.label.clone()), size: descriptor.size.into(), @@ -221,7 +228,7 @@ impl GPUDevice { sample_count: descriptor.sample_count, dimension: descriptor.dimension.clone().into(), format: descriptor.format.clone().into(), - usage: descriptor.usage.into(), + usage, view_formats: descriptor .view_formats .into_iter() @@ -247,7 +254,7 @@ impl GPUDevice { sample_count: wgpu_descriptor.sample_count, dimension: descriptor.dimension, format: descriptor.format, - usage: descriptor.usage, + usage: GPUTextureUsageFlags(usage), }) } diff --git a/deno_webgpu/texture.rs b/deno_webgpu/texture.rs index a87a4c66cfd..8ff84d1ec82 100644 --- a/deno_webgpu/texture.rs +++ b/deno_webgpu/texture.rs @@ -35,7 +35,7 @@ pub(crate) struct GPUTextureDescriptor { #[webidl(default = GPUTextureDimension::D2)] pub dimension: GPUTextureDimension, pub format: GPUTextureFormat, - pub usage: GPUTextureUsageFlags, + pub usage: u32, #[webidl(default = vec![])] pub view_formats: Vec, } From 4a5ecf88405c11e78ff3b07be0d028477a5e0698 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 02:04:26 +0000 Subject: [PATCH 2/2] chore(deps): update cts digest to 2e0221e Co-authored-by: Andy Leiserson --- cts_runner/fail.lst | 2 ++ cts_runner/revision.txt | 2 +- cts_runner/test.lst | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cts_runner/fail.lst b/cts_runner/fail.lst index b286c3220c6..f8c402a356c 100644 --- a/cts_runner/fail.lst +++ b/cts_runner/fail.lst @@ -13,6 +13,7 @@ // appear in this file in order -- including ones in comments. webgpu:api,operation,rendering,3d_texture_slices:* // https://github.com/gfx-rs/wgpu/issues/9455 +webgpu:api,validation,buffer,create:new_usages,* // https://github.com/denoland/deno/issues/33846; possibly issues with wgpu extensions webgpu:api,validation,buffer,mapping:* // crash webgpu:api,validation,capability_checks,features,* // 21%, TypeError not thrown for missing features (needs deno_webgpu fix) webgpu:api,validation,capability_checks,limits,* // 60%, workgroup storage size validation unimplemented; interstage vars counting; bind group timing on dx12 @@ -22,6 +23,7 @@ webgpu:api,validation,compute_pipeline:overrides,workgroup_size,limits:* // 0% webgpu:api,validation,createBindGroup:buffer,resource_state:* // 0%, https://github.com/gfx-rs/wgpu/issues/7881 webgpu:api,validation,createBindGroup:external_texture,* // 0%, no external external texture in deno webgpu:api,validation,createBindGroup:texture,resource_state:* // crash, https://github.com/gfx-rs/wgpu/issues/7881 +webgpu:api,validation,createTexture:new_usages,* // https://github.com/denoland/deno/issues/33846; possibly issues with wgpu extensions webgpu:api,validation,createView:texture_state:* // 0%, https://github.com/gfx-rs/wgpu/issues/7881 webgpu:api,validation,encoding,cmds,copyTextureToTexture:copy_ranges:* // ***, https://github.com/gfx-rs/wgpu/issues/8118 webgpu:api,validation,encoding,cmds,debug:* // 92%, https://github.com/gfx-rs/wgpu/issues/8039 diff --git a/cts_runner/revision.txt b/cts_runner/revision.txt index f9583408735..5f9c39cfd7a 100644 --- a/cts_runner/revision.txt +++ b/cts_runner/revision.txt @@ -1 +1 @@ -8640b4243d0234cf2d2085e3837efafbcc6faa09 +2e0221e96fba1b05238dba31f8ca4a2d5ae4b06e diff --git a/cts_runner/test.lst b/cts_runner/test.lst index 9104b25305c..b2f309bdca4 100644 --- a/cts_runner/test.lst +++ b/cts_runner/test.lst @@ -55,7 +55,10 @@ fails-if(vulkan) webgpu:api,operation,vertex_state,correctness:array_stride_zero webgpu:api,operation,vertex_state,correctness:non_zero_array_stride_and_attribute_offset:* webgpu:api,operation,vertex_state,correctness:setVertexBuffer_offset_and_attribute_offset:* -webgpu:api,validation,buffer,create:* +webgpu:api,validation,buffer,create:createBuffer_invalid_and_oom,* +webgpu:api,validation,buffer,create:limit,* +webgpu:api,validation,buffer,create:size,* +webgpu:api,validation,buffer,create:usage,* webgpu:api,validation,buffer,destroy:* webgpu:api,validation,capability_checks,features,clip_distances:* webgpu:api,validation,capability_checks,limits,maxBindGroups:setBindGroup,* @@ -118,7 +121,14 @@ webgpu:api,validation,createBindGroupLayout:visibility,* webgpu:api,validation,createBindGroupLayout:visibility:* webgpu:api,validation,createPipelineLayout:* webgpu:api,validation,createSampler:* -webgpu:api,validation,createTexture:* +webgpu:api,validation,createTexture:dimension_type_and_format_compatibility:* +webgpu:api,validation,createTexture:mipLevelCount,* +webgpu:api,validation,createTexture:sample_count,* +webgpu:api,validation,createTexture:sampleCount,* +webgpu:api,validation,createTexture:texture_size,* +webgpu:api,validation,createTexture:texture_usage,* +webgpu:api,validation,createTexture:viewFormats:* +webgpu:api,validation,createTexture:zero_size_and_usage:* webgpu:api,validation,createView:array_layers:* webgpu:api,validation,createView:aspect:* webgpu:api,validation,createView:cube_faces_square:*