区块链技术博客
www.b2bchain.cn

WebGPU 规范篇 10 指令编码与队列求职学习资料

本文介绍了WebGPU 规范篇 10 指令编码与队列求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 指令缓存:GPUCommandBuffer
    • 如何创建
  • 2 指令编码器:GPUCommandEncoder
    • 2.1 如何创建
    • 2.2 用途:启动/创建一个可编程通道
    • 2.2 用途:缓存复制
      • 举例
    • 2.3 用途:图像/纹理复制
      • 方法定义


介绍原文 11 章、部分 12 章和 17 章的内容。

1 指令缓存:GPUCommandBuffer

指令缓存(又译作命令缓冲区),GPUCommandBuffer,是一个能事先存储 GPU 指令的存储容器。它可以提交给 GPUQueue 执行。每个 GPU 指令代表一个要被 GPU 执行的任务,可以是绘图、设置数据、复制资源等。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandBuffer {   readonly attribute Promise<double> executionTime; }; GPUCommandBuffer includes GPUObjectBase;

它有一个 resolve 值是 double 数值的 Promise,其 resolve 值是指令缓存上的预存 GPU 指令的执行时间。

如果在创建指令编码器时,其参数对象的 measureExecutionTime 若为 true 才有效,若为 false,这个 Promise 会 reject,你可以捕获一个 OperationError 错误。

如何创建

调用 指令编码器 的 finish 方法,即可获取指令缓存对象。它一般用来提交给队列:

device.queue.submit([   commandEncoder.finish() ])

2 指令编码器:GPUCommandEncoder

用途:①创建通道编码器;②复制 GPUBuffer/GPUTexture;③调试、查询等其他功能(略)

本文主要介绍常用的 ①、② 两种功能。

注意,指令编码器用完并提交给队列后,它就变得不再可用。

扩展阅读:Metal 中的指令编码器

它的 WebIDL 定义如下:

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandEncoder {     GPURenderPassEncoder beginRenderPass(GPURenderPassDescriptor descriptor);     GPUComputePassEncoder beginComputePass(optional GPUComputePassDescriptor descriptor = {});      undefined copyBufferToBuffer(         GPUBuffer source,         GPUSize64 sourceOffset,         GPUBuffer destination,         GPUSize64 destinationOffset,         GPUSize64 size);      undefined copyBufferToTexture(         GPUImageCopyBuffer source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined copyTextureToBuffer(         GPUImageCopyTexture source,         GPUImageCopyBuffer destination,         GPUExtent3D copySize);      undefined copyTextureToTexture(         GPUImageCopyTexture source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined pushDebugGroup(USVString groupLabel);     undefined popDebugGroup();     undefined insertDebugMarker(USVString markerLabel);      undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);      undefined resolveQuerySet(         GPUQuerySet querySet,         GPUSize32 firstQuery,         GPUSize32 queryCount,         GPUBuffer destination,         GPUSize64 destinationOffset);      GPUCommandBuffer finish(optional GPUCommandBufferDescriptor descriptor = {}); }; GPUCommandEncoder includes GPUObjectBase;

2.1 如何创建

由设备对象的 createCommandEncoder 方法创建

const commandEncoder = device.createCommandEncoder()

它有一个可选的参数对象,类型是 GPUCommandEncoderDescriptor,一个 JavaScript Object:

dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase {   boolean measureExecutionTime = false; };

它的用途在指令缓存的创建小节已介绍过,可选属性 measureExecutionTime 表示是否可以测量指令的运行时间。

2.2 用途:启动/创建一个可编程通道

通过指令编码器的 beginRenderPassbeginComputePass 可以分别启动/创建一个渲染通道 或 计算通道,这两个方法的返回值自然就是渲染通道编码器(GPURenderPassEncoder)和计算通道编码器(GPUComputePassEncoder)。

// 渲染通道编码器 const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor)  // 计算通道编码器 const computeEncoder = commandEncoder.beginComputePass()

其中,渲染通道编码器所需的参数对象 renderPassDescriptor 的细节见通道编码器文章。

指令编码器不负责通道编码器的结束,而是由通道编码器自己结束。

2.2 用途:缓存复制

copyBufferToBuffer 方法,用于 GPUBuffer 之间的拷贝。

undefined copyBufferToBuffer(   GPUBuffer source,   GPUSize64 sourceOffset,   GPUBuffer destination,   GPUSize64 destinationOffset,   GPUSize64 size );

即从 source 复制到 destination,在 Buffer 一文中有简略提及它与直接 map/unmap 来赋予数据的差异,那就是这个方法是在 GPU 中操作,而 map/unmap 直接写入是在 CPU 端操作 GPUBuffer 的数据。

举例

const gpuWriteBuffer = device.createBuffer({ /* 用于写 */}) const gpuReadBuffer = device.createBuffer({ /* 用于读 */})  // 从一个复制到另一个 copyEncoder.copyBufferToBuffer(   gpuWriteBuffer /* 源显存(对象) */,   0 /* 起始字节(从哪开始读) */,   gpuReadBuffer /* 目标显存(对象) */,   0 /* 起始字节(从哪开始写) */,   4 /* 复制多大的内容,单位 byte */ );

2.3 用途:图像/纹理复制

主要是 copyBufferToTexturecopyTextureToBuffercopyTextureToTexture 方法,用于 GPUBuffer 和 GPUTexture、GPUTexture 和 GPUTexture 之间的复制。

需要用到 GPUImageCopyBufferGPUImageCopyTextureGPUExtent3D 这三种 dictionary 的定义。

方法定义

不嫌麻烦,从上面 GPUCommandEncoder 再复制一次定义。

undefined copyBufferToTexture(   GPUImageCopyBuffer source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );  undefined copyTextureToBuffer(   GPUImageCopyTexture source,   GPUImageCopyBuffer destination,   GPUExtent3D copySize );  undefined copyTextureToTexture(   GPUImageCopyTexture source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );

它们作用的级别是指令级别,是被安排在指令队列上的,即 GPU 中的操作,而不是在 CPU 端,这一点与 copyBufferToBuffer 是一样的。

每个方法都有合规性检验,主要是对参数进行校验,就不展开了。这里用到了三个类型:

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 指令缓存:GPUCommandBuffer
    • 如何创建
  • 2 指令编码器:GPUCommandEncoder
    • 2.1 如何创建
    • 2.2 用途:启动/创建一个可编程通道
    • 2.2 用途:缓存复制
      • 举例
    • 2.3 用途:图像/纹理复制
      • 方法定义


介绍原文 11 章、部分 12 章和 17 章的内容。

1 指令缓存:GPUCommandBuffer

指令缓存(又译作命令缓冲区),GPUCommandBuffer,是一个能事先存储 GPU 指令的存储容器。它可以提交给 GPUQueue 执行。每个 GPU 指令代表一个要被 GPU 执行的任务,可以是绘图、设置数据、复制资源等。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandBuffer {   readonly attribute Promise<double> executionTime; }; GPUCommandBuffer includes GPUObjectBase;

它有一个 resolve 值是 double 数值的 Promise,其 resolve 值是指令缓存上的预存 GPU 指令的执行时间。

如果在创建指令编码器时,其参数对象的 measureExecutionTime 若为 true 才有效,若为 false,这个 Promise 会 reject,你可以捕获一个 OperationError 错误。

如何创建

调用 指令编码器 的 finish 方法,即可获取指令缓存对象。它一般用来提交给队列:

device.queue.submit([   commandEncoder.finish() ])

2 指令编码器:GPUCommandEncoder

用途:①创建通道编码器;②复制 GPUBuffer/GPUTexture;③调试、查询等其他功能(略)

本文主要介绍常用的 ①、② 两种功能。

注意,指令编码器用完并提交给队列后,它就变得不再可用。

扩展阅读:Metal 中的指令编码器

它的 WebIDL 定义如下:

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandEncoder {     GPURenderPassEncoder beginRenderPass(GPURenderPassDescriptor descriptor);     GPUComputePassEncoder beginComputePass(optional GPUComputePassDescriptor descriptor = {});      undefined copyBufferToBuffer(         GPUBuffer source,         GPUSize64 sourceOffset,         GPUBuffer destination,         GPUSize64 destinationOffset,         GPUSize64 size);      undefined copyBufferToTexture(         GPUImageCopyBuffer source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined copyTextureToBuffer(         GPUImageCopyTexture source,         GPUImageCopyBuffer destination,         GPUExtent3D copySize);      undefined copyTextureToTexture(         GPUImageCopyTexture source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined pushDebugGroup(USVString groupLabel);     undefined popDebugGroup();     undefined insertDebugMarker(USVString markerLabel);      undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);      undefined resolveQuerySet(         GPUQuerySet querySet,         GPUSize32 firstQuery,         GPUSize32 queryCount,         GPUBuffer destination,         GPUSize64 destinationOffset);      GPUCommandBuffer finish(optional GPUCommandBufferDescriptor descriptor = {}); }; GPUCommandEncoder includes GPUObjectBase;

2.1 如何创建

由设备对象的 createCommandEncoder 方法创建

const commandEncoder = device.createCommandEncoder()

它有一个可选的参数对象,类型是 GPUCommandEncoderDescriptor,一个 JavaScript Object:

dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase {   boolean measureExecutionTime = false; };

它的用途在指令缓存的创建小节已介绍过,可选属性 measureExecutionTime 表示是否可以测量指令的运行时间。

2.2 用途:启动/创建一个可编程通道

通过指令编码器的 beginRenderPassbeginComputePass 可以分别启动/创建一个渲染通道 或 计算通道,这两个方法的返回值自然就是渲染通道编码器(GPURenderPassEncoder)和计算通道编码器(GPUComputePassEncoder)。

// 渲染通道编码器 const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor)  // 计算通道编码器 const computeEncoder = commandEncoder.beginComputePass()

其中,渲染通道编码器所需的参数对象 renderPassDescriptor 的细节见通道编码器文章。

指令编码器不负责通道编码器的结束,而是由通道编码器自己结束。

2.2 用途:缓存复制

copyBufferToBuffer 方法,用于 GPUBuffer 之间的拷贝。

undefined copyBufferToBuffer(   GPUBuffer source,   GPUSize64 sourceOffset,   GPUBuffer destination,   GPUSize64 destinationOffset,   GPUSize64 size );

即从 source 复制到 destination,在 Buffer 一文中有简略提及它与直接 map/unmap 来赋予数据的差异,那就是这个方法是在 GPU 中操作,而 map/unmap 直接写入是在 CPU 端操作 GPUBuffer 的数据。

举例

const gpuWriteBuffer = device.createBuffer({ /* 用于写 */}) const gpuReadBuffer = device.createBuffer({ /* 用于读 */})  // 从一个复制到另一个 copyEncoder.copyBufferToBuffer(   gpuWriteBuffer /* 源显存(对象) */,   0 /* 起始字节(从哪开始读) */,   gpuReadBuffer /* 目标显存(对象) */,   0 /* 起始字节(从哪开始写) */,   4 /* 复制多大的内容,单位 byte */ );

2.3 用途:图像/纹理复制

主要是 copyBufferToTexturecopyTextureToBuffercopyTextureToTexture 方法,用于 GPUBuffer 和 GPUTexture、GPUTexture 和 GPUTexture 之间的复制。

需要用到 GPUImageCopyBufferGPUImageCopyTextureGPUExtent3D 这三种 dictionary 的定义。

方法定义

不嫌麻烦,从上面 GPUCommandEncoder 再复制一次定义。

undefined copyBufferToTexture(   GPUImageCopyBuffer source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );  undefined copyTextureToBuffer(   GPUImageCopyTexture source,   GPUImageCopyBuffer destination,   GPUExtent3D copySize );  undefined copyTextureToTexture(   GPUImageCopyTexture source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );

它们作用的级别是指令级别,是被安排在指令队列上的,即 GPU 中的操作,而不是在 CPU 端,这一点与 copyBufferToBuffer 是一样的。

每个方法都有合规性检验,主要是对参数进行校验,就不展开了。这里用到了三个类型:

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 指令缓存:GPUCommandBuffer
    • 如何创建
  • 2 指令编码器:GPUCommandEncoder
    • 2.1 如何创建
    • 2.2 用途:启动/创建一个可编程通道
    • 2.2 用途:缓存复制
      • 举例
    • 2.3 用途:图像/纹理复制
      • 方法定义


介绍原文 11 章、部分 12 章和 17 章的内容。

1 指令缓存:GPUCommandBuffer

指令缓存(又译作命令缓冲区),GPUCommandBuffer,是一个能事先存储 GPU 指令的存储容器。它可以提交给 GPUQueue 执行。每个 GPU 指令代表一个要被 GPU 执行的任务,可以是绘图、设置数据、复制资源等。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandBuffer {   readonly attribute Promise<double> executionTime; }; GPUCommandBuffer includes GPUObjectBase;

它有一个 resolve 值是 double 数值的 Promise,其 resolve 值是指令缓存上的预存 GPU 指令的执行时间。

如果在创建指令编码器时,其参数对象的 measureExecutionTime 若为 true 才有效,若为 false,这个 Promise 会 reject,你可以捕获一个 OperationError 错误。

如何创建

调用 指令编码器 的 finish 方法,即可获取指令缓存对象。它一般用来提交给队列:

device.queue.submit([   commandEncoder.finish() ])

2 指令编码器:GPUCommandEncoder

用途:①创建通道编码器;②复制 GPUBuffer/GPUTexture;③调试、查询等其他功能(略)

本文主要介绍常用的 ①、② 两种功能。

注意,指令编码器用完并提交给队列后,它就变得不再可用。

扩展阅读:Metal 中的指令编码器

它的 WebIDL 定义如下:

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandEncoder {     GPURenderPassEncoder beginRenderPass(GPURenderPassDescriptor descriptor);     GPUComputePassEncoder beginComputePass(optional GPUComputePassDescriptor descriptor = {});      undefined copyBufferToBuffer(         GPUBuffer source,         GPUSize64 sourceOffset,         GPUBuffer destination,         GPUSize64 destinationOffset,         GPUSize64 size);      undefined copyBufferToTexture(         GPUImageCopyBuffer source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined copyTextureToBuffer(         GPUImageCopyTexture source,         GPUImageCopyBuffer destination,         GPUExtent3D copySize);      undefined copyTextureToTexture(         GPUImageCopyTexture source,         GPUImageCopyTexture destination,         GPUExtent3D copySize);      undefined pushDebugGroup(USVString groupLabel);     undefined popDebugGroup();     undefined insertDebugMarker(USVString markerLabel);      undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);      undefined resolveQuerySet(         GPUQuerySet querySet,         GPUSize32 firstQuery,         GPUSize32 queryCount,         GPUBuffer destination,         GPUSize64 destinationOffset);      GPUCommandBuffer finish(optional GPUCommandBufferDescriptor descriptor = {}); }; GPUCommandEncoder includes GPUObjectBase;

2.1 如何创建

由设备对象的 createCommandEncoder 方法创建

const commandEncoder = device.createCommandEncoder()

它有一个可选的参数对象,类型是 GPUCommandEncoderDescriptor,一个 JavaScript Object:

dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase {   boolean measureExecutionTime = false; };

它的用途在指令缓存的创建小节已介绍过,可选属性 measureExecutionTime 表示是否可以测量指令的运行时间。

2.2 用途:启动/创建一个可编程通道

通过指令编码器的 beginRenderPassbeginComputePass 可以分别启动/创建一个渲染通道 或 计算通道,这两个方法的返回值自然就是渲染通道编码器(GPURenderPassEncoder)和计算通道编码器(GPUComputePassEncoder)。

// 渲染通道编码器 const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor)  // 计算通道编码器 const computeEncoder = commandEncoder.beginComputePass()

其中,渲染通道编码器所需的参数对象 renderPassDescriptor 的细节见通道编码器文章。

指令编码器不负责通道编码器的结束,而是由通道编码器自己结束。

2.2 用途:缓存复制

copyBufferToBuffer 方法,用于 GPUBuffer 之间的拷贝。

undefined copyBufferToBuffer(   GPUBuffer source,   GPUSize64 sourceOffset,   GPUBuffer destination,   GPUSize64 destinationOffset,   GPUSize64 size );

即从 source 复制到 destination,在 Buffer 一文中有简略提及它与直接 map/unmap 来赋予数据的差异,那就是这个方法是在 GPU 中操作,而 map/unmap 直接写入是在 CPU 端操作 GPUBuffer 的数据。

举例

const gpuWriteBuffer = device.createBuffer({ /* 用于写 */}) const gpuReadBuffer = device.createBuffer({ /* 用于读 */})  // 从一个复制到另一个 copyEncoder.copyBufferToBuffer(   gpuWriteBuffer /* 源显存(对象) */,   0 /* 起始字节(从哪开始读) */,   gpuReadBuffer /* 目标显存(对象) */,   0 /* 起始字节(从哪开始写) */,   4 /* 复制多大的内容,单位 byte */ );

2.3 用途:图像/纹理复制

主要是 copyBufferToTexturecopyTextureToBuffercopyTextureToTexture 方法,用于 GPUBuffer 和 GPUTexture、GPUTexture 和 GPUTexture 之间的复制。

需要用到 GPUImageCopyBufferGPUImageCopyTextureGPUExtent3D 这三种 dictionary 的定义。

方法定义

不嫌麻烦,从上面 GPUCommandEncoder 再复制一次定义。

undefined copyBufferToTexture(   GPUImageCopyBuffer source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );  undefined copyTextureToBuffer(   GPUImageCopyTexture source,   GPUImageCopyBuffer destination,   GPUExtent3D copySize );  undefined copyTextureToTexture(   GPUImageCopyTexture source,   GPUImageCopyTexture destination,   GPUExtent3D copySize );

它们作用的级别是指令级别,是被安排在指令队列上的,即 GPU 中的操作,而不是在 CPU 端,这一点与 copyBufferToBuffer 是一样的。

每个方法都有合规性检验,主要是对参数进行校验,就不展开了。这里用到了三个类型:

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WebGPU 规范篇 10 指令编码与队列求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们