Ver código fonte

Update WebGPU types

sebavan 5 anos atrás
pai
commit
49bbbc048b

+ 6 - 1
src/Engines/WebGPU/webgpuConstants.ts

@@ -156,9 +156,14 @@ export class WebGPUConstants {
     public static readonly GPUCompareFunction_always: GPUCompareFunction = "always";
 
     public static readonly GPUBindingType_uniformBuffer: GPUBindingType = "uniform-buffer";
+    public static readonly GPUBindingType_storageBuffer: GPUBindingType = "storage-buffer";
+    public static readonly GPUBindingType_readonlyStorageBuffer: GPUBindingType = "readonly-storage-buffer";
     public static readonly GPUBindingType_sampler: GPUBindingType = "sampler";
+    public static readonly GPUBindingType_comparisonSampler: GPUBindingType = "comparison-sampler";
     public static readonly GPUBindingType_sampledTexture: GPUBindingType = "sampled-texture";
-    public static readonly GPUBindingType_storageBuffer: GPUBindingType = "storage-buffer";
+    public static readonly GPUBindingType_storageTexture: GPUBindingType = "storage-texture";
+    public static readonly GPUBindingType_readonlyStorageTexture: GPUBindingType = "readonly-storage-texture";
+    public static readonly GPUBindingType_writeonlyStorageTexture: GPUBindingType = "writeonly-storage-texture";
 
     public static readonly GPUInputStepMode_vertex: GPUInputStepMode = "vertex";
     public static readonly GPUInputStepMode_instance: GPUInputStepMode = "instance";

+ 24 - 21
src/Engines/webgpuEngine.ts

@@ -1021,24 +1021,24 @@ export class WebGPUEngine extends Engine {
         };
 
         const commandEncoder = this._device.createCommandEncoder({});
-        const rowPitch = Math.ceil(width * 4 / 256) * 256;
+        const bytesPerRow = Math.ceil(width * 4 / 256) * 256;
 
         let dataBuffer: DataBuffer;
-        if (rowPitch == width * 4) {
+        if (bytesPerRow == width * 4) {
             dataBuffer = this._createBuffer(pixels, WebGPUConstants.GPUBufferUsage_TRANSFER_SRC | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
             const bufferView: GPUBufferCopyView = {
                 buffer: dataBuffer.underlyingResource,
-                rowPitch: rowPitch,
-                imageHeight: height,
+                bytesPerRow: bytesPerRow,
+                rowsPerImage: height,
                 offset: 0,
             };
             commandEncoder.copyBufferToTexture(bufferView, textureView, textureExtent);
         } else {
-            const alignedPixels = new Uint8Array(rowPitch * height);
+            const alignedPixels = new Uint8Array(bytesPerRow * height);
             let pixelsIndex = 0;
             for (let y = 0; y < height; ++y) {
                 for (let x = 0; x < width; ++x) {
-                    let i = x * 4 + y * rowPitch;
+                    let i = x * 4 + y * bytesPerRow;
 
                     alignedPixels[i] = (pixels as any)[pixelsIndex];
                     alignedPixels[i + 1] = (pixels as any)[pixelsIndex + 1];
@@ -1050,8 +1050,8 @@ export class WebGPUEngine extends Engine {
             dataBuffer = this._createBuffer(alignedPixels, WebGPUConstants.GPUBufferUsage_TRANSFER_SRC | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
             const bufferView: GPUBufferCopyView = {
                 buffer: dataBuffer.underlyingResource,
-                rowPitch: rowPitch,
-                imageHeight: height,
+                bytesPerRow: bytesPerRow,
+                rowsPerImage: height,
                 offset: 0,
             };
             commandEncoder.copyBufferToTexture(bufferView, textureView, textureExtent);
@@ -1990,15 +1990,15 @@ export class WebGPUEngine extends Engine {
         for (let i = 0; i < webgpuPipelineContext.orderedUBOsAndSamplers.length; i++) {
             const setDefinition = webgpuPipelineContext.orderedUBOsAndSamplers[i];
             if (setDefinition === undefined) {
-                const bindings: GPUBindGroupLayoutBinding[] = [];
+                const entries: GPUBindGroupLayoutEntry[] = [];
                 const uniformsBindGroupLayout = this._device.createBindGroupLayout({
-                    bindings,
+                    entries,
                 });
                 bindGroupLayouts[i] = uniformsBindGroupLayout;
                 continue;
             }
 
-            const bindings: GPUBindGroupLayoutBinding[] = [];
+            const entries: GPUBindGroupLayoutEntry[] = [];
             for (let j = 0; j < setDefinition.length; j++) {
                 const bindingDefinition = webgpuPipelineContext.orderedUBOsAndSamplers[i][j];
                 if (bindingDefinition === undefined) {
@@ -2007,13 +2007,16 @@ export class WebGPUEngine extends Engine {
 
                 // TODO WEBGPU. Optimize shared samplers visibility for vertex/framgent.
                 if (bindingDefinition.isSampler) {
-                    bindings.push({
+                    entries.push({
                         binding: j,
                         visibility: WebGPUConstants.GPUShaderStageBit_VERTEX | WebGPUConstants.GPUShaderStageBit_FRAGMENT,
                         type: WebGPUConstants.GPUBindingType_sampledTexture,
-                        textureDimension: bindingDefinition.textureDimension,
+                        viewDimension: bindingDefinition.textureDimension,
                         // TODO WEBGPU. Handle texture component type properly.
                         // textureComponentType?: GPUTextureComponentType,
+                        // multisampled?: boolean;
+                        // hasDynamicOffset?: boolean;
+                        // storageTextureFormat?: GPUTextureFormat;
                     }, {
                         // TODO WEBGPU. No Magic + 1 (coming from current 1 texture 1 sampler startegy).
                         binding: j + 1,
@@ -2022,7 +2025,7 @@ export class WebGPUEngine extends Engine {
                     });
                 }
                 else {
-                    bindings.push({
+                    entries.push({
                         binding: j,
                         visibility: WebGPUConstants.GPUShaderStageBit_VERTEX | WebGPUConstants.GPUShaderStageBit_FRAGMENT,
                         type: WebGPUConstants.GPUBindingType_uniformBuffer,
@@ -2030,9 +2033,9 @@ export class WebGPUEngine extends Engine {
                 }
             }
 
-            if (bindings.length > 0) {
+            if (entries.length > 0) {
                 const uniformsBindGroupLayout = this._device.createBindGroupLayout({
-                    bindings,
+                    entries,
                 });
                 bindGroupLayouts[i] = uniformsBindGroupLayout;
             }
@@ -2159,7 +2162,7 @@ export class WebGPUEngine extends Engine {
                 continue;
             }
 
-            const bindings: GPUBindGroupBinding[] = [];
+            const entries: GPUBindGroupEntry[] = [];
             for (let j = 0; j < setDefinition.length; j++) {
                 const bindingDefinition = webgpuPipelineContext.orderedUBOsAndSamplers[i][j];
                 if (bindingDefinition === undefined) {
@@ -2176,7 +2179,7 @@ export class WebGPUEngine extends Engine {
                             bindingInfo.texture._webGPUSampler = gpuSampler;
                         }
 
-                        bindings.push({
+                        entries.push({
                             binding: bindingInfo.textureBinding,
                             resource: bindingInfo.texture._webGPUTextureView!,
                         }, {
@@ -2192,7 +2195,7 @@ export class WebGPUEngine extends Engine {
                     const dataBuffer = this._uniformsBuffers[bindingDefinition.name];
                     if (dataBuffer) {
                         const webgpuBuffer = dataBuffer.underlyingResource as GPUBuffer;
-                        bindings.push({
+                        entries.push({
                             binding: j,
                             resource: {
                                 buffer: webgpuBuffer,
@@ -2207,7 +2210,7 @@ export class WebGPUEngine extends Engine {
                 }
             }
 
-            if (bindings.length > 0) {
+            if (entries.length > 0) {
                 let groupLayout: GPUBindGroupLayout;
                 if (bindGroupLayouts && bindGroupLayouts[i]) {
                     groupLayout = bindGroupLayouts[i];
@@ -2217,7 +2220,7 @@ export class WebGPUEngine extends Engine {
                 }
                 bindGroups[i] = this._device.createBindGroup({
                     layout: groupLayout,
-                    entries: bindings,
+                    entries,
                 });
             }
         }

+ 43 - 30
src/LibDeclarations/webgpu.d.ts

@@ -1,7 +1,9 @@
-// https://github.com/gpuweb/gpuweb/blob/402b69138fbedf4a3c9c85cd1bf7e1cc27c1b34e/spec/index.bs
+// https://github.com/gpuweb/gpuweb/blob/0a48816412b5d08a5fb8b89005e019165a1a2c63/spec/index.bs
 // except #280 which removed setSubData
 // except #494 which reverted the addition of GPUAdapter.limits
-// v 0.0.19
+// except #591 which removed Uint32Array from GPUShaderModuleDescriptor
+// including #543 which adds GPUPipelineBase.getBindGroupLayout
+// v 0.0.24
 
 interface GPUColorDict {
   a: number;
@@ -36,15 +38,18 @@ type GPUBindingResource =
   | GPUTextureView
   | GPUBufferBinding;
 type GPUExtensionName =
-  | "anisotropic-filtering";
+  | "texture-compression-bc";
 type GPUAddressMode = "clamp-to-edge" | "repeat" | "mirror-repeat";
 type GPUBindingType =
   | "uniform-buffer"
   | "storage-buffer"
   | "readonly-storage-buffer"
   | "sampler"
+  | "comparison-sampler"
   | "sampled-texture"
-  | "storage-texture";
+  | "storage-texture"
+  | "readonly-storage-texture"
+  | "writeonly-storage-texture";
 type GPUBlendFactor =
   | "zero"
   | "one"
@@ -216,29 +221,30 @@ type GPUTextureUsageFlags = number;
 //   OUTPUT_ATTACHMENT: 0x10;
 // };
 
-interface GPUBindGroupBinding {
+interface GPUBindGroupEntry {
   binding: number;
   resource: GPUBindingResource;
 }
 
 interface GPUBindGroupDescriptor extends GPUObjectDescriptorBase {
   layout: GPUBindGroupLayout;
-  entries: GPUBindGroupBinding[];
+  entries: Iterable<GPUBindGroupEntry>;
 }
 
-interface GPUBindGroupLayoutBinding {
+interface GPUBindGroupLayoutEntry {
   binding: number;
   visibility: GPUShaderStageFlags;
   type: GPUBindingType;
-  textureDimension?: GPUTextureViewDimension;
+  viewDimension?: GPUTextureViewDimension;
   textureComponentType?: GPUTextureComponentType;
   multisampled?: boolean;
   hasDynamicOffset?: boolean;
+  storageTextureFormat?: GPUTextureFormat;
 }
 
 interface GPUBindGroupLayoutDescriptor
   extends GPUObjectDescriptorBase {
-  bindings?: GPUBindGroupLayoutBinding[];
+  entries: Iterable<GPUBindGroupLayoutEntry>;
 }
 
 interface GPUBlendDescriptor {
@@ -264,8 +270,8 @@ interface GPUBufferBinding {
 interface GPUBufferCopyView {
   buffer: GPUBuffer;
   offset?: number;
-  rowPitch: number;
-  imageHeight: number;
+  bytesPerRow: number;
+  rowsPerImage: number;
 }
 
 interface GPUTextureCopyView {
@@ -308,7 +314,7 @@ interface GPUDepthStencilStateDescriptor {
 }
 
 interface GPUDeviceDescriptor extends GPUObjectDescriptorBase {
-  extensions?: GPUExtensionName[];
+  extensions?: Iterable<GPUExtensionName>;
   limits?: GPULimits;
 }
 
@@ -327,12 +333,12 @@ interface GPUVertexAttributeDescriptor {
 interface GPUVertexBufferLayoutDescriptor {
   arrayStride: number;
   stepMode?: GPUInputStepMode;
-  attributes: GPUVertexAttributeDescriptor[];
+  attributes: Iterable<GPUVertexAttributeDescriptor>;
 }
 
 interface GPUVertexStateDescriptor {
   indexFormat?: GPUIndexFormat;
-  vertexBuffers: GPUVertexBufferLayoutDescriptor[];
+  vertexBuffers: Iterable<GPUVertexBufferLayoutDescriptor>;
 }
 
 interface GPULimits {
@@ -346,7 +352,7 @@ interface GPULimits {
   maxUniformBuffersPerShaderStage?: number;
 }
 
-interface GPULimitsOut {
+interface GPULimitsOut extends GPULimits {
   maxBindGroups: number;
   maxDynamicUniformBuffersPerPipelineLayout: number;
   maxDynamicStorageBuffersPerPipelineLayout: number;
@@ -359,11 +365,11 @@ interface GPULimitsOut {
 
 interface GPUPipelineDescriptorBase {
   label?: string;
-  layout: GPUPipelineLayout;
+  layout?: GPUPipelineLayout;
 }
 
 interface GPUPipelineLayoutDescriptor extends GPUObjectDescriptorBase {
-  bindGroupLayouts: GPUBindGroupLayout[];
+  bindGroupLayouts: Iterable<GPUBindGroupLayout>;
 }
 
 interface GPUProgrammableStageDescriptor {
@@ -398,7 +404,7 @@ interface GPURenderPassDepthStencilAttachmentDescriptor {
 }
 
 interface GPURenderPassDescriptor extends GPUObjectDescriptorBase {
-  colorAttachments: GPURenderPassColorAttachmentDescriptor[];
+  colorAttachments: Iterable<GPURenderPassColorAttachmentDescriptor>;
   depthStencilAttachment?: GPURenderPassDepthStencilAttachmentDescriptor;
 }
 
@@ -411,7 +417,7 @@ interface GPURenderPipelineDescriptor
   extends GPUPipelineDescriptorBase, GPUPipelineDescriptorBase {
   primitiveTopology: GPUPrimitiveTopology;
   rasterizationState?: GPURasterizationStateDescriptor;
-  colorStates: GPUColorStateDescriptor[];
+  colorStates: Iterable<GPUColorStateDescriptor>;
   depthStencilState?: GPUDepthStencilStateDescriptor;
   vertexState?: GPUVertexStateDescriptor;
 
@@ -553,7 +559,7 @@ declare class GPUComputePassEncoder implements GPUProgrammablePassEncoder {
   setBindGroup(
     index: number,
     bindGroup: GPUBindGroup,
-    dynamicOffsets?: number[]
+    dynamicOffsets?: Iterable<number>
   ): void;
 
   popDebugGroup(): void;
@@ -567,14 +573,20 @@ declare class GPUComputePassEncoder implements GPUProgrammablePassEncoder {
   endPass(): void;
 }
 
-declare class GPUComputePipeline implements GPUObjectBase {
+declare class GPUComputePipeline implements GPUPipelineBase {
   label: string | undefined;
+
+  getBindGroupLayout(index: number): GPUBindGroupLayout;
 }
 
 interface GPUObjectBase {
   label: string | undefined;
 }
 
+interface GPUPipelineBase extends GPUObjectBase {
+  getBindGroupLayout(index: number): GPUBindGroupLayout;
+}
+
 interface GPUObjectDescriptorBase {
   label?: string;
 }
@@ -646,7 +658,7 @@ interface GPUProgrammablePassEncoder extends GPUObjectBase {
   setBindGroup(
     index: number,
     bindGroup: GPUBindGroup,
-    dynamicOffsets?: number[]
+    dynamicOffsets?: Iterable<number>
   ): void;
 
   popDebugGroup(): void;
@@ -657,7 +669,7 @@ interface GPUProgrammablePassEncoder extends GPUObjectBase {
 declare class GPUQueue implements GPUObjectBase {
   label: string | undefined;
   signal(fence: GPUFence, signalValue: number): void;
-  submit(commandBuffers: GPUCommandBuffer[]): void;
+  submit(commandBuffers: Iterable<GPUCommandBuffer>): void;
   createFence(descriptor?: GPUFenceDescriptor): GPUFence;
   copyImageBitmapToTexture(
     source: GPUImageBitmapCopyView,
@@ -669,9 +681,9 @@ declare class GPUQueue implements GPUObjectBase {
 interface GPURenderEncoderBase extends GPUProgrammablePassEncoder {
   setPipeline(pipeline: GPURenderPipeline): void;
 
-  setIndexBuffer(buffer: GPUBuffer, offset?: number): void;
+  setIndexBuffer(buffer: GPUBuffer, offset?: number, size?: number): void;
 
-  setVertexBuffer(slot: number, buffer: GPUBuffer, offset?: number): void;
+  setVertexBuffer(slot: number, buffer: GPUBuffer, offset?: number, size?: number): void;
 
   draw(
     vertexCount: number,
@@ -700,7 +712,7 @@ declare class GPURenderPassEncoder implements GPURenderEncoderBase {
   setBindGroup(
     index: number,
     bindGroup: GPUBindGroup,
-    dynamicOffsets?: number[]
+    dynamicOffsets?: Iterable<number>
   ): void;
 
   popDebugGroup(): void;
@@ -745,7 +757,7 @@ declare class GPURenderPassEncoder implements GPURenderEncoderBase {
   setBlendColor(color: GPUColor): void;
   setStencilReference(reference: number): void;
 
-  executeBundles(bundles: GPURenderBundle[]): void;
+  executeBundles(bundles: Iterable<GPURenderBundle>): void;
   endPass(): void;
 }
 
@@ -761,7 +773,7 @@ declare class GPURenderBundleEncoder implements GPURenderEncoderBase {
   setBindGroup(
     index: number,
     bindGroup: GPUBindGroup,
-    dynamicOffsets?: number[]
+    dynamicOffsets?: Iterable<number>
   ): void;
 
   popDebugGroup(): void;
@@ -797,13 +809,14 @@ declare class GPURenderBundleEncoder implements GPURenderEncoderBase {
 
 interface GPURenderBundleEncoderDescriptor
   extends GPUObjectDescriptorBase {
-  colorFormats: GPUTextureFormat[];
+  colorFormats: Iterable<GPUTextureFormat>;
   depthStencilFormat?: GPUTextureFormat;
   sampleCount?: number;
 }
 
-declare class GPURenderPipeline implements GPUObjectBase {
+declare class GPURenderPipeline implements GPUPipelineBase {
   label: string | undefined;
+
   getBindGroupLayout: (index: number) => GPUBindGroupLayout;
 }