Bug 1938257 - feat(webgpu): permit AllowSharedBufferSource in WebGPU r=webgpu-reviewers,webidl,smaug,teoxoy

Differential Revision: https://phabricator.services.mozilla.com/D244382
This commit is contained in:
Erich Gubler
2025-04-12 20:58:12 +00:00
parent a8e1e56ae4
commit 39b36a3858
5 changed files with 78 additions and 23 deletions

View File

@@ -61,10 +61,10 @@ already_AddRefed<dom::Promise> Queue::OnSubmittedWorkDone(ErrorResult& aRv) {
return promise.forget(); return promise.forget();
} }
void Queue::WriteBuffer(const Buffer& aBuffer, uint64_t aBufferOffset, void Queue::WriteBuffer(
const dom::ArrayBufferViewOrArrayBuffer& aData, const Buffer& aBuffer, uint64_t aBufferOffset,
uint64_t aDataOffset, const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& aData,
const dom::Optional<uint64_t>& aSize, uint64_t aDataOffset, const dom::Optional<uint64_t>& aSize,
ErrorResult& aRv) { ErrorResult& aRv) {
if (!aBuffer.mId) { if (!aBuffer.mId) {
// Invalid buffers are unknown to the parent -- don't try to write // Invalid buffers are unknown to the parent -- don't try to write
@@ -178,8 +178,9 @@ static CheckedInt<size_t> ComputeApproxSize(
} }
} }
void Queue::WriteTexture(const dom::GPUTexelCopyTextureInfo& aDestination, void Queue::WriteTexture(
const dom::ArrayBufferViewOrArrayBuffer& aData, const dom::GPUTexelCopyTextureInfo& aDestination,
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& aData,
const dom::GPUTexelCopyBufferLayout& aDataLayout, const dom::GPUTexelCopyBufferLayout& aDataLayout,
const dom::GPUExtent3D& aSize, ErrorResult& aRv) { const dom::GPUExtent3D& aSize, ErrorResult& aRv) {
ffi::WGPUTexelCopyTextureInfo copyView = {}; ffi::WGPUTexelCopyTextureInfo copyView = {};

View File

@@ -47,13 +47,15 @@ class Queue final : public ObjectBase, public ChildOf<Device> {
already_AddRefed<dom::Promise> OnSubmittedWorkDone(ErrorResult& aRv); already_AddRefed<dom::Promise> OnSubmittedWorkDone(ErrorResult& aRv);
void WriteBuffer(const Buffer& aBuffer, uint64_t aBufferOffset, void WriteBuffer(
const dom::ArrayBufferViewOrArrayBuffer& aData, const Buffer& aBuffer, uint64_t aBufferOffset,
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& data,
uint64_t aDataOffset, const dom::Optional<uint64_t>& aSize, uint64_t aDataOffset, const dom::Optional<uint64_t>& aSize,
ErrorResult& aRv); ErrorResult& aRv);
void WriteTexture(const dom::GPUTexelCopyTextureInfo& aDestination, void WriteTexture(
const dom::ArrayBufferViewOrArrayBuffer& aData, const dom::GPUTexelCopyTextureInfo& aDestination,
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& data,
const dom::GPUTexelCopyBufferLayout& aDataLayout, const dom::GPUTexelCopyBufferLayout& aDataLayout,
const dom::GPUExtent3D& aSize, ErrorResult& aRv); const dom::GPUExtent3D& aSize, ErrorResult& aRv);

View File

@@ -61,6 +61,8 @@ scheme = "http"
["test_set_bind_group_null.html"] ["test_set_bind_group_null.html"]
["test_shared_array_buffer.html"]
["test_submit_compute_empty.html"] ["test_submit_compute_empty.html"]
["test_submit_render_empty.html"] ["test_submit_render_empty.html"]

View File

@@ -0,0 +1,54 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css" />
</head>
<body>
<script>
ok(
SpecialPowers.getBoolPref("dom.webgpu.enabled"),
"Pref should be enabled."
);
const set_bind_group_null = async function () {
const adapter = await navigator.gpu.requestAdapter();
ok(adapter !== undefined, "adapter !== undefined");
const device = await adapter.requestDevice();
ok(device !== undefined, "device !== undefined");
const sharedData = new WebAssembly.Memory({
initial: 1,
maximum: 1,
shared: true,
});
const buffer = device.createBuffer({
mappedAtCreation: true,
size: 128,
usage: GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(buffer, 0, sharedData.buffer, 0, 128);
await device.queue.submit([]);
ok(true, "Could use a `SharedArrayBuffer` to write to a buffer.");
const texture = device.createTexture({
mappedAtCreation: true,
size: [128, 1],
format: "r8uint",
usage: GPUTextureUsage.COPY_DST,
});
device.queue.writeTexture({ texture }, sharedData.buffer, {}, [128, 1]);
await device.queue.submit([]);
ok(true, "Could use a `SharedArrayBuffer` to write to a texture.");
};
SimpleTest.waitForExplicitFinish();
set_bind_group_null()
.catch(e => ok(false, `Unhandled exception ${e}`))
.finally(() => SimpleTest.finish());
</script>
</body>
</html>

View File

@@ -1195,10 +1195,6 @@ dictionary GPUQueueDescriptor
: GPUObjectDescriptorBase { : GPUObjectDescriptorBase {
}; };
//TODO: use [AllowShared] on BufferSource
// https://bugzilla.mozilla.org/show_bug.cgi?id=1696216
// https://github.com/heycam/webidl/issues/961
[Func="mozilla::webgpu::Instance::PrefEnabled", [Func="mozilla::webgpu::Instance::PrefEnabled",
Exposed=(Window, Worker), SecureContext] Exposed=(Window, Worker), SecureContext]
interface GPUQueue { interface GPUQueue {
@@ -1211,14 +1207,14 @@ interface GPUQueue {
undefined writeBuffer( undefined writeBuffer(
GPUBuffer buffer, GPUBuffer buffer,
GPUSize64 bufferOffset, GPUSize64 bufferOffset,
BufferSource data, AllowSharedBufferSource data,
optional GPUSize64 dataOffset = 0, optional GPUSize64 dataOffset = 0,
optional GPUSize64 size); optional GPUSize64 size);
[Throws] [Throws]
undefined writeTexture( undefined writeTexture(
GPUTexelCopyTextureInfo destination, GPUTexelCopyTextureInfo destination,
BufferSource data, AllowSharedBufferSource data,
GPUTexelCopyBufferLayout dataLayout, GPUTexelCopyBufferLayout dataLayout,
GPUExtent3D size); GPUExtent3D size);