Explorar o código

Sync with Chrome that still does not implement latest specs

Popov72 %!s(int64=5) %!d(string=hai) anos
pai
achega
820bd61351

+ 15 - 6
src/Engines/WebGPU/webgpuCacheRenderPipeline.ts

@@ -3,6 +3,7 @@ import * as WebGPUConstants from './webgpuConstants';
 import { Effect } from "../../Materials/effect";
 import { InternalTexture } from "../../Materials/Textures/internalTexture";
 import { VertexBuffer } from "../../Meshes/buffer";
+import { DataBuffer } from "../../Meshes/dataBuffer";
 import { Nullable } from "../../types";
 import { WebGPUHardwareTexture } from "./webgpuHardwareTexture";
 import { WebGPUPipelineContext } from "./webgpuPipelineContext";
@@ -170,6 +171,7 @@ export abstract class WebGPUCacheRenderPipeline {
     private _depthStencilState: number;
     private _vertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>;
     private _overrideVertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>;
+    private _indexBuffer: Nullable<DataBuffer>;
 
     constructor(device: GPUDevice, emptyVertexBuffer: VertexBuffer) {
         this._device = device;
@@ -198,7 +200,7 @@ export abstract class WebGPUCacheRenderPipeline {
         this.setDepthStencilFormat(WebGPUConstants.TextureFormat.Depth24PlusStencil8);
         this.setStencilEnabled(false);
         this.resetStencilState();
-        this.setBuffers(null, null);
+        this.setBuffers(null, null, null);
     }
 
     protected abstract _getRenderPipeline(param: { token: any, pipeline: Nullable<GPURenderPipeline> }): void;
@@ -437,9 +439,10 @@ export abstract class WebGPUCacheRenderPipeline {
         this.setStencilWriteMask(writeMask);
     }
 
-    public setBuffers(vertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>, overrideVertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>): void {
+    public setBuffers(vertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>, indexBuffer: Nullable<DataBuffer>, overrideVertexBuffers: Nullable<{ [key: string]: Nullable<VertexBuffer> }>): void {
         this._vertexBuffers = vertexBuffers;
         this._overrideVertexBuffers = overrideVertexBuffers;
+        this._indexBuffer = indexBuffer;
     }
 
     private static _GetTopology(fillMode: number): GPUPrimitiveTopology {
@@ -851,7 +854,7 @@ export abstract class WebGPUCacheRenderPipeline {
         return this._device.createPipelineLayout({ bindGroupLayouts });
     }
 
-    private _getVertexInputDescriptor(effect: Effect): GPUVertexState {
+    private _getVertexInputDescriptor(effect: Effect, topology: GPUPrimitiveTopology): GPUVertexState {
         const descriptors: GPUVertexBufferLayout[] = [];
         const webgpuPipelineContext = effect._pipelineContext as WebGPUPipelineContext;
         const attributes = webgpuPipelineContext.shaderProcessingContext.attributeNamesFromEffect;
@@ -881,14 +884,20 @@ export abstract class WebGPUCacheRenderPipeline {
             descriptors.push(vertexBufferDescriptor);
         }
 
-        return {
-            buffers: descriptors
+        const inputStateDescriptor: GPUVertexState = {
+            vertexBuffers: descriptors
         };
+
+        if (topology === WebGPUConstants.PrimitiveTopology.LineStrip || topology === WebGPUConstants.PrimitiveTopology.TriangleStrip) {
+            inputStateDescriptor.indexFormat = !this._indexBuffer || this._indexBuffer.is32Bits ? WebGPUConstants.IndexFormat.Uint32 : WebGPUConstants.IndexFormat.Uint16;
+        }
+
+        return inputStateDescriptor;
     }
 
     private _createRenderPipeline(effect: Effect, topology: GPUPrimitiveTopology, sampleCount: number, createLayout = true): GPURenderPipeline {
         const webgpuPipelineContext = effect._pipelineContext as WebGPUPipelineContext;
-        const inputStateDescriptor = this._getVertexInputDescriptor(effect);
+        const inputStateDescriptor = this._getVertexInputDescriptor(effect, topology);
         const pipelineLayout = createLayout ? this._createPipelineLayout(webgpuPipelineContext) : undefined;
 
         const colorStates: Array<GPUColorStateDescriptor> = [];

+ 233 - 149
src/Engines/WebGPU/webgpuConstants.ts

@@ -1,5 +1,11 @@
 /** @hidden */
-export enum ExtensionName {
+export enum PowerPreference {
+    LowPower = "low-power",
+    HighPerformance = "high-performance"
+}
+
+/** @hidden */
+export enum FeatureName {
     DepthClamping = "depth-clamping",
     Depth24UnormStencil8 = "depth24unorm-stencil8",
     Depth32FloatStencil8 = "depth32float-stencil8",
@@ -7,118 +13,60 @@ export enum ExtensionName {
     TextureCompressionBC = "texture-compression-bc",
     TimestampQuery = "timestamp-query"
 }
+
 /** @hidden */
-export enum AddressMode {
-    ClampToEdge = "clamp-to-edge",
-    Repeat = "repeat",
-    MirrorRepeat = "mirror-repeat"
-}
-/** @hidden */
-export enum BindingType {
-    UniformBuffer = "uniform-buffer",
-    StorageBuffer = "storage-buffer",
-    ReadonlyStorageBuffer = "readonly-storage-buffer",
-    Sampler = "sampler",
-    ComparisonSampler = "comparison-sampler",
-    SampledTexture = "sampled-texture",
-    ReadonlyStorageTexture = "readonly-storage-texture",
-    WriteonlyStorageTexture = "writeonly-storage-texture"
-}
-/** @hidden */
-export enum BlendFactor {
-    Zero = "zero",
-    One = "one",
-    SrcColor = "src-color",
-    OneMinusSrcColor = "one-minus-src-color",
-    SrcAlpha = "src-alpha",
-    OneMinusSrcAlpha = "one-minus-src-alpha",
-    DstColor = "dst-color",
-    OneMinusDstColor = "one-minus-dst-color",
-    DstAlpha = "dst-alpha",
-    OneMinusDstAlpha = "one-minus-dst-alpha",
-    SrcAlphaSaturated = "src-alpha-saturated",
-    BlendColor = "blend-color",
-    OneMinusBlendColor = "one-minus-blend-color"
-}
-/** @hidden */
-export enum BlendOperation {
-    Add = "add",
-    Subtract = "subtract",
-    ReverseSubtract = "reverse-subtract",
-    Min = "min",
-    Max = "max"
-}
-/** @hidden */
-export enum CompareFunction {
-    Never = "never",
-    Less = "less",
-    Equal = "equal",
-    LessEqual = "less-equal",
-    Greater = "greater",
-    NotEqual = "not-equal",
-    GreaterEqual = "greater-equal",
-    Always = "always"
-}
-/** @hidden */
-export enum CullMode {
-    None = "none",
-    Front = "front",
-    Back = "back"
-}
-/** @hidden */
-export enum FilterMode {
-    Nearest = "nearest",
-    Linear = "linear"
-}
-/** @hidden */
-export enum FrontFace {
-    CCW = "ccw",
-    CW = "cw"
-}
-/** @hidden */
-export enum IndexFormat {
-    Uint16 = "uint16",
-    Uint32 = "uint32"
-}
-/** @hidden */
-export enum InputStepMode {
-    Vertex = "vertex",
-    Instance = "instance"
-}
-/** @hidden */
-export enum LoadOp {
-    Load = "load"
+export enum BufferUsage {
+    MapRead = 1,
+    MapWrite = 2,
+    CopySrc = 4,
+    CopyDst = 8,
+    Index = 16,
+    Vertex = 32,
+    Uniform = 64,
+    Storage = 128,
+    Indirect = 256,
+    QueryResolve = 512
 }
+
 /** @hidden */
-export enum PrimitiveTopology {
-    PointList = "point-list",
-    LineList = "line-list",
-    LineStrip = "line-strip",
-    TriangleList = "triangle-list",
-    TriangleStrip = "triangle-strip"
+export enum MapMode {
+    Read = 1,
+    Write = 2
 }
+
 /** @hidden */
-export enum StencilOperation {
-    Keep = "keep",
-    Zero = "zero",
-    Replace = "replace",
-    Invert = "invert",
-    IncrementClamp = "increment-clamp",
-    DecrementClamp = "decrement-clamp",
-    IncrementWrap = "increment-wrap",
-    DecrementWrap = "decrement-wrap"
+export enum TextureDimension {
+    E1d = "1d",
+    E2d = "2d",
+    E3d = "3d"
 }
+
 /** @hidden */
-export enum StoreOp {
-    Store = "store",
-    Clear = "clear"
+export enum TextureUsage {
+    CopySrc = 1,
+    CopyDst = 2,
+    Sampled = 4,
+    Storage = 8,
+    OutputAttachment = 16
 }
+
 /** @hidden */
-export enum TextureDimension {
+export enum TextureViewDimension {
     E1d = "1d",
     E2d = "2d",
+    E2dArray = "2d-array",
+    Cube = "cube",
+    CubeArray = "cube-array",
     E3d = "3d"
 }
+
+/** @hidden */
+export enum TextureAspect {
+    All = "all",
+    StencilOnly = "stencil-only",
+    DepthOnly = "depth-only"
+}
+
 /** @hidden */
 export enum TextureFormat {
     // 8-bit formats
@@ -198,7 +146,63 @@ export enum TextureFormat {
     // "depth32float-stencil8" feature
     Depth32FloatStencil8 = "depth32float-stencil8"
 }
+
 /** @hidden */
+export enum AddressMode {
+    ClampToEdge = "clamp-to-edge",
+    Repeat = "repeat",
+    MirrorRepeat = "mirror-repeat"
+}
+
+/** @hidden */
+export enum FilterMode {
+    Nearest = "nearest",
+    Linear = "linear"
+}
+
+/** @hidden */
+export enum CompareFunction {
+    Never = "never",
+    Less = "less",
+    Equal = "equal",
+    LessEqual = "less-equal",
+    Greater = "greater",
+    NotEqual = "not-equal",
+    GreaterEqual = "greater-equal",
+    Always = "always"
+}
+
+/** @hidden */
+export enum ShaderStage {
+    Vertex = 1,
+    Fragment = 2,
+    Compute = 4
+}
+
+/** @hidden */
+export enum BufferBindingType {
+    Uniform = "uniform",
+    Storage = "storage",
+    ReadOnlyStorage = "read-only-storage"
+}
+
+/** @hidden */
+export enum SamplerBindingType {
+    Filtering = "filtering",
+    NonFiltering = "non-filtering",
+    Comparison = "comparison"
+}
+
+/** @hidden */
+export enum TextureSampleType {
+    Float = "float",
+    UnfilterableFloat = "unfilterable-float",
+    Depth = "depth",
+    Sint = "sint",
+    Uint = "uint"
+}
+
+// TODO WEBGPU to be removed
 export enum TextureComponentType {
     Float = "float",
     Sint = "sint",
@@ -206,15 +210,107 @@ export enum TextureComponentType {
     // Texture is used with comparison sampling only.
     DepthComparison = "depth-comparison"
 }
+
 /** @hidden */
-export enum TextureViewDimension {
-    E1d = "1d",
-    E2d = "2d",
-    E2dArray = "2d-array",
-    Cube = "cube",
-    CubeArray = "cube-array",
-    E3d = "3d"
+export enum StorageTextureAccess {
+    ReadOnly = "read-only",
+    WriteOnly = "write-only"
+}
+
+// TODO WEBGPU to be removed
+export enum BindingType {
+    UniformBuffer = "uniform-buffer",
+    StorageBuffer = "storage-buffer",
+    ReadonlyStorageBuffer = "readonly-storage-buffer",
+    Sampler = "sampler",
+    ComparisonSampler = "comparison-sampler",
+    SampledTexture = "sampled-texture",
+    ReadonlyStorageTexture = "readonly-storage-texture",
+    WriteonlyStorageTexture = "writeonly-storage-texture"
+}
+
+/** @hidden */
+export enum CompilationMessageType {
+    Error = "error",
+    Warning = "warning",
+    Info = "info"
+}
+
+/** @hidden */
+export enum PrimitiveTopology {
+    PointList = "point-list",
+    LineList = "line-list",
+    LineStrip = "line-strip",
+    TriangleList = "triangle-list",
+    TriangleStrip = "triangle-strip"
+}
+
+/** @hidden */
+export enum FrontFace {
+    CCW = "ccw",
+    CW = "cw"
+}
+
+/** @hidden */
+export enum CullMode {
+    None = "none",
+    Front = "front",
+    Back = "back"
+}
+
+/** @hidden */
+export enum ColorWrite {
+    Red = 1,
+    Green = 2,
+    Blue = 4,
+    Alpha = 8,
+    All = 15
+}
+
+/** @hidden */
+export enum BlendFactor {
+    Zero = "zero",
+    One = "one",
+    SrcColor = "src-color",
+    OneMinusSrcColor = "one-minus-src-color",
+    SrcAlpha = "src-alpha",
+    OneMinusSrcAlpha = "one-minus-src-alpha",
+    DstColor = "dst-color",
+    OneMinusDstColor = "one-minus-dst-color",
+    DstAlpha = "dst-alpha",
+    OneMinusDstAlpha = "one-minus-dst-alpha",
+    SrcAlphaSaturated = "src-alpha-saturated",
+    BlendColor = "blend-color",
+    OneMinusBlendColor = "one-minus-blend-color"
 }
+
+/** @hidden */
+export enum BlendOperation {
+    Add = "add",
+    Subtract = "subtract",
+    ReverseSubtract = "reverse-subtract",
+    Min = "min",
+    Max = "max"
+}
+
+/** @hidden */
+export enum StencilOperation {
+    Keep = "keep",
+    Zero = "zero",
+    Replace = "replace",
+    Invert = "invert",
+    IncrementClamp = "increment-clamp",
+    DecrementClamp = "decrement-clamp",
+    IncrementWrap = "increment-wrap",
+    DecrementWrap = "decrement-wrap"
+}
+
+/** @hidden */
+export enum IndexFormat {
+    Uint16 = "uint16",
+    Uint32 = "uint32"
+}
+
 /** @hidden */
 export enum VertexFormat {
     Uchar2 = "uchar2",
@@ -248,59 +344,47 @@ export enum VertexFormat {
     Int3 = "int3",
     Int4 = "int4"
 }
+
 /** @hidden */
-export enum TextureAspect {
-    All = "all",
-    StencilOnly = "stencil-only",
-    DepthOnly = "depth-only"
-}
-/** @hidden */
-export enum CompilationMessageType {
-    Error = "error",
-    Warning = "warning",
-    Info = "info"
+export enum InputStepMode {
+    Vertex = "vertex",
+    Instance = "instance"
 }
+
 /** @hidden */
-export enum QueryType {
-    Occlusion = "occlusion"
+export enum LoadOp {
+    Load = "load"
 }
+
 /** @hidden */
-export enum BufferUsage {
-    MapRead = 1,
-    MapWrite = 2,
-    CopySrc = 4,
-    CopyDst = 8,
-    Index = 16,
-    Vertex = 32,
-    Uniform = 64,
-    Storage = 128,
-    Indirect = 256,
-    QueryResolve = 512
+export enum StoreOp {
+    Store = "store",
+    Clear = "clear"
 }
+
 /** @hidden */
-export enum ColorWrite {
-    Red = 1,
-    Green = 2,
-    Blue = 4,
-    Alpha = 8,
-    All = 15
+export enum QueryType {
+    Occlusion = "occlusion",
+    PipelineStatistics = "pipeline-statistics",
+    Timestamp = "timestamp"    
 }
+
 /** @hidden */
-export enum ShaderStage {
-    Vertex = 1,
-    Fragment = 2,
-    Compute = 4
+export enum PipelineStatisticName {
+    VertexShaderInvocations = "vertex-shader-invocations",
+    ClipperInvocations = "clipper-invocations",
+    ClipperPrimitivesOut = "clipper-primitives-out",
+    FragmentShaderInvocations = "fragment-shader-invocations",
+    ComputeShaderInvocations = "compute-shader-invocations"
 }
+
 /** @hidden */
-export enum TextureUsage {
-    CopySrc = 1,
-    CopyDst = 2,
-    Sampled = 4,
-    Storage = 8,
-    OutputAttachment = 16
+export enum DeviceLostReason {
+    Destroyed = "destroyed"
 }
+
 /** @hidden */
-export enum MapMode {
-    Read = 1,
-    Write = 2
+export enum ErrorFilter {
+    OutOfMemory = "out-of-memory",
+    Validation = "validation"
 }

+ 3 - 0
src/Engines/WebGPU/webgpuTextureHelper.ts

@@ -201,6 +201,9 @@ export class WebGPUTextureHelper {
                     entryPoint: 'main'
                 },
                 primitiveTopology: WebGPUConstants.PrimitiveTopology.TriangleStrip,
+                vertexState: {
+                    indexFormat: WebGPUConstants.IndexFormat.Uint16
+                },
                 colorStates: [{
                     format,
                 }]

+ 7 - 4
src/Engines/webgpuEngine.ts

@@ -509,11 +509,11 @@ export class WebGPUEngine extends Engine {
             maxVertexUniformVectors: 1024,
             standardDerivatives: true,
             astc: null,
-            s3tc: (this._deviceEnabledExtensions.indexOf(WebGPUConstants.ExtensionName.TextureCompressionBC) >= 0 ? true : undefined) as any,
+            s3tc: (this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionBC) >= 0 ? true : undefined) as any,
             pvrtc: null,
             etc1: null,
             etc2: null,
-            bptc: this._deviceEnabledExtensions.indexOf(WebGPUConstants.ExtensionName.TextureCompressionBC) >= 0 ? true : undefined,
+            bptc: this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionBC) >= 0 ? true : undefined,
             maxAnisotropy: 16, // TODO WEBGPU: Retrieve this smartly
             uintIndices: true,
             fragmentDepthSupported: true,
@@ -710,7 +710,7 @@ export class WebGPUEngine extends Engine {
         this._currentIndexBuffer = null;
         this._currentVertexBuffers = null;
         this._currentOverrideVertexBuffers = null;
-        this._cacheRenderPipeline.setBuffers(null, null);
+        this._cacheRenderPipeline.setBuffers(null, null, null);
 
         if (bruteForce) {
             this._currentProgram = null;
@@ -1073,7 +1073,7 @@ export class WebGPUEngine extends Engine {
         this._currentIndexBuffer = indexBuffer;
         this._currentVertexBuffers = vertexBuffers;
         this._currentOverrideVertexBuffers = overrideVertexBuffers ?? null;
-        this._cacheRenderPipeline.setBuffers(vertexBuffers, this._currentOverrideVertexBuffers);
+        this._cacheRenderPipeline.setBuffers(vertexBuffers, indexBuffer, this._currentOverrideVertexBuffers);
     }
 
     /** @hidden */
@@ -2988,6 +2988,9 @@ export class WebGPUEngine extends Engine {
             const pipeline = this._device.createRenderPipeline({
                 sampleCount: this._currentRenderTarget ? this._currentRenderTarget.samples : this._mainPassSampleCount,
                 primitiveTopology: WebGPUConstants.PrimitiveTopology.TriangleStrip,
+                vertexState: {
+                    indexFormat: WebGPUConstants.IndexFormat.Uint16
+                },
 
                 depthStencilState: this._depthTextureFormat === undefined ? undefined : {
                     depthWriteEnabled: clearDepth,

+ 3 - 7
src/LibDeclarations/webgpu.d.ts

@@ -609,14 +609,10 @@ type GPUVertexFormat =
 type GPUInputStepMode = "vertex" | "instance";
 
 interface GPUVertexState {
-    buffers?: GPUVertexBufferLayout[];
+    indexFormat?: GPUIndexFormat; // TODO WEBGPU to be removed
+    vertexBuffers?: GPUVertexBufferLayout[]; // TODO WEBGPU to be renamed to buffers
 }
-/*
-interface GPUVertexStateDescriptor {
-    indexFormat?: GPUIndexFormat;
-    vertexBuffers?: GPUVertexBufferLayout[];
-}
-*/
+
 interface GPUVertexBufferLayout {
     arrayStride: GPUSize64;
     stepMode?: GPUInputStepMode; /* default="vertex" */