1import { C } from '../../framework/index.js'; 2 3// Textures 4 5export const kTextureFormatInfo: { 6 [k in GPUTextureFormat]: { 7 renderable: boolean; 8 color: boolean; 9 // Add fields as needed 10 }; 11} = /* prettier-ignore */ { 12 // Try to keep these manually-formatted in a readable grid. 13 // (Note: this list should always match the one in the spec.) 14 15 // 8-bit formats 16 'r8unorm': { renderable: true, color: true }, 17 'r8snorm': { renderable: false, color: true }, 18 'r8uint': { renderable: true, color: true }, 19 'r8sint': { renderable: true, color: true }, 20 // 16-bit formats 21 'r16uint': { renderable: true, color: true }, 22 'r16sint': { renderable: true, color: true }, 23 'r16float': { renderable: true, color: true }, 24 'rg8unorm': { renderable: true, color: true }, 25 'rg8snorm': { renderable: false, color: true }, 26 'rg8uint': { renderable: true, color: true }, 27 'rg8sint': { renderable: true, color: true }, 28 // 32-bit formats 29 'r32uint': { renderable: true, color: true }, 30 'r32sint': { renderable: true, color: true }, 31 'r32float': { renderable: true, color: true }, 32 'rg16uint': { renderable: true, color: true }, 33 'rg16sint': { renderable: true, color: true }, 34 'rg16float': { renderable: true, color: true }, 35 'rgba8unorm': { renderable: true, color: true }, 36 'rgba8unorm-srgb': { renderable: true, color: true }, 37 'rgba8snorm': { renderable: false, color: true }, 38 'rgba8uint': { renderable: true, color: true }, 39 'rgba8sint': { renderable: true, color: true }, 40 'bgra8unorm': { renderable: true, color: true }, 41 'bgra8unorm-srgb': { renderable: true, color: true }, 42 // Packed 32-bit formats 43 'rgb10a2unorm': { renderable: true, color: true }, 44 'rg11b10float': { renderable: false, color: true }, 45 // 64-bit formats 46 'rg32uint': { renderable: true, color: true }, 47 'rg32sint': { renderable: true, color: true }, 48 'rg32float': { renderable: true, color: true }, 49 'rgba16uint': { renderable: true, color: true }, 50 'rgba16sint': { renderable: true, color: true }, 51 'rgba16float': { renderable: true, color: true }, 52 // 128-bit formats 53 'rgba32uint': { renderable: true, color: true }, 54 'rgba32sint': { renderable: true, color: true }, 55 'rgba32float': { renderable: true, color: true }, 56 // Depth/stencil formats 57 'depth32float': { renderable: true, color: false }, 58 'depth24plus': { renderable: true, color: false }, 59 'depth24plus-stencil8': { renderable: true, color: false }, 60}; 61export const kTextureFormats = Object.keys(kTextureFormatInfo) as GPUTextureFormat[]; 62 63// Bindings 64 65export const kMaxBindingsPerBindGroup = 16; 66 67export type PerStageBindingLimitType = 68 | 'uniform-buffer' 69 | 'storage-buffer' 70 | 'sampler' 71 | 'sampled-texture' 72 | 'storage-texture'; 73export const kPerStageBindingLimits: { 74 [k in PerStageBindingLimitType]: number; 75} = /* prettier-ignore */ { 76 'uniform-buffer': 12, 77 'storage-buffer': 4, 78 'sampler': 16, 79 'sampled-texture': 16, 80 'storage-texture': 4, 81}; 82 83const kStagesAll = C.ShaderStage.Vertex | C.ShaderStage.Fragment | C.ShaderStage.Compute; 84const kStagesNonVertex = C.ShaderStage.Fragment | C.ShaderStage.Compute; 85export const kBindingTypeInfo: { 86 [k in GPUBindingType]: { 87 type: 'buffer' | 'texture' | 'sampler'; 88 validStages: GPUShaderStageFlags; 89 perStageLimitType: PerStageBindingLimitType; 90 maxDynamicCount: number; 91 // Add fields as needed 92 }; 93} = /* prettier-ignore */ { 94 'uniform-buffer': { type: 'buffer', validStages: kStagesAll, perStageLimitType: 'uniform-buffer', maxDynamicCount: 8 }, 95 'storage-buffer': { type: 'buffer', validStages: kStagesNonVertex, perStageLimitType: 'storage-buffer', maxDynamicCount: 4 }, 96 'readonly-storage-buffer': { type: 'buffer', validStages: kStagesAll, perStageLimitType: 'storage-buffer', maxDynamicCount: 4 }, 97 'sampler': { type: 'sampler', validStages: kStagesAll, perStageLimitType: 'sampler', maxDynamicCount: 0 }, 98 'sampled-texture': { type: 'texture', validStages: kStagesAll, perStageLimitType: 'sampled-texture', maxDynamicCount: 0 }, 99 'storage-texture': { type: 'texture', validStages: kStagesAll, perStageLimitType: 'storage-texture', maxDynamicCount: 0 }, 100}; 101export const kBindingTypes = Object.keys(kBindingTypeInfo) as GPUBindingType[]; 102 103export const kShaderStages: GPUShaderStageFlags[] = [ 104 C.ShaderStage.Vertex, 105 C.ShaderStage.Fragment, 106 C.ShaderStage.Compute, 107]; 108export const kShaderStageCombinations: GPUShaderStageFlags[] = [0, 1, 2, 3, 4, 5, 6, 7]; 109