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

WebGPU 规范篇 03 缓存对象求职学习资料

本文介绍了WebGPU 规范篇 03 缓存对象求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

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

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

  • WebGPU 中的缓存对象:GPUBuffer
  • 1 创建
    • GPUBuffer 的用途
  • 2 缓存映射
    • 异步映射:mapAsync 方法
    • 获取映射的缓存:getMappedRange 方法
    • 解除映射:unmap 方法
  • 常见用例
    • ① 创建 UBO


WebGPU 中的缓存对象:GPUBuffer

GPUBuffer 表示一块显存。显存中的数据是线性排列的,也就是可以通过偏移量来寻找显存中的数据。有些 GPUBuffer 可以被映射,被映射后的 GPUBuffer 可以通过 JavaScript 中的 ArrayBuffer 访问。

GPUBuffer 可以用 GPUDevice.createBuffer(descriptor) 来创建。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUBuffer {   Promise<undefined> mapAsync(GPUMapModeFlags mode, optional GPUSize64 offset = 0, optional GPUSize64 size);   ArrayBuffer getMappedRange(optional GPUSize64 offset = 0, optional GPUSize64 size);   undefined unmap();    undefined destroy(); }; GPUBuffer includes GPUObjectBase;

GPUBuffer 对象有如下几个方法:

  • mapAsync,即异步映射方法;
  • getMappedRange,获取映射后的范围,以 ArrayBuffer 表示;
  • unmap,取消映射;
  • destroy,销毁并回收此 GPUBuffer 指向的显存

GPUBuffer 对象是可以被序列化的。

1 创建

创建一个 GPUBuffer 需要用到 GPUBufferDescriptor 类型的对象。

dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {   required GPUSize64 size;   required GPUBufferUsageFlags usage;   boolean mappedAtCreation = false; };

对于设备对象和 descriptor 对象,是有要求的:

  • 如果设备对象丢失,那就无效;

  • 如果 descriptor.usage 不在设备对象允许的用途之内,也无效;

  • 如果 descriptor.usage 被同时设为 MAP_READMAP_WRITE,无效(即一个 GPUBuffer 不能同时用于映射独写);

  • 如果 descriptor.usage 被设为 MAP_READ,那么联合的用法只能是 COPY_DST

  • 如果 descriptor.usage 被设为 MAP_WRITE,那么联合的用法只能是 COPY_SRC

  • 如果 descriptor.mappedAtCreation 被设为 true,那么 descriptor.size 必须是 4 的倍数。

注意,descriptor.usage 既不是 MAP_READ 也不是 MAP_WRITE 时,将 descriptor.mappedAtCreation 设为 true 是可以的。

descriptor 的 size 属性指定了需要申请多大的显存,单位是 byte。

GPUBuffer 的用途

使用 GPUBufferUsage 来标识 GPUBuffer 对象的用途。

typedef [EnforceRange] unsigned long GPUBufferUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUBufferUsage {   const GPUFlagsConstant MAP_READ      = 0x0001; // 映射并用来独取   const GPUFlagsConstant MAP_WRITE     = 0x0002; // 映射并用来写入   const GPUFlagsConstant COPY_SRC      = 0x0004; // 可以作为拷贝源   const GPUFlagsConstant COPY_DST      = 0x0008; // 可以作为拷贝目标   const GPUFlagsConstant INDEX         = 0x0010; // 索引缓存   const GPUFlagsConstant VERTEX        = 0x0020; // 顶点缓存   const GPUFlagsConstant UNIFORM       = 0x0040; // Uniform 缓存   const GPUFlagsConstant STORAGE       = 0x0080; // 仅存储型缓存   const GPUFlagsConstant INDIRECT      = 0x0100; // 间接使用   const GPUFlagsConstant QUERY_RESOLVE = 0x0200; // 用于查询 };

用得比较多的是前 8 种。

2 缓存映射

JavaScript 可以对 GPUBuffer 对象进行映射操作,然后才能访问对应的显存。一旦 GPUBuffer 对象被映射,就可以调用其 getMappedRange 方法获取可被操作的显存,以 ArrayBuffer 表示。

进入映射状态的 GPUBuffer 对象所申请的那块显存不能被 GPU 使用,必须在提交给队列之前调用其 unmap 方法解除映射。

typedef [EnforceRange] unsigned long GPUMapModeFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUMapMode {   const GPUFlagsConstant READ  = 0x0001;   const GPUFlagsConstant WRITE = 0x0002; };

异步映射:mapAsync 方法

异步地映射 GPUBuffer 申请那块显存,它的返回的无定义的 Promise,或者你可以直接使用 await 语法等待其映射完成。

它有三个参数:

  • modeGPUMapMode 类型,表示映射之后用来干什么,这个是必选参数
  • offset,unsigned longlong 类型,表示从哪里开始映射,字节数量,默认是 0,必须是 8 的倍数
  • size,unsigned longlong 类型,表示映射多少大小,字节数量,默认是 GPUBuffer 申请显存的大小减去 offset 的差,必须是 4 的倍数

注意,mode 要与 GPUBuffer 的 usage 一致且只能二选一,且调用此方法之前 GPUBuffer 要未映射。

获取映射的缓存:getMappedRange 方法

它能返回一个 ArrayBuffer,即 GPUBuffer 申请那块显存的 CPU 端表达。

它有两个参数:

  • offset,可选参数,表示从申请的显存的哪个字节开始获取,如果不给就是 0;必须是 8 的倍数且不超申请的大小;
  • size,可选参数,表示要多长,如果不给就是申请的显存的最大值减去 offset 的差;是 4 的倍数。

注意,这个方法要在 GPUBuffer 映射的时候才能用。

解除映射:unmap 方法

调用后 GPUBuffer 对象所申请的显存就可以再被 GPU 使用了。

注意,当一个 MAP_READ 类型的且在创建时没设为映射的 GPUBuffer 被取消映射时,它所对应的 ArrayBuffer 上的所有修改都会无效。

关于为什么要显存的映射/取消映射,以后会出专门的一篇文章介绍。

常见用例

① 创建 UBO

const uniformBuffer = device.createBuffer({   size: 16,   usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, })

COPY_DST 通常就意味着有数据会复制到此 GPUBuffer 上,这种 GPUBuffer 可以通过 queue.writeBuffer 方法写入数据:

“` js
const color = new Float32Array([0, .5, 0, 1])
device.queue.writeBuffer(

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

  • WebGPU 中的缓存对象:GPUBuffer
  • 1 创建
    • GPUBuffer 的用途
  • 2 缓存映射
    • 异步映射:mapAsync 方法
    • 获取映射的缓存:getMappedRange 方法
    • 解除映射:unmap 方法
  • 常见用例
    • ① 创建 UBO


WebGPU 中的缓存对象:GPUBuffer

GPUBuffer 表示一块显存。显存中的数据是线性排列的,也就是可以通过偏移量来寻找显存中的数据。有些 GPUBuffer 可以被映射,被映射后的 GPUBuffer 可以通过 JavaScript 中的 ArrayBuffer 访问。

GPUBuffer 可以用 GPUDevice.createBuffer(descriptor) 来创建。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUBuffer {   Promise<undefined> mapAsync(GPUMapModeFlags mode, optional GPUSize64 offset = 0, optional GPUSize64 size);   ArrayBuffer getMappedRange(optional GPUSize64 offset = 0, optional GPUSize64 size);   undefined unmap();    undefined destroy(); }; GPUBuffer includes GPUObjectBase;

GPUBuffer 对象有如下几个方法:

  • mapAsync,即异步映射方法;
  • getMappedRange,获取映射后的范围,以 ArrayBuffer 表示;
  • unmap,取消映射;
  • destroy,销毁并回收此 GPUBuffer 指向的显存

GPUBuffer 对象是可以被序列化的。

1 创建

创建一个 GPUBuffer 需要用到 GPUBufferDescriptor 类型的对象。

dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {   required GPUSize64 size;   required GPUBufferUsageFlags usage;   boolean mappedAtCreation = false; };

对于设备对象和 descriptor 对象,是有要求的:

  • 如果设备对象丢失,那就无效;

  • 如果 descriptor.usage 不在设备对象允许的用途之内,也无效;

  • 如果 descriptor.usage 被同时设为 MAP_READMAP_WRITE,无效(即一个 GPUBuffer 不能同时用于映射独写);

  • 如果 descriptor.usage 被设为 MAP_READ,那么联合的用法只能是 COPY_DST

  • 如果 descriptor.usage 被设为 MAP_WRITE,那么联合的用法只能是 COPY_SRC

  • 如果 descriptor.mappedAtCreation 被设为 true,那么 descriptor.size 必须是 4 的倍数。

注意,descriptor.usage 既不是 MAP_READ 也不是 MAP_WRITE 时,将 descriptor.mappedAtCreation 设为 true 是可以的。

descriptor 的 size 属性指定了需要申请多大的显存,单位是 byte。

GPUBuffer 的用途

使用 GPUBufferUsage 来标识 GPUBuffer 对象的用途。

typedef [EnforceRange] unsigned long GPUBufferUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUBufferUsage {   const GPUFlagsConstant MAP_READ      = 0x0001; // 映射并用来独取   const GPUFlagsConstant MAP_WRITE     = 0x0002; // 映射并用来写入   const GPUFlagsConstant COPY_SRC      = 0x0004; // 可以作为拷贝源   const GPUFlagsConstant COPY_DST      = 0x0008; // 可以作为拷贝目标   const GPUFlagsConstant INDEX         = 0x0010; // 索引缓存   const GPUFlagsConstant VERTEX        = 0x0020; // 顶点缓存   const GPUFlagsConstant UNIFORM       = 0x0040; // Uniform 缓存   const GPUFlagsConstant STORAGE       = 0x0080; // 仅存储型缓存   const GPUFlagsConstant INDIRECT      = 0x0100; // 间接使用   const GPUFlagsConstant QUERY_RESOLVE = 0x0200; // 用于查询 };

用得比较多的是前 8 种。

2 缓存映射

JavaScript 可以对 GPUBuffer 对象进行映射操作,然后才能访问对应的显存。一旦 GPUBuffer 对象被映射,就可以调用其 getMappedRange 方法获取可被操作的显存,以 ArrayBuffer 表示。

进入映射状态的 GPUBuffer 对象所申请的那块显存不能被 GPU 使用,必须在提交给队列之前调用其 unmap 方法解除映射。

typedef [EnforceRange] unsigned long GPUMapModeFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUMapMode {   const GPUFlagsConstant READ  = 0x0001;   const GPUFlagsConstant WRITE = 0x0002; };

异步映射:mapAsync 方法

异步地映射 GPUBuffer 申请那块显存,它的返回的无定义的 Promise,或者你可以直接使用 await 语法等待其映射完成。

它有三个参数:

  • modeGPUMapMode 类型,表示映射之后用来干什么,这个是必选参数
  • offset,unsigned longlong 类型,表示从哪里开始映射,字节数量,默认是 0,必须是 8 的倍数
  • size,unsigned longlong 类型,表示映射多少大小,字节数量,默认是 GPUBuffer 申请显存的大小减去 offset 的差,必须是 4 的倍数

注意,mode 要与 GPUBuffer 的 usage 一致且只能二选一,且调用此方法之前 GPUBuffer 要未映射。

获取映射的缓存:getMappedRange 方法

它能返回一个 ArrayBuffer,即 GPUBuffer 申请那块显存的 CPU 端表达。

它有两个参数:

  • offset,可选参数,表示从申请的显存的哪个字节开始获取,如果不给就是 0;必须是 8 的倍数且不超申请的大小;
  • size,可选参数,表示要多长,如果不给就是申请的显存的最大值减去 offset 的差;是 4 的倍数。

注意,这个方法要在 GPUBuffer 映射的时候才能用。

解除映射:unmap 方法

调用后 GPUBuffer 对象所申请的显存就可以再被 GPU 使用了。

注意,当一个 MAP_READ 类型的且在创建时没设为映射的 GPUBuffer 被取消映射时,它所对应的 ArrayBuffer 上的所有修改都会无效。

关于为什么要显存的映射/取消映射,以后会出专门的一篇文章介绍。

常见用例

① 创建 UBO

const uniformBuffer = device.createBuffer({   size: 16,   usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, })

COPY_DST 通常就意味着有数据会复制到此 GPUBuffer 上,这种 GPUBuffer 可以通过 queue.writeBuffer 方法写入数据:

“` js
const color = new Float32Array([0, .5, 0, 1])
device.queue.writeBuffer(

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

  • WebGPU 中的缓存对象:GPUBuffer
  • 1 创建
    • GPUBuffer 的用途
  • 2 缓存映射
    • 异步映射:mapAsync 方法
    • 获取映射的缓存:getMappedRange 方法
    • 解除映射:unmap 方法
  • 常见用例
    • ① 创建 UBO


WebGPU 中的缓存对象:GPUBuffer

GPUBuffer 表示一块显存。显存中的数据是线性排列的,也就是可以通过偏移量来寻找显存中的数据。有些 GPUBuffer 可以被映射,被映射后的 GPUBuffer 可以通过 JavaScript 中的 ArrayBuffer 访问。

GPUBuffer 可以用 GPUDevice.createBuffer(descriptor) 来创建。

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUBuffer {   Promise<undefined> mapAsync(GPUMapModeFlags mode, optional GPUSize64 offset = 0, optional GPUSize64 size);   ArrayBuffer getMappedRange(optional GPUSize64 offset = 0, optional GPUSize64 size);   undefined unmap();    undefined destroy(); }; GPUBuffer includes GPUObjectBase;

GPUBuffer 对象有如下几个方法:

  • mapAsync,即异步映射方法;
  • getMappedRange,获取映射后的范围,以 ArrayBuffer 表示;
  • unmap,取消映射;
  • destroy,销毁并回收此 GPUBuffer 指向的显存

GPUBuffer 对象是可以被序列化的。

1 创建

创建一个 GPUBuffer 需要用到 GPUBufferDescriptor 类型的对象。

dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {   required GPUSize64 size;   required GPUBufferUsageFlags usage;   boolean mappedAtCreation = false; };

对于设备对象和 descriptor 对象,是有要求的:

  • 如果设备对象丢失,那就无效;

  • 如果 descriptor.usage 不在设备对象允许的用途之内,也无效;

  • 如果 descriptor.usage 被同时设为 MAP_READMAP_WRITE,无效(即一个 GPUBuffer 不能同时用于映射独写);

  • 如果 descriptor.usage 被设为 MAP_READ,那么联合的用法只能是 COPY_DST

  • 如果 descriptor.usage 被设为 MAP_WRITE,那么联合的用法只能是 COPY_SRC

  • 如果 descriptor.mappedAtCreation 被设为 true,那么 descriptor.size 必须是 4 的倍数。

注意,descriptor.usage 既不是 MAP_READ 也不是 MAP_WRITE 时,将 descriptor.mappedAtCreation 设为 true 是可以的。

descriptor 的 size 属性指定了需要申请多大的显存,单位是 byte。

GPUBuffer 的用途

使用 GPUBufferUsage 来标识 GPUBuffer 对象的用途。

typedef [EnforceRange] unsigned long GPUBufferUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUBufferUsage {   const GPUFlagsConstant MAP_READ      = 0x0001; // 映射并用来独取   const GPUFlagsConstant MAP_WRITE     = 0x0002; // 映射并用来写入   const GPUFlagsConstant COPY_SRC      = 0x0004; // 可以作为拷贝源   const GPUFlagsConstant COPY_DST      = 0x0008; // 可以作为拷贝目标   const GPUFlagsConstant INDEX         = 0x0010; // 索引缓存   const GPUFlagsConstant VERTEX        = 0x0020; // 顶点缓存   const GPUFlagsConstant UNIFORM       = 0x0040; // Uniform 缓存   const GPUFlagsConstant STORAGE       = 0x0080; // 仅存储型缓存   const GPUFlagsConstant INDIRECT      = 0x0100; // 间接使用   const GPUFlagsConstant QUERY_RESOLVE = 0x0200; // 用于查询 };

用得比较多的是前 8 种。

2 缓存映射

JavaScript 可以对 GPUBuffer 对象进行映射操作,然后才能访问对应的显存。一旦 GPUBuffer 对象被映射,就可以调用其 getMappedRange 方法获取可被操作的显存,以 ArrayBuffer 表示。

进入映射状态的 GPUBuffer 对象所申请的那块显存不能被 GPU 使用,必须在提交给队列之前调用其 unmap 方法解除映射。

typedef [EnforceRange] unsigned long GPUMapModeFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUMapMode {   const GPUFlagsConstant READ  = 0x0001;   const GPUFlagsConstant WRITE = 0x0002; };

异步映射:mapAsync 方法

异步地映射 GPUBuffer 申请那块显存,它的返回的无定义的 Promise,或者你可以直接使用 await 语法等待其映射完成。

它有三个参数:

  • modeGPUMapMode 类型,表示映射之后用来干什么,这个是必选参数
  • offset,unsigned longlong 类型,表示从哪里开始映射,字节数量,默认是 0,必须是 8 的倍数
  • size,unsigned longlong 类型,表示映射多少大小,字节数量,默认是 GPUBuffer 申请显存的大小减去 offset 的差,必须是 4 的倍数

注意,mode 要与 GPUBuffer 的 usage 一致且只能二选一,且调用此方法之前 GPUBuffer 要未映射。

获取映射的缓存:getMappedRange 方法

它能返回一个 ArrayBuffer,即 GPUBuffer 申请那块显存的 CPU 端表达。

它有两个参数:

  • offset,可选参数,表示从申请的显存的哪个字节开始获取,如果不给就是 0;必须是 8 的倍数且不超申请的大小;
  • size,可选参数,表示要多长,如果不给就是申请的显存的最大值减去 offset 的差;是 4 的倍数。

注意,这个方法要在 GPUBuffer 映射的时候才能用。

解除映射:unmap 方法

调用后 GPUBuffer 对象所申请的显存就可以再被 GPU 使用了。

注意,当一个 MAP_READ 类型的且在创建时没设为映射的 GPUBuffer 被取消映射时,它所对应的 ArrayBuffer 上的所有修改都会无效。

关于为什么要显存的映射/取消映射,以后会出专门的一篇文章介绍。

常见用例

① 创建 UBO

const uniformBuffer = device.createBuffer({   size: 16,   usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, })

COPY_DST 通常就意味着有数据会复制到此 GPUBuffer 上,这种 GPUBuffer 可以通过 queue.writeBuffer 方法写入数据:

“` js
const color = new Float32Array([0, .5, 0, 1])
device.queue.writeBuffer(

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

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WebGPU 规范篇 03 缓存对象求职学习资料
分享到: 更多 (0)

评论 抢沙发

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

b2b链

联系我们联系我们