Skip to content

Commit 32e9a48

Browse files
authored
[WebGPU] Fall back to 256MB for maxBufferSize if needed (#17150)
By default, we request 1GB of `maxStorageBufferBindingSize` and `maxBufferSize` when detecting a WebGPU device. However, low-resource devices such as iOS and Android may not be able to support 1GB. A previous PR falls back `maxStorageBufferBindingSize` to 128MB, the default values stated in WGSL doc, motivated by Android Chrome. This PR falls back `maxBufferSize` to 256MB, the default value, motivated by iOS Safari.
1 parent 5d07423 commit 32e9a48

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

web/src/webgpu.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,31 @@ export async function detectGPUDevice(): Promise<GPUDeviceDetectOutput | undefin
4949
}
5050

5151
// more detailed error message
52-
const requiredMaxBufferSize = 1 << 30;
52+
let requiredMaxBufferSize = 1 << 30; // 1GB
5353
if (requiredMaxBufferSize > adapter.limits.maxBufferSize) {
54-
throw Error(
55-
`Cannot initialize runtime because of requested maxBufferSize ` +
56-
`exceeds limit. requested=${computeMB(requiredMaxBufferSize)}, ` +
57-
`limit=${computeMB(adapter.limits.maxBufferSize)}. ` +
58-
`This error may be caused by an older version of the browser (e.g. Chrome 112). ` +
59-
`You can try to upgrade your browser to Chrome 113 or later.`
54+
// If 1GB is too large, try 256MB (default size stated in WebGPU doc)
55+
const backupRequiredMaxBufferSize = 1 << 28; // 256MB
56+
console.log(
57+
`Requested maxBufferSize exceeds limit. \n` +
58+
`requested=${computeMB(requiredMaxBufferSize)}, \n` +
59+
`limit=${computeMB(adapter.limits.maxBufferSize)}. \n` +
60+
`WARNING: Falling back to ${computeMB(backupRequiredMaxBufferSize)}...`
6061
);
62+
requiredMaxBufferSize = backupRequiredMaxBufferSize;
63+
if (backupRequiredMaxBufferSize > adapter.limits.maxBufferSize) {
64+
// Fail if 256MB is still too big
65+
throw Error(
66+
`Cannot initialize runtime because of requested maxBufferSize ` +
67+
`exceeds limit. requested=${computeMB(backupRequiredMaxBufferSize)}, ` +
68+
`limit=${computeMB(adapter.limits.maxBufferSize)}. ` +
69+
`Consider upgrading your browser.`
70+
);
71+
}
6172
}
6273

6374
let requiredMaxStorageBufferBindingSize = 1 << 30; // 1GB
6475
if (requiredMaxStorageBufferBindingSize > adapter.limits.maxStorageBufferBindingSize) {
65-
// If 1GB is too large, try 128MB (default size for Android)
76+
// If 1GB is too large, try 128MB (default size stated in WebGPU doc)
6677
const backupRequiredMaxStorageBufferBindingSize = 1 << 27; // 128MB
6778
console.log(
6879
`Requested maxStorageBufferBindingSize exceeds limit. \n` +

0 commit comments

Comments
 (0)