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