From d13e9f5ebf79db1725964fb083085b7ec31a0ff7 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 27 Jun 2025 10:54:19 -0700 Subject: [PATCH] [tests] Test destruction of a used resource before submission (#7853) * [tests] Test destruction of a used resource before submission Fixes #5031 --------- Co-authored-by: Nicolas Silva --- tests/tests/wgpu-gpu/life_cycle.rs | 107 ++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/tests/tests/wgpu-gpu/life_cycle.rs b/tests/tests/wgpu-gpu/life_cycle.rs index 353fc2df20..ff0b90b024 100644 --- a/tests/tests/wgpu-gpu/life_cycle.rs +++ b/tests/tests/wgpu-gpu/life_cycle.rs @@ -1,4 +1,5 @@ -use wgpu_test::{fail, gpu_test, GpuTestConfiguration}; +use wgpu::{util::DeviceExt, Backends}; +use wgpu_test::{fail, gpu_test, FailureCase, GpuTestConfiguration, TestParameters}; #[gpu_test] static BUFFER_DESTROY: GpuTestConfiguration = @@ -99,3 +100,107 @@ static TEXTURE_DESTROY: GpuTestConfiguration = texture.destroy(); }); + +// Test that destroying a buffer between command buffer recording and +// submission fails gracefully. +#[gpu_test] +static BUFFER_DESTROY_BEFORE_SUBMIT: GpuTestConfiguration = GpuTestConfiguration::new() + .parameters( + // https://github.com/gfx-rs/wgpu/issues/7854 + TestParameters::default().skip(FailureCase::backend_adapter(Backends::VULKAN, "llvmpipe")), + ) + .run_sync(|ctx| { + let buffer_source = ctx + .device + .create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: None, + contents: &[0u8; 4], + usage: wgpu::BufferUsages::COPY_SRC, + }); + let buffer_dest = ctx.device.create_buffer(&wgpu::BufferDescriptor { + label: None, + size: 4, + usage: wgpu::BufferUsages::COPY_DST, + mapped_at_creation: false, + }); + + let mut encoder = ctx + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); + encoder.copy_buffer_to_buffer(&buffer_source, 0, &buffer_dest, 0, 4); + + buffer_source.destroy(); + buffer_dest.destroy(); + + let cmd_buffer = encoder.finish(); + + fail( + &ctx.device, + || ctx.queue.submit([cmd_buffer]), + Some("Buffer with '' label has been destroyed"), + ); + }); + +// Test that destroying a texture between command buffer recording and +// submission fails gracefully. +#[gpu_test] +static TEXTURE_DESTROY_BEFORE_SUBMIT: GpuTestConfiguration = GpuTestConfiguration::new() + .parameters( + // https://github.com/gfx-rs/wgpu/issues/7854 + TestParameters::default().skip(FailureCase::backend_adapter(Backends::VULKAN, "llvmpipe")), + ) + .run_sync(|ctx| { + let descriptor = wgpu::TextureDescriptor { + label: None, + size: wgpu::Extent3d { + width: 128, + height: 128, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, // multisampling is not supported for clear + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8Snorm, + usage: wgpu::TextureUsages::COPY_DST + | wgpu::TextureUsages::COPY_SRC + | wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }; + + let texture_1 = ctx.device.create_texture(&descriptor); + let texture_2 = ctx.device.create_texture(&descriptor); + + let mut encoder = ctx + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); + encoder.copy_texture_to_texture( + wgpu::TexelCopyTextureInfo { + texture: &texture_1, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + aspect: wgpu::TextureAspect::All, + }, + wgpu::TexelCopyTextureInfo { + texture: &texture_2, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + aspect: wgpu::TextureAspect::All, + }, + wgpu::Extent3d { + width: 128, + height: 128, + depth_or_array_layers: 1, + }, + ); + + texture_1.destroy(); + texture_2.destroy(); + + let cmd_buffer = encoder.finish(); + + fail( + &ctx.device, + || ctx.queue.submit([cmd_buffer]), + Some("Texture with '' label has been destroyed"), + ); + });