// https://github.com/gpuweb/gpuweb/blob/72b88fd01c8dd7d17a03f5669e6b14fd0c9ce6b6/spec/index.bs // except #280 setSubData (TODO) interface GPUColorDict { a: number; b: number; g: number; r: number; } type GPUColor = [number, number, number, number] | GPUColorDict; interface GPUOrigin2DDict { x?: number; y?: number; } type GPUOrigin2D = [number, number] | GPUOrigin2DDict; interface GPUOrigin3DDict { x?: number; y?: number; z?: number; } type GPUOrigin3D = [number, number, number] | GPUOrigin3DDict; interface GPUExtent3DDict { width: number; height: number; depth: number; } type GPUExtent3D = [number, number, number] | GPUExtent3DDict; type GPUBindingResource = GPUSampler | GPUTextureView | GPUBufferBinding; type GPUAddressMode = | "clamp-to-edge" | "repeat" | "mirror-repeat"; type GPUBindingType = | "uniform-buffer" | "storage-buffer" | "readonly-storage-buffer" | "sampler" | "sampled-texture" | "storage-texture"; type GPUBlendFactor = | "zero" | "one" | "src-color" | "one-minus-src-color" | "src-alpha" | "one-minus-src-alpha" | "dst-color" | "one-minus-dst-color" | "dst-alpha" | "one-minus-dst-alpha" | "src-alpha-saturated" | "blend-color" | "one-minus-blend-color"; type GPUBlendOperation = | "add" | "subtract" | "reverse-subtract" | "min" | "max"; type GPUCompareFunction = | "never" | "less" | "equal" | "lessEqual" | "greater" | "notEqual" | "greaterEqual" | "always"; type GPUCullMode = | "none" | "front" | "back"; type GPUFilterMode = | "nearest" | "linear"; type GPUFrontFace = | "ccw" | "cw"; type GPUIndexFormat = | "uint16" | "uint32"; type GPUInputStepMode = | "vertex" | "instance"; type GPULoadOp = | "load"; type GPUPrimitiveTopology = | "point-list" | "line-list" | "line-strip" | "triangle-list" | "triangle-strip"; type GPUStencilOperation = | "keep" | "zero" | "replace" | "invert" | "increment-clamp" | "decrement-clamp" | "increment-wrap" | "decrement-wrap"; type GPUStoreOp = | "store" | "clear"; type GPUTextureDimension = | "1d" | "2d" | "3d"; type GPUTextureFormat = | "r8unorm" | "r8snorm" | "r8uint" | "r8sint" | "r16unorm" | "r16snorm" | "r16uint" | "r16sint" | "r16float" | "rg8unorm" | "rg8snorm" | "rg8uint" | "rg8sint" | "r32uint" | "r32sint" | "r32float" | "rg16unorm" | "rg16snorm" | "rg16uint" | "rg16sint" | "rg16float" | "rgba8unorm" | "rgba8unorm-srgb" | "rgba8snorm" | "rgba8uint" | "rgba8sint" | "bgra8unorm" | "bgra8unorm-srgb" | "rgb10a2unorm" | "rg11b10float" | "rg32uint" | "rg32sint" | "rg32float" | "rgba16unorm" | "rgba16snorm" | "rgba16uint" | "rgba16sint" | "rgba16float" | "rgba32uint" | "rgba32sint" | "rgba32float" | "depth32float" | "depth32float-stencil8" | "depth24plus" | "depth24plus-stencil8"; type GPUTextureViewDimension = | "1d" | "2d" | "2d-array" | "cube" | "cube-array" | "3d"; // SEB UPDATE. type GPUTextureAspect = | "all" | "stencil-only" | "depth-only"; type GPUVertexFormat = | "uchar2" | "uchar4" | "char2" | "char4" | "uchar2norm" | "uchar4norm" | "char2norm" | "char4norm" | "ushort2" | "ushort4" | "short2" | "short4" | "ushort2norm" | "ushort4norm" | "short2norm" | "short4norm" | "half2" | "half4" | "float" | "float2" | "float3" | "float4" | "uint" | "uint2" | "uint3" | "uint4" | "int" | "int2" | "int3" | "int4"; type GPUBufferUsageFlags = number; // enum GPUBufferUsage { // NONE = 0x0000, // MAP_READ = 0x0001, // MAP_WRITE = 0x0002, // COPY_SRC = 0x0004, // COPY_DST = 0x0008, // INDEX = 0x0010, // VERTEX = 0x0020, // UNIFORM = 0x0040, // STORAGE = 0x0080, // } type GPUColorWriteFlags = number; // enum GPUColorWrite { // NONE = 0x0, // RED = 0x1, // GREEN = 0x2, // BLUE = 0x4, // ALPHA = 0x8, // ALL = 0xF, // } type GPUShaderStageFlags = number; // enum GPUShaderStage { // NONE = 0x0, // VERTEX = 0x1, // FRAGMENT = 0x2, // COMPUTE = 0x4, // } type GPUTextureUsageFlags = number; // enum GPUTextureUsage { // NONE = 0x00, // COPY_SRC = 0x01, // COPY_DST = 0x02, // SAMPLED = 0x04, // STORAGE = 0x08, // OUTPUT_ATTACHMENT = 0x10, // } interface GPUBindGroupBinding { binding: number; resource: GPUBindingResource; } interface GPUBindGroupDescriptor extends GPUObjectDescriptorBase { layout: GPUBindGroupLayout; bindings: GPUBindGroupBinding[]; } interface GPUBindGroupLayoutBinding { binding: number; visibility: GPUShaderStageFlags; type: GPUBindingType; textureDimension?: GPUTextureViewDimension; multisampled?: boolean; dynamic?: boolean; } interface GPUBindGroupLayoutDescriptor extends GPUObjectDescriptorBase { bindings?: GPUBindGroupLayoutBinding[]; } interface GPUBlendDescriptor { dstFactor?: GPUBlendFactor; operation?: GPUBlendOperation; srcFactor?: GPUBlendFactor; } interface GPUColorStateDescriptor { format: GPUTextureFormat; alphaBlend?: GPUBlendDescriptor; colorBlend?: GPUBlendDescriptor; writeMask?: GPUColorWriteFlags; } interface GPUBufferBinding { buffer: GPUBuffer; offset?: number; size?: number; } interface GPUBufferCopyView { buffer: GPUBuffer; offset?: number; rowPitch: number; imageHeight: number; } interface GPUTextureCopyView { texture: GPUTexture; mipLevel?: number; arrayLayer?: number; origin?: GPUOrigin3D; } interface GPUImageBitmapCopyView { imageBitmap: ImageBitmap; origin?: GPUOrigin2D; } interface GPUBufferDescriptor extends GPUObjectDescriptorBase { size: number; usage: GPUBufferUsageFlags; } interface GPUCommandEncoderDescriptor extends GPUObjectDescriptorBase { label?: string; } interface GPUComputePipelineDescriptor extends GPUPipelineDescriptorBase { computeStage: GPUProgrammableStageDescriptor; } interface GPUDepthStencilStateDescriptor { format: GPUTextureFormat; depthWriteEnabled?: boolean; depthCompare?: GPUCompareFunction; stencilFront: GPUStencilStateFaceDescriptor; stencilBack: GPUStencilStateFaceDescriptor; stencilReadMask?: number; stencilWriteMask?: number; } interface GPUDeviceDescriptor extends GPUObjectDescriptorBase { extensions?: GPUExtensions; limits?: GPULimits; } interface GPUExtensions { anisotropicFiltering?: boolean; } interface GPUFenceDescriptor extends GPUObjectDescriptorBase { initialValue?: number; label?: string; signalQueue?: GPUQueue; } interface GPUVertexAttributeDescriptor { offset?: number; format: GPUVertexFormat; shaderLocation: number; } interface GPUVertexBufferDescriptor { stride: number; stepMode?: GPUInputStepMode; attributeSet: GPUVertexAttributeDescriptor[]; } interface GPUVertexInputDescriptor { indexFormat?: GPUIndexFormat; vertexBuffers: GPUVertexBufferDescriptor[]; } interface GPULimits { maxBindGroups?: number; } interface GPUPipelineDescriptorBase { label?: string; layout: GPUPipelineLayout; } interface GPUPipelineLayoutDescriptor extends GPUObjectDescriptorBase { bindGroupLayouts: GPUBindGroupLayout[]; } interface GPUProgrammableStageDescriptor { module: GPUShaderModule; entryPoint: string; } interface GPURasterizationStateDescriptor { frontFace?: GPUFrontFace; cullMode?: GPUCullMode; depthBias?: number; depthBiasSlopeScale?: number; depthBiasClamp?: number; } interface GPURenderPassColorAttachmentDescriptor { attachment: GPUTextureView; resolveTarget?: GPUTextureView | null; loadValue: GPULoadOp | GPUColor; storeOp: GPUStoreOp; } interface GPURenderPassDepthStencilAttachmentDescriptor { attachment: GPUTextureView; depthLoadValue: GPULoadOp | number; depthStoreOp: GPUStoreOp; stencilLoadValue: GPULoadOp | number; stencilStoreOp: GPUStoreOp; } interface GPURenderPassDescriptor extends GPUObjectDescriptorBase { colorAttachments: GPURenderPassColorAttachmentDescriptor[]; depthStencilAttachment?: GPURenderPassDepthStencilAttachmentDescriptor | null; } interface GPURenderPipelineStageDescriptor { vertexStage: GPUProgrammableStageDescriptor; fragmentStage?: GPUProgrammableStageDescriptor | null; } interface GPURenderPipelineDescriptor extends GPUPipelineDescriptorBase, GPURenderPipelineStageDescriptor { primitiveTopology: GPUPrimitiveTopology; rasterizationState?: GPURasterizationStateDescriptor; colorStates: GPUColorStateDescriptor[]; depthStencilState?: GPUDepthStencilStateDescriptor | null; vertexInput: GPUVertexInputDescriptor; sampleCount?: number; sampleMask?: number; alphaToCoverageEnabled?: boolean; } interface GPUSamplerDescriptor extends GPUObjectDescriptorBase { compare?: GPUCompareFunction; lodMaxClamp?: number; lodMinClamp?: number; magFilter?: GPUFilterMode; maxAnisotropy?: number; minFilter?: GPUFilterMode; mipmapFilter?: GPUFilterMode; addressModeU?: GPUAddressMode; addressModeV?: GPUAddressMode; addressModeW?: GPUAddressMode; } interface GPUShaderModuleDescriptor extends GPUObjectDescriptorBase { code: Uint32Array | string; label?: string; } interface GPUStencilStateFaceDescriptor { compare?: GPUCompareFunction; depthFailOp?: GPUStencilOperation; passOp?: GPUStencilOperation; failOp?: GPUStencilOperation; } interface GPUSwapChainDescriptor extends GPUObjectDescriptorBase { device: GPUDevice; format: GPUTextureFormat; usage?: GPUTextureUsageFlags; } interface GPUTextureDescriptor extends GPUObjectDescriptorBase { size: GPUExtent3D; arrayLayerCount?: number; mipLevelCount?: number; sampleCount?: number; dimension?: GPUTextureDimension; format: GPUTextureFormat; usage: GPUTextureUsageFlags; } interface GPUTextureViewDescriptor extends GPUObjectDescriptorBase { aspect: GPUTextureAspect; baseArrayLayer?: number; baseMipLevel?: number; dimension: GPUTextureViewDimension; format: GPUTextureFormat; arrayLayerCount?: number; mipLevelCount?: number; } interface GPUAdapter extends GPUObjectBase { readonly extensions: GPUExtensions; readonly name: string; requestDevice(descriptor?: GPUDeviceDescriptor): Promise; } interface GPUBindGroup extends GPUObjectBase { } interface GPUBindGroupLayout extends GPUObjectBase { } interface GPUBuffer extends GPUObjectBase { //readonly mapping: ArrayBuffer | null; destroy(): void; unmap(): void; mapWriteAsync(): Promise; mapReadAsync(): Promise; // TODO: Remove setSubData (#280) setSubData(offset: number, src: ArrayBufferView, srcOffset?: number, byteLength?: number): void; } interface GPUCommandBuffer extends GPUObjectBase { } interface GPUCommandBufferDescriptor extends GPUObjectDescriptorBase { } interface GPUCommandEncoder extends GPUObjectBase { beginComputePass(descriptor?: GPUComputePassDescriptor): GPUComputePassEncoder; beginRenderPass(descriptor: GPURenderPassDescriptor): GPURenderPassEncoder; copyBufferToBuffer(source: GPUBuffer, sourceOffset: number, destination: GPUBuffer, destinationOffset: number, size: number): void; copyBufferToTexture(source: GPUBufferCopyView, destination: GPUTextureCopyView, copySize: GPUExtent3D): void; copyTextureToBuffer(source: GPUTextureCopyView, destination: GPUBufferCopyView, copySize: GPUExtent3D): void; copyTextureToTexture(source: GPUTextureCopyView, destination: GPUTextureCopyView, copySize: GPUExtent3D): void; copyImageBitmapToTexture(source: GPUImageBitmapCopyView, destination: GPUTextureCopyView, copySize: GPUExtent3D): void; finish(descriptor?: GPUCommandBufferDescriptor): GPUCommandBuffer; popDebugGroup(): void; pushDebugGroup(groupLabel: string): void; insertDebugMarker(markerLabel: string): void; } interface GPUComputePassDescriptor extends GPUObjectDescriptorBase { } interface GPUComputePassEncoder extends GPUProgrammablePassEncoder { setPipeline(pipeline: GPUComputePipeline): void; dispatch(x: number, y?: number, z?: number): void; dispatchIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void; endPass(): void; } interface GPUComputePipeline extends GPUObjectBase { } interface GPUObjectBase { label: string | undefined; } interface GPUObjectDescriptorBase { label?: string; } // SwapChain / CanvasContext interface GPUCanvasContext { configureSwapChain(descriptor: GPUSwapChainDescriptor): GPUSwapChain; getSwapChainPreferredFormat(device: GPUDevice): Promise; } interface GPUDevice extends GPUObjectBase { readonly adapter: GPUAdapter; readonly extensions: GPUExtensions; readonly limits: GPULimits; createBindGroup(descriptor: GPUBindGroupDescriptor): GPUBindGroup; createBindGroupLayout(descriptor: GPUBindGroupLayoutDescriptor): GPUBindGroupLayout; createBuffer(descriptor: GPUBufferDescriptor): GPUBuffer; createBufferMapped(descriptor: GPUBufferDescriptor): [GPUBuffer, ArrayBuffer]; createBufferMappedAsync(descriptor: GPUBufferDescriptor): Promise<[GPUBuffer, ArrayBuffer]>; createComputePipeline(descriptor: GPUComputePipelineDescriptor): GPUComputePipeline; createPipelineLayout(descriptor: GPUPipelineLayoutDescriptor): GPUPipelineLayout; createRenderPipeline(descriptor: GPURenderPipelineDescriptor): GPURenderPipeline; createSampler(descriptor?: GPUSamplerDescriptor): GPUSampler; createShaderModule(descriptor: GPUShaderModuleDescriptor): GPUShaderModule; createTexture(descriptor: GPUTextureDescriptor): GPUTexture; createCommandEncoder(descriptor?: GPUCommandEncoderDescriptor): GPUCommandEncoder; createRenderBundleEncoder(descriptor: GPURenderBundleEncoderDescriptor): GPURenderBundleEncoder; getQueue(): GPUQueue; readonly lost: Promise; } interface GPUFence extends GPUObjectBase { getCompletedValue(): number; onCompletion(completionValue: number): Promise; } interface GPUPipelineLayout extends GPUObjectBase { } interface GPUProgrammablePassEncoder extends GPUObjectBase { setBindGroup(index: number, bindGroup: GPUBindGroup): void; popDebugGroup(): void; pushDebugGroup(groupLabel: string): void; insertDebugMarker(markerLabel: string): void; } interface GPUQueue extends GPUObjectBase { signal(fence: GPUFence, signalValue: number): void; submit(buffers: GPUCommandBuffer[]): void; createFence(descriptor?: GPUFenceDescriptor): GPUFence; } interface GPURenderEncoderBase extends GPUProgrammablePassEncoder { setPipeline(pipeline: GPURenderPipeline): void; setIndexBuffer(buffer: GPUBuffer, offset: number): void; setVertexBuffers(startSlot: number, buffers: GPUBuffer[], offsets: number[]): void; draw(vertexCount: number, instanceCount: number, firstVertex: number, firstInstance: number): void; drawIndexed(indexCount: number, instanceCount: number, firstIndex: number, baseVertex: number, firstInstance: number): void; drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void; drawIndexedIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void; } interface GPURenderPassEncoder extends GPURenderEncoderBase { setViewport(x: number, y: number, width: number, height: number, minDepth: number, maxDepth: number): void; setScissorRect(x: number, y: number, width: number, height: number): void; setBlendColor(color: GPUColor): void; setStencilReference(reference: number): void; executeBundles(bundles: GPURenderBundle[]): void; endPass(): void; } interface GPURenderBundleDescriptor extends GPUObjectDescriptorBase { } interface GPURenderBundle extends GPUObjectBase { } interface GPURenderBundleEncoder extends GPURenderEncoderBase { } interface GPURenderBundleEncoderDescriptor extends GPUObjectDescriptorBase { colorFormats: GPUTextureFormat[]; depthStencilFormat: GPUTextureFormat; sampleCount?: number; } interface GPURenderPipeline extends GPUObjectBase { } interface GPUSampler extends GPUObjectBase { } interface GPUShaderModule extends GPUObjectBase { } interface GPUSwapChain extends GPUObjectBase { getCurrentTexture(): GPUTexture; } interface GPUTexture extends GPUObjectBase { createDefaultView(): GPUTextureView; createView(descriptor: GPUTextureViewDescriptor): GPUTextureView; destroy(): void; } interface GPUTextureView extends GPUObjectBase { } type GPUPowerPreference = | "low-power" | "high-performance"; interface GPURequestAdapterOptions { powerPreference?: GPUPowerPreference; } interface GPU { requestAdapter(options?: GPURequestAdapterOptions): Promise; } // **************************************************************************** // ERROR SCOPES // **************************************************************************** type GPUErrorFilter = "none" | "out-of-memory" | "validation"; declare class GPUOutOfMemoryError { constructor(); } declare class GPUValidationError { constructor(message: string); readonly message: string; } type GPUError = GPUOutOfMemoryError | GPUValidationError; interface GPUDevice { pushErrorScope(filter: GPUErrorFilter): void; popErrorScope(): Promise; } // **************************************************************************** // TELEMETRY // **************************************************************************** interface GPUUncapturedErrorEvent extends Event { readonly error: GPUError; } interface GPUUncapturedErrorEventInit extends EventInit { error: GPUError; } interface GPUDevice extends EventTarget { onuncapturederror: Event | undefined; } interface GPUDeviceLostInfo { readonly message: string; } interface GPU { // May reject with DOMException // TODO: DOMException("OperationError")? requestAdapter(options?: GPURequestAdapterOptions): Promise; } interface Navigator { readonly gpu: GPU | undefined; }