验证、错误作用域与设备丢失
pushErrorScope、CompilationInfo 与恢复策略
故意创建不合法资源并捕获 GPUValidationError,同时读取 WGSL 编译诊断和模拟设备销毁。
先明确本课目标
使用 error scope 捕获验证错误
读取 shader compilation info
理解设备丢失后的重建边界
WebGPU 错误既可能同步抛出,也可能异步通过错误作用域、uncapturederror 或 device.lost 报告。
为什么 try/catch 经常抓不到 WebGPU 验证错误?
许多 WebGPU 操作先返回对象,验证在异步 GPU/实现流程中报告。pushErrorScope/popErrorScope 用作用域捕获 validation、out-of-memory 或 internal 错误。
javascriptdevice.pushErrorScope('validation');
device.createBuffer({
size: 16,
usage: GPUBufferUsage.MAP_READ |
GPUBufferUsage.VERTEX, // 非法组合
});
const error = await device.popErrorScope();
console.log(error?.message);- 先 push 只捕获作用域内、指定过滤类型的设备错误。
- 后 pop popErrorScope() 返回 Promise,因为错误报告可能是异步的。
- 作用域是栈 可以嵌套,但必须按后进先出顺序弹出。
错误变成可处理的数据,而不是只出现在 uncapturederror 或浏览器控制台。
OPTIONAL · 按需查阅完整术语表与概念边界遇到陌生术语时再展开,不打断主线实验。
展开⌄
边改边运行
浏览器加载后会激活代码编辑器、独立运行环境与实时输出。
实现 ResourceRegistry,在新 Device 上批量重建资源。
回到原理,解释刚才发生了什么
先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。
核心讲解
错误作用域像 try/catch
pushErrorScope 标记捕获范围,popErrorScope 异步返回其中首个匹配错误,适合给资源创建或管线编译加上下文。
设备丢失要重建所有 GPU 资源
Device 关联的 Buffer、Texture、Pipeline 都不能迁移到新 Device。应用应保留可重新创建资源的 CPU 描述。
OPTIONAL · 迁移时查阅WebGPU 与 WebGL2 对照主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。
展开⌄
WebGL 依赖错误标志和 Context Lost 事件,WebGPU 提供异步验证作用域与 Device Lost。
WebGL
getError、shader/program 日志和 webglcontextlost/restored 事件覆盖不同失败层次。
WebGPU
ErrorScope、uncapturederror、CompilationInfo 与 device.lost 构成显式诊断链。
WebGPU Device 不会原地 restored;恢复路径必须从 CPU 描述重新创建全部 GPU 资源。