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:
@@ -61,10 +61,10 @@ already_AddRefed<dom::Promise> Queue::OnSubmittedWorkDone(ErrorResult& aRv) {
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
void Queue::WriteBuffer(const Buffer& aBuffer, uint64_t aBufferOffset,
|
||||
const dom::ArrayBufferViewOrArrayBuffer& aData,
|
||||
uint64_t aDataOffset,
|
||||
const dom::Optional<uint64_t>& aSize,
|
||||
void Queue::WriteBuffer(
|
||||
const Buffer& aBuffer, uint64_t aBufferOffset,
|
||||
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& aData,
|
||||
uint64_t aDataOffset, const dom::Optional<uint64_t>& aSize,
|
||||
ErrorResult& aRv) {
|
||||
if (!aBuffer.mId) {
|
||||
// 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,
|
||||
const dom::ArrayBufferViewOrArrayBuffer& aData,
|
||||
void Queue::WriteTexture(
|
||||
const dom::GPUTexelCopyTextureInfo& aDestination,
|
||||
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& aData,
|
||||
const dom::GPUTexelCopyBufferLayout& aDataLayout,
|
||||
const dom::GPUExtent3D& aSize, ErrorResult& aRv) {
|
||||
ffi::WGPUTexelCopyTextureInfo copyView = {};
|
||||
|
||||
@@ -47,13 +47,15 @@ class Queue final : public ObjectBase, public ChildOf<Device> {
|
||||
|
||||
already_AddRefed<dom::Promise> OnSubmittedWorkDone(ErrorResult& aRv);
|
||||
|
||||
void WriteBuffer(const Buffer& aBuffer, uint64_t aBufferOffset,
|
||||
const dom::ArrayBufferViewOrArrayBuffer& aData,
|
||||
void WriteBuffer(
|
||||
const Buffer& aBuffer, uint64_t aBufferOffset,
|
||||
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& data,
|
||||
uint64_t aDataOffset, const dom::Optional<uint64_t>& aSize,
|
||||
ErrorResult& aRv);
|
||||
|
||||
void WriteTexture(const dom::GPUTexelCopyTextureInfo& aDestination,
|
||||
const dom::ArrayBufferViewOrArrayBuffer& aData,
|
||||
void WriteTexture(
|
||||
const dom::GPUTexelCopyTextureInfo& aDestination,
|
||||
const dom::MaybeSharedArrayBufferOrMaybeSharedArrayBufferView& data,
|
||||
const dom::GPUTexelCopyBufferLayout& aDataLayout,
|
||||
const dom::GPUExtent3D& aSize, ErrorResult& aRv);
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ scheme = "http"
|
||||
|
||||
["test_set_bind_group_null.html"]
|
||||
|
||||
["test_shared_array_buffer.html"]
|
||||
|
||||
["test_submit_compute_empty.html"]
|
||||
|
||||
["test_submit_render_empty.html"]
|
||||
|
||||
54
dom/webgpu/mochitest/test_shared_array_buffer.html
Normal file
54
dom/webgpu/mochitest/test_shared_array_buffer.html
Normal 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>
|
||||
@@ -1195,10 +1195,6 @@ dictionary GPUQueueDescriptor
|
||||
: 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",
|
||||
Exposed=(Window, Worker), SecureContext]
|
||||
interface GPUQueue {
|
||||
@@ -1211,14 +1207,14 @@ interface GPUQueue {
|
||||
undefined writeBuffer(
|
||||
GPUBuffer buffer,
|
||||
GPUSize64 bufferOffset,
|
||||
BufferSource data,
|
||||
AllowSharedBufferSource data,
|
||||
optional GPUSize64 dataOffset = 0,
|
||||
optional GPUSize64 size);
|
||||
|
||||
[Throws]
|
||||
undefined writeTexture(
|
||||
GPUTexelCopyTextureInfo destination,
|
||||
BufferSource data,
|
||||
AllowSharedBufferSource data,
|
||||
GPUTexelCopyBufferLayout dataLayout,
|
||||
GPUExtent3D size);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user