Bläddra i källkod

Merge pull request #8655 from sebavan/WebGPU

Web gpu
sebavan 5 år sedan
förälder
incheckning
65194ce339
3 ändrade filer med 117 tillägg och 52 borttagningar
  1. 11 10
      src/Engines/WebGPU/webgpuConstants.ts
  2. 15 11
      src/Engines/webgpuEngine.ts
  3. 91 31
      src/LibDeclarations/webgpu.d.ts

+ 11 - 10
src/Engines/WebGPU/webgpuConstants.ts

@@ -112,16 +112,17 @@ export class WebGPUConstants {
     public static readonly GPUVertexFormat_int3: GPUVertexFormat = "int3";
     public static readonly GPUVertexFormat_int4: GPUVertexFormat = "int4";
 
-    public static readonly GPUBufferUsage_NONE = 0;
-    public static readonly GPUBufferUsage_MAP_READ = 1;
-    public static readonly GPUBufferUsage_MAP_WRITE = 2;
-    public static readonly GPUBufferUsage_TRANSFER_SRC = 4;
-    public static readonly GPUBufferUsage_TRANSFER_DST = 8;
-    public static readonly GPUBufferUsage_INDEX = 16;
-    public static readonly GPUBufferUsage_VERTEX = 32;
-    public static readonly GPUBufferUsage_UNIFORM = 64;
-    public static readonly GPUBufferUsage_STORAGE = 128;
-    public static readonly GPUBufferUsage_INDIRECT = 256;
+    public static readonly GPUBufferUsage_NONE = 0x0000;
+    public static readonly GPUBufferUsage_MAP_READ = 0x0001;
+    public static readonly GPUBufferUsage_MAP_WRITE = 0x0002;
+    public static readonly GPUBufferUsage_COPY_SRC = 0x0004;
+    public static readonly GPUBufferUsage_COPY_DST = 0x0008;
+    public static readonly GPUBufferUsage_INDEX = 0x0010;
+    public static readonly GPUBufferUsage_VERTEX = 0x0020;
+    public static readonly GPUBufferUsage_UNIFORM = 0x0040;
+    public static readonly GPUBufferUsage_STORAGE = 0x0080;
+    public static readonly GPUBufferUsage_INDIRECT = 0x0100;
+    public static readonly GPUBufferUsage_QUERY_RESOLVE = 0x0200;
 
     public static readonly GPUMapMode_READ = 1;
     public static readonly GPUMapMode_WRITE = 2;

+ 15 - 11
src/Engines/webgpuEngine.ts

@@ -570,7 +570,7 @@ export class WebGPUEngine extends Engine {
             throw new Error("Cannot create zero-sized buffer"); // 0 size buffer would kill the tab in chrome
         }
         const uploadBuffer = this._device.createBuffer({
-            usage: WebGPUConstants.GPUBufferUsage_TRANSFER_SRC | WebGPUConstants.GPUBufferUsage_MAP_WRITE,
+            usage: WebGPUConstants.GPUBufferUsage_COPY_SRC | WebGPUConstants.GPUBufferUsage_MAP_WRITE,
             size: byteLength - srcByteOffset
         });
 
@@ -614,7 +614,7 @@ export class WebGPUEngine extends Engine {
             view = data;
         }
 
-        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_VERTEX | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
+        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_VERTEX | WebGPUConstants.GPUBufferUsage_COPY_DST);
         return dataBuffer;
     }
 
@@ -676,7 +676,7 @@ export class WebGPUEngine extends Engine {
             }
         }
 
-        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_INDEX | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
+        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_INDEX | WebGPUConstants.GPUBufferUsage_COPY_DST);
         dataBuffer.is32Bits = is32Bits;
         return dataBuffer;
     }
@@ -751,7 +751,7 @@ export class WebGPUEngine extends Engine {
             view = elements;
         }
 
-        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_UNIFORM | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
+        const dataBuffer = this._createBuffer(view, WebGPUConstants.GPUBufferUsage_UNIFORM | WebGPUConstants.GPUBufferUsage_COPY_DST);
         return dataBuffer;
     }
 
@@ -1005,10 +1005,9 @@ export class WebGPUEngine extends Engine {
             origin: {
                 x: 0,
                 y: 0,
-                z: 0
+                z: Math.max(face, 0)
             },
-            mipLevel: mip,
-            arrayLayer: Math.max(face, 0),
+            mipLevel: mip
         };
         const textureExtent = {
             width,
@@ -1021,7 +1020,7 @@ export class WebGPUEngine extends Engine {
 
         let dataBuffer: DataBuffer;
         if (bytesPerRow == width * 4) {
-            dataBuffer = this._createBuffer(pixels, WebGPUConstants.GPUBufferUsage_TRANSFER_SRC | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
+            dataBuffer = this._createBuffer(pixels, WebGPUConstants.GPUBufferUsage_COPY_SRC | WebGPUConstants.GPUBufferUsage_COPY_DST);
             const bufferView: GPUBufferCopyView = {
                 buffer: dataBuffer.underlyingResource,
                 bytesPerRow: bytesPerRow,
@@ -1043,7 +1042,7 @@ export class WebGPUEngine extends Engine {
                     pixelsIndex += 4;
                 }
             }
-            dataBuffer = this._createBuffer(alignedPixels, WebGPUConstants.GPUBufferUsage_TRANSFER_SRC | WebGPUConstants.GPUBufferUsage_TRANSFER_DST);
+            dataBuffer = this._createBuffer(alignedPixels, WebGPUConstants.GPUBufferUsage_COPY_SRC | WebGPUConstants.GPUBufferUsage_COPY_DST);
             const bufferView: GPUBufferCopyView = {
                 buffer: dataBuffer.underlyingResource,
                 bytesPerRow: bytesPerRow,
@@ -2286,10 +2285,15 @@ export class WebGPUEngine extends Engine {
      * Force a specific size of the canvas
      * @param width defines the new canvas' width
      * @param height defines the new canvas' height
+     * @returns true if the size was changed
      */
-    public setSize(width: number, height: number): void {
-        super.setSize(width, height);
+    public setSize(width: number, height: number): boolean {
+        if (!super.setSize(width, height)) {
+            return false;
+        }
+
         this._initializeMainAttachments();
+        return true;
     }
 
     //------------------------------------------------------------------------------

+ 91 - 31
src/LibDeclarations/webgpu.d.ts

@@ -1,9 +1,11 @@
-// https://github.com/gpuweb/gpuweb/blob/0a48816412b5d08a5fb8b89005e019165a1a2c63/spec/index.bs
-// except #280 which removed setSubData
+// https://github.com/gpuweb/gpuweb/blob/01b20b4ad93fabae1e8e0d7752515f69708d33e0/spec/index.bs
 // except #494 which reverted the addition of GPUAdapter.limits
 // except #591 which removed Uint32Array from GPUShaderModuleDescriptor
-// including #543 which adds GPUPipelineBase.getBindGroupLayout
-// v 0.0.24
+// except #708's removal of mapWriteAsync/mapReadAsync/createBufferMapped
+// except #691 et al which added pipeline statistics query (still in flux)
+// including #678 which adds GPUBindGroupLayoutEntry.minBufferBindingSize
+// including #605 which adds new mapping, but without removing the old mapping
+// v 0.0.29
 
 interface GPUColorDict {
   a: number;
@@ -221,6 +223,20 @@ type GPUTextureUsageFlags = number;
 //   OUTPUT_ATTACHMENT: 0x10;
 // };
 
+type GPUQueryType =
+  | "occlusion";
+
+type GPUCompilationMessageType =
+  | "error"
+  | "warning"
+  | "info";
+
+type GPUMapModeFlags = number;
+// const GPUMapMode: {
+//   READ:  0x1;
+//   WRITE: 0x2;
+// };
+
 interface GPUBindGroupEntry {
   binding: number;
   resource: GPUBindingResource;
@@ -235,10 +251,11 @@ interface GPUBindGroupLayoutEntry {
   binding: number;
   visibility: GPUShaderStageFlags;
   type: GPUBindingType;
+  hasDynamicOffset?: boolean;
+  minBufferBindingSize?: number;
   viewDimension?: GPUTextureViewDimension;
   textureComponentType?: GPUTextureComponentType;
   multisampled?: boolean;
-  hasDynamicOffset?: boolean;
   storageTextureFormat?: GPUTextureFormat;
 }
 
@@ -267,17 +284,19 @@ interface GPUBufferBinding {
   size?: number;
 }
 
-interface GPUBufferCopyView {
-  buffer: GPUBuffer;
+interface GPUTextureDataLayout {
   offset?: number;
   bytesPerRow: number;
   rowsPerImage: number;
 }
 
+interface GPUBufferCopyView extends GPUTextureDataLayout {
+  buffer: GPUBuffer;
+}
+
 interface GPUTextureCopyView {
   texture: GPUTexture;
   mipLevel?: number;
-  arrayLayer?: number;
   origin?: GPUOrigin3D;
 }
 
@@ -289,6 +308,7 @@ interface GPUImageBitmapCopyView {
 interface GPUBufferDescriptor extends GPUObjectDescriptorBase {
   size: number;
   usage: GPUBufferUsageFlags;
+  mappedAtCreation?: boolean;
 }
 
 interface GPUCommandEncoderDescriptor extends GPUObjectDescriptorBase {
@@ -398,9 +418,11 @@ interface GPURenderPassDepthStencilAttachmentDescriptor {
 
   depthLoadValue: GPULoadOp | number;
   depthStoreOp: GPUStoreOp;
+  depthReadOnly?: boolean;
 
   stencilLoadValue: GPULoadOp | number;
   stencilStoreOp: GPUStoreOp;
+  stencilReadOnly?: boolean;
 }
 
 interface GPURenderPassDescriptor extends GPUObjectDescriptorBase {
@@ -442,6 +464,7 @@ interface GPUSamplerDescriptor extends GPUObjectDescriptorBase {
 interface GPUShaderModuleDescriptor extends GPUObjectDescriptorBase {
   code: Uint32Array | string;
   label?: string;
+  sourceMap?: object;
 }
 
 interface GPUStencilStateFaceDescriptor {
@@ -497,17 +520,12 @@ declare class GPUBuffer implements GPUObjectBase {
   //readonly mapping: ArrayBuffer | null;
   destroy(): void;
   unmap(): void;
-  mapAsync(mode:number, offset?:number, size?: number): Promise<void>;
-  getMappedRange(offset?:number, size?:number): ArrayBuffer;
+
+  mapAsync(mode: GPUMapModeFlags, offset?: number, size?: number): Promise<void>;
+  getMappedRange(offset?: number, size?: number): ArrayBuffer;
+
   mapWriteAsync(): Promise<ArrayBuffer>;
   mapReadAsync(): Promise<ArrayBuffer>;
-  // TODO: Remove setSubData (#280)
-  writeBuffer(
-    offset: number,
-    src: ArrayBufferView,
-    srcOffset?: number,
-    byteLength?: number
-  ): void;
 }
 
 declare class GPUCommandBuffer implements GPUObjectBase {
@@ -635,6 +653,8 @@ declare class GPUDevice extends EventTarget implements GPUObjectBase {
     descriptor: GPURenderBundleEncoderDescriptor
   ): GPURenderBundleEncoder;
 
+  createQuerySet(descriptor: GPUQuerySetDescriptor): GPUQuerySet;
+
   defaultQueue: GPUQueue;
 
   pushErrorScope(filter: GPUErrorFilter): void;
@@ -670,7 +690,20 @@ declare class GPUQueue implements GPUObjectBase {
   label: string | undefined;
   signal(fence: GPUFence, signalValue: number): void;
   submit(commandBuffers: Iterable<GPUCommandBuffer>): void;
+
   createFence(descriptor?: GPUFenceDescriptor): GPUFence;
+
+  writeBuffer(buffer: GPUBuffer,
+    bufferOffset: number,
+    data: ArrayBuffer,
+    dataOffset?: number,
+    size?: number): void;
+
+  writeTexture(destination: GPUTextureCopyView,
+    data: ArrayBuffer,
+    dataLayout: GPUTextureDataLayout,
+    size: GPUExtent3D): void;
+
   copyImageBitmapToTexture(
     source: GPUImageBitmapCopyView,
     destination: GPUTextureCopyView,
@@ -678,6 +711,17 @@ declare class GPUQueue implements GPUObjectBase {
   ): void;
 }
 
+interface GPUQuerySetDescriptor extends GPUObjectDescriptorBase {
+  type: GPUQueryType;
+  count: number;
+}
+
+declare class GPUQuerySet implements GPUObjectBase {
+  label: string | undefined;
+
+  destroy(): void;
+}
+
 interface GPURenderEncoderBase extends GPUProgrammablePassEncoder {
   setPipeline(pipeline: GPURenderPipeline): void;
 
@@ -726,16 +770,16 @@ declare class GPURenderPassEncoder implements GPURenderEncoderBase {
 
   draw(
     vertexCount: number,
-    instanceCount: number,
-    firstVertex: number,
-    firstInstance: number
+    instanceCount?: number,
+    firstVertex?: number,
+    firstInstance?: number
   ): void;
   drawIndexed(
     indexCount: number,
-    instanceCount: number,
-    firstIndex: number,
-    baseVertex: number,
-    firstInstance: number
+    instanceCount?: number,
+    firstIndex?: number,
+    baseVertex?: number,
+    firstInstance?: number
   ): void;
 
   drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void;
@@ -757,6 +801,9 @@ declare class GPURenderPassEncoder implements GPURenderEncoderBase {
   setBlendColor(color: GPUColor): void;
   setStencilReference(reference: number): void;
 
+  beginOcclusionQuery(queryIndex: number): void;
+  endOcclusionQuery(queryIndex: number): void;
+
   executeBundles(bundles: Iterable<GPURenderBundle>): void;
   endPass(): void;
 }
@@ -787,16 +834,16 @@ declare class GPURenderBundleEncoder implements GPURenderEncoderBase {
 
   draw(
     vertexCount: number,
-    instanceCount: number,
-    firstVertex: number,
-    firstInstance: number
+    instanceCount?: number,
+    firstVertex?: number,
+    firstInstance?: number
   ): void;
   drawIndexed(
     indexCount: number,
-    instanceCount: number,
-    firstIndex: number,
-    baseVertex: number,
-    firstInstance: number
+    instanceCount?: number,
+    firstIndex?: number,
+    baseVertex?: number,
+    firstInstance?: number
   ): void;
 
   drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void;
@@ -824,8 +871,21 @@ declare class GPUSampler implements GPUObjectBase {
   label: string | undefined;
 }
 
+interface GPUCompilationMessage {
+  readonly message: string;
+  readonly type: GPUCompilationMessageType;
+  readonly lineNum: number;
+  readonly linePos: number;
+}
+
+interface GPUCompilationInfo {
+  readonly messages: Iterable<GPUCompilationMessage>;
+}
+
 declare class GPUShaderModule implements GPUObjectBase {
   label: string | undefined;
+
+  compilationInfo(): Promise<GPUCompilationInfo>;
 }
 
 declare class GPUSwapChain implements GPUObjectBase {