diff --git a/components/script/dom/gpucommandbuffer.rs b/components/script/dom/gpucommandbuffer.rs index 6e1eb8446f0..eb6ede84c26 100644 --- a/components/script/dom/gpucommandbuffer.rs +++ b/components/script/dom/gpucommandbuffer.rs @@ -13,7 +13,7 @@ use crate::dom::gpubuffer::GPUBuffer; use dom_struct::dom_struct; use std::collections::HashSet; use std::hash::{Hash, Hasher}; -use webgpu::{WebGPU, WebGPUCommandBuffer}; +use webgpu::{WebGPU, WebGPUCommandBuffer, WebGPURequest}; impl Eq for DomRoot {} impl Hash for DomRoot { @@ -67,6 +67,20 @@ impl GPUCommandBuffer { } } +impl Drop for GPUCommandBuffer { + fn drop(&mut self) { + if let Err(e) = self.channel.0.send(( + None, + WebGPURequest::FreeCommandBuffer(self.command_buffer.0), + )) { + warn!( + "Failed to send FreeCommandBuffer({:?}) ({})", + self.command_buffer.0, e + ); + } + } +} + impl GPUCommandBuffer { pub fn id(&self) -> WebGPUCommandBuffer { self.command_buffer diff --git a/components/webgpu/lib.rs b/components/webgpu/lib.rs index 944edcfa461..cbfe4cd161e 100644 --- a/components/webgpu/lib.rs +++ b/components/webgpu/lib.rs @@ -185,6 +185,7 @@ pub enum WebGPURequest { }, DestroyTexture(id::TextureId), Exit(IpcSender<()>), + FreeCommandBuffer(id::CommandBufferId), FreeDevice(id::DeviceId), RenderBundleEncoderFinish { render_bundle_encoder: RenderBundleEncoder, @@ -856,6 +857,9 @@ impl<'a> WGPU<'a> { } return; }, + WebGPURequest::FreeCommandBuffer(command_buffer_id) => { + self.error_command_buffers.remove(&command_buffer_id); + }, WebGPURequest::FreeDevice(device_id) => { let device = WebGPUDevice(device_id); let pipeline_id = self.devices.remove(&device).unwrap();