From 4425cc9b8d966cab3215732b6ae7449d51c713eb Mon Sep 17 00:00:00 2001 From: Mike Wyrzykowski Date: Tue, 5 Dec 2023 18:57:02 -0800 Subject: [PATCH] [WebGPU] GPUComputePassEncoder.dispatch empty call is legal in WebGPU, but generates a validation error in Metal https://bugs.webkit.org/show_bug.cgi?id=265907 Reviewed by Dan Glastonbury. Add validation for dispatch and dispatchIndirect which would otherwise crash the GPU process running the validation CTS test suite. * Source/WebGPU/WebGPU/ComputePassEncoder.mm: (WebGPU::ComputePassEncoder::dispatch): (WebGPU::ComputePassEncoder::dispatchIndirect): Canonical link: https://commits.webkit.org/271588@main --- Source/WebGPU/WebGPU/ComputePassEncoder.mm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/WebGPU/WebGPU/ComputePassEncoder.mm b/Source/WebGPU/WebGPU/ComputePassEncoder.mm index 4528fef8ec17..95d96ea477b7 100644 --- a/Source/WebGPU/WebGPU/ComputePassEncoder.mm +++ b/Source/WebGPU/WebGPU/ComputePassEncoder.mm @@ -85,13 +85,20 @@ void ComputePassEncoder::dispatch(uint32_t x, uint32_t y, uint32_t z) { + if (!(x * y * z)) + return; + executePreDispatchCommands(); [m_computeCommandEncoder dispatchThreadgroups:MTLSizeMake(x, y, z) threadsPerThreadgroup:m_threadsPerThreadgroup]; } void ComputePassEncoder::dispatchIndirect(const Buffer& indirectBuffer, uint64_t indirectOffset) { - // FIXME: ensure higher levels perform validation on indirectOffset before reaching this callsite + if ((indirectOffset % 4) || !(indirectBuffer.usage() & WGPUBufferUsage_Indirect) || (indirectOffset + 3 * sizeof(uint32_t) > indirectBuffer.buffer().length)) { + makeInvalid(); + return; + } + executePreDispatchCommands(); [m_computeCommandEncoder dispatchThreadgroupsWithIndirectBuffer:indirectBuffer.buffer() indirectBufferOffset:indirectOffset threadsPerThreadgroup:m_threadsPerThreadgroup]; }