关于gpu:WebGPU-规范篇-02-对象初始化

37次阅读

共计 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 来封装并提供对立的操作方法,例如创立 GPUBufferGPUBindGroup 等。

这两者的申请操作均为异步编程,不过好在还挺简略,后续 WebGPU 的操作基本上都靠 GPUDevice 来操作,所以说设施对象是 WebGPU 中的顶级对象,它的位置与 WebGLRenderingContext 相似,然而又不齐全一样,当前会写比照文。

思考到适配器对象会有不可抗因素掉线,例如被拔掉,驱动掉了,所以每次进行某些操作之前,最好确认适配器和设施对象还在,如果不能用,最好再次申请。

正文完
 0