共计 5083 个字符,预计需要花费 13 分钟才能阅读完成。
系列博客总目录:https://segmentfault.com/a/1190000040716735
参考自 https://www.w3.org/TR/webgpu/…
1 navigator.gpu
GPU 对象能在浏览器环境(Window 环境)获取,也能够在非共享全局 Worker 中获取,其接口定义如下:
interface mixin NavigatorGPU {[SameObject, SecureContext] readonly attribute GPU gpu;
};
Navigator includes NavigatorGPU;
WorkerNavigator includes NavigatorGPU;
能够通过拜访 navigator.gpu
来拜访 GPU 对象。
2 GPU
对应 https://www.w3.org/TR/webgpu/…
GPU
是 WebGPU 的入口,能够通过 navigator.gpu
拜访它。
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPU {Promise<GPUAdapter?> requestAdapter(optional GPURequestAdapterOptions options = {});
};
requestAdapter 办法
接管参数为 GPURequestAdapterOptions
类型的对象,不可空(即不能为 {}
),但可选。
GPURequestAdapterOptions 类型见 2.1 大节。
它返回一个 resolve 值为 null 或 GPUAdapter
对象的 Promise。
调用这个办法是有考究的,如果零碎产生一些无关显卡的更改,例如插入了显卡,驱动更新等,适配器将会标记为过期的,在进行申请设施之前,最好再调用一次这个办法。
例子:申请一个 GPUAdapter
const adapter = await navigator.gpu.requestAdapter(/* ... */); const features = adapter.features; // ...
2.1 适配器的抉择
对应 https://www.w3.org/TR/webgpu/…
本大节次要介绍 GPURequestAdapterOptions
接口。
在调用 navigator.gpu.requestAdapter
办法时,能够传入一个非空的对象来让浏览器抉择一个适合的适配器。
dictionary GPURequestAdapterOptions {
GPUPowerPreference powerPreference;
boolean forceFallbackAdapter = false;
};
enum GPUPowerPreference {
"low-power",
"high-performance"
};
GPURequestAdapterOptions
接口有俩成员:
- powerPreference,
GPUPowerPreference
类型 - forceFallbackAdapter,Boolean 类型,默认为 false
powerPreference,批示浏览器引擎抉择哪个适配器,次要针对的是多显卡的操作系统(例如,一张核芯显卡加一张独立显卡)。它只能是这三个值:undefined
(即什么都不传递)、"low-power"
、"high-performance"
。
forceFallbackAdapter,批示是否强制启用回退适配器,回退适配器的定义见 https://www.w3.org/TR/webgpu/…;个别不必管这个选项。
3 GPUAdapter
GPUAdapter
封装了一个适配器对象,有两个属性用于形容它的性能和限度。
想获取一个适配器对象,只需调用 navigator.gpu.requestAdapter()
办法并 await 它的 resolve 值即可,参考 办法:requestAdapter。
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUAdapter {
readonly attribute DOMString name;
[SameObject] readonly attribute GPUSupportedFeatures features;
[SameObject] readonly attribute GPUSupportedLimits limits;
readonly attribute boolean isFallbackAdapter;
Promise<GPUDevice> requestDevice(optional GPUDeviceDescriptor descriptor = {});
};
属性 name
是适配器的名称;
属性 features
是适配器的性能列表,为只读的 GPUSupportedFeatures
类型;
属性 limits
是适配器的最大限度,为只读的 GPUSupportedLimits
类型;
属性 isFallbackAdapter
通常不罕用。
requestDevice 办法
适配器最罕用的办法只有一个,requestDevice
,用来申请一个能拜访这个适配器(物理显卡)上古代图形 API 的对象,叫做设施,这是一种封装。它是一个异步办法,返回一个 resolve 值为 GPUDevice 对象的 Promise,你能够用 await 语法来获取设施对象。
这个办法有一个可选的 descriptor 对象参数,然而不能为空对象 {}
。
想晓得这个办法的工作过程,参考文档 4.4 GPUAdapter
GPUDeviceDescriptor 接口
这个接口是 requestDevice 办法 的可选参数的接口类型,形容适配器如何申请一个设施对象。
dictionary GPUDeviceDescriptor : GPUObjectDescriptorBase {sequence<GPUFeatureName> requiredFeatures = [];
record<DOMString, GPUSize64> requiredLimits = {};};
enum GPUFeatureName {
"depth-clamping",
"depth24unorm-stencil8",
"depth32float-stencil8",
"pipeline-statistics-query",
"texture-compression-bc",
"timestamp-query",
};
属性 requiredFeatures
是一个数组,可选的字符串枚举值是 GPUFeatureName
,默认是空数组。这个数组通知适配器对象要申请哪些性能,如果适配器上没有这些性能,申请设施就会失败。
属性 requiredLimits
是一个对象,其外部只能是键值对,且值的类型只能是 number(JavaScript 中)。它用于限度所申请的设施。如果适配器不能做出指定的限度,那么申请就会失败。对于限度列表,参考:WebGPU Spec 3.6.2 Limits。
4 GPUDevice
GPUDevice 封装了一个“设施”,并将此设施的能力通过 API 裸露进去。
<span style=”color: blue”>GPUDevice 是 WebGPU 的顶级接口,其余子接口均由它创立。</span>
想获取一个 GPUDevice
实例,调用适配器对象的 requestDevice()
办法即可。
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUDevice : EventTarget {[SameObject] readonly attribute GPUSupportedFeatures features;
[SameObject] readonly attribute GPUSupportedLimits limits;
[SameObject] readonly attribute GPUQueue queue;
undefined destroy();
GPUBuffer createBuffer(GPUBufferDescriptor descriptor);
GPUTexture createTexture(GPUTextureDescriptor descriptor);
GPUSampler createSampler(optional GPUSamplerDescriptor descriptor = {});
GPUExternalTexture importExternalTexture(GPUExternalTextureDescriptor descriptor);
GPUBindGroupLayout createBindGroupLayout(GPUBindGroupLayoutDescriptor descriptor);
GPUPipelineLayout createPipelineLayout(GPUPipelineLayoutDescriptor descriptor);
GPUBindGroup createBindGroup(GPUBindGroupDescriptor descriptor);
GPUShaderModule createShaderModule(GPUShaderModuleDescriptor descriptor);
GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
Promise<GPUComputePipeline> createComputePipelineAsync(GPUComputePipelineDescriptor descriptor);
Promise<GPURenderPipeline> createRenderPipelineAsync(GPURenderPipelineDescriptor descriptor);
GPUCommandEncoder createCommandEncoder(optional GPUCommandEncoderDescriptor descriptor = {});
GPURenderBundleEncoder createRenderBundleEncoder(GPURenderBundleEncoderDescriptor descriptor);
GPUQuerySet createQuerySet(GPUQuerySetDescriptor descriptor);
};
GPUDevice includes GPUObjectBase;
从下面这段 WebIDL 定义来看,一个 GPUDevice
领有三个属性:
- features:一个
GPUSupportedFeatures
对象,形容设施对象有什么个性,对于这个内容请参考 3.6.2 Limits - limits:一个
GPUSupportedLimits
对象,形容设施对象的最大限度,例如最多容许有多少个绑定组等信息,对于这个的详细资料请参考 3.6.2 Limits - queue:一个
GPUQueue
对象,是此设施对象的主队列。
因为设施对象的能力切实是很多,在此只能简略形容其大抵罕用用处,具体的办法用处、文档还失去标准文档中对应章节查看。
GPUDevice 对象是能够被序列化和反序列化的,这部分文档有须要的敌人请自行浏览官网文档。
5 译者注
适配器 GPUAdapter
对接的是物理显卡端,而对不同物理显卡在不同操作系统的古代图形 API(D3D12、Vulkan、Mental)的差别,则由 GPUDevice
来封装并提供对立的操作方法,例如创立 GPUBuffer
、GPUBindGroup
等。
这两者的申请操作均为异步编程,不过好在还挺简略,后续 WebGPU 的操作基本上都靠 GPUDevice
来操作,所以说设施对象是 WebGPU 中的顶级对象,它的位置与 WebGLRenderingContext
相似,然而又不齐全一样,当前会写比照文。
思考到适配器对象会有不可抗因素掉线,例如被拔掉,驱动掉了,所以每次进行某些操作之前,最好确认适配器和设施对象还在,如果不能用,最好再次申请。