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();
|
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 = {};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
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 {
|
: 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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user