@luma.gl/webgpu 9.0.0-alpha.15 → 9.0.0-alpha.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/helpers/accessor-to-format.js +100 -1
- package/dist/adapter/helpers/convert-texture-format.js +5 -6
- package/dist/adapter/helpers/generate-mipmaps.js +88 -92
- package/dist/adapter/helpers/get-bind-group.js +54 -48
- package/dist/adapter/helpers/get-vertex-buffer-layout.js +97 -84
- package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -1
- package/dist/adapter/helpers/webgpu-parameters.js +181 -129
- package/dist/adapter/resources/webgpu-buffer.js +57 -73
- package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-command-encoder.js +47 -63
- package/dist/adapter/resources/webgpu-compute-pass.d.ts +1 -1
- package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-compute-pass.js +51 -55
- package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-compute-pipeline.js +22 -24
- package/dist/adapter/resources/webgpu-external-texture.js +26 -27
- package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-framebuffer.js +89 -103
- package/dist/adapter/resources/webgpu-query.js +42 -1
- package/dist/adapter/resources/webgpu-render-pass.d.ts +1 -1
- package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-render-pass.js +64 -89
- package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-render-pipeline.js +158 -154
- package/dist/adapter/resources/webgpu-sampler.d.ts +1 -1
- package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-sampler.js +16 -22
- package/dist/adapter/resources/webgpu-shader.d.ts +1 -1
- package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-shader.js +47 -58
- package/dist/adapter/resources/webgpu-texture.d.ts +0 -1
- package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-texture.js +100 -103
- package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgpu-canvas-context.js +77 -90
- package/dist/adapter/webgpu-device.js +215 -242
- package/dist/adapter/webgpu-types.js +0 -2
- package/dist/bundle.js +1 -2
- package/dist/dist.js +8051 -0
- package/dist/dist.min.js +1 -0
- package/dist/es5/adapter/helpers/accessor-to-format.js +2 -0
- package/dist/es5/adapter/helpers/accessor-to-format.js.map +1 -0
- package/dist/es5/adapter/helpers/convert-texture-format.js +13 -0
- package/dist/es5/adapter/helpers/convert-texture-format.js.map +1 -0
- package/dist/es5/adapter/helpers/generate-mipmaps.js +103 -0
- package/dist/es5/adapter/helpers/generate-mipmaps.js.map +1 -0
- package/dist/es5/adapter/helpers/get-bind-group.js +66 -0
- package/dist/es5/adapter/helpers/get-bind-group.js.map +1 -0
- package/dist/es5/adapter/helpers/get-vertex-buffer-layout.js +149 -0
- package/dist/es5/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
- package/dist/es5/adapter/helpers/webgpu-parameters.js +150 -0
- package/dist/es5/adapter/helpers/webgpu-parameters.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-buffer.js +131 -0
- package/dist/es5/adapter/resources/webgpu-buffer.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-command-encoder.js +90 -0
- package/dist/es5/adapter/resources/webgpu-command-encoder.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-compute-pass.js +85 -0
- package/dist/es5/adapter/resources/webgpu-compute-pass.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-compute-pipeline.js +48 -0
- package/dist/es5/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-external-texture.js +50 -0
- package/dist/es5/adapter/resources/webgpu-external-texture.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-framebuffer.js +126 -0
- package/dist/es5/adapter/resources/webgpu-framebuffer.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-query.js +2 -0
- package/dist/es5/adapter/resources/webgpu-query.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-render-pass.js +124 -0
- package/dist/es5/adapter/resources/webgpu-render-pass.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-render-pipeline.js +185 -0
- package/dist/es5/adapter/resources/webgpu-render-pipeline.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-sampler.js +45 -0
- package/dist/es5/adapter/resources/webgpu-sampler.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-shader.js +125 -0
- package/dist/es5/adapter/resources/webgpu-shader.js.map +1 -0
- package/dist/es5/adapter/resources/webgpu-texture.js +138 -0
- package/dist/es5/adapter/resources/webgpu-texture.js.map +1 -0
- package/dist/es5/adapter/webgpu-canvas-context.js +111 -0
- package/dist/es5/adapter/webgpu-canvas-context.js.map +1 -0
- package/dist/es5/adapter/webgpu-device.js +317 -0
- package/dist/es5/adapter/webgpu-device.js.map +1 -0
- package/dist/es5/adapter/webgpu-types.js +2 -0
- package/dist/es5/adapter/webgpu-types.js.map +1 -0
- package/dist/es5/bundle.js +6 -0
- package/dist/es5/bundle.js.map +1 -0
- package/dist/es5/glsl/glsllang.js +47 -0
- package/dist/es5/glsl/glsllang.js.map +1 -0
- package/dist/es5/index.js +44 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/init.js +7 -0
- package/dist/es5/init.js.map +1 -0
- package/dist/esm/adapter/helpers/accessor-to-format.js +2 -0
- package/dist/esm/adapter/helpers/accessor-to-format.js.map +1 -0
- package/dist/esm/adapter/helpers/convert-texture-format.js +7 -0
- package/dist/esm/adapter/helpers/convert-texture-format.js.map +1 -0
- package/dist/esm/adapter/helpers/generate-mipmaps.js +88 -0
- package/dist/esm/adapter/helpers/generate-mipmaps.js.map +1 -0
- package/dist/esm/adapter/helpers/get-bind-group.js +51 -0
- package/dist/esm/adapter/helpers/get-bind-group.js.map +1 -0
- package/dist/esm/adapter/helpers/get-vertex-buffer-layout.js +83 -0
- package/dist/esm/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
- package/dist/esm/adapter/helpers/webgpu-parameters.js +137 -0
- package/dist/esm/adapter/helpers/webgpu-parameters.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-buffer.js +70 -0
- package/dist/esm/adapter/resources/webgpu-buffer.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-command-encoder.js +49 -0
- package/dist/esm/adapter/resources/webgpu-command-encoder.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-compute-pass.js +44 -0
- package/dist/esm/adapter/resources/webgpu-compute-pass.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-compute-pipeline.js +23 -0
- package/dist/esm/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-external-texture.js +23 -0
- package/dist/esm/adapter/resources/webgpu-external-texture.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-framebuffer.js +93 -0
- package/dist/esm/adapter/resources/webgpu-framebuffer.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-query.js +2 -0
- package/dist/esm/adapter/resources/webgpu-query.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-render-pass.js +79 -0
- package/dist/esm/adapter/resources/webgpu-render-pass.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-render-pipeline.js +130 -0
- package/dist/esm/adapter/resources/webgpu-render-pipeline.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-sampler.js +20 -0
- package/dist/esm/adapter/resources/webgpu-sampler.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-shader.js +50 -0
- package/dist/esm/adapter/resources/webgpu-shader.js.map +1 -0
- package/dist/esm/adapter/resources/webgpu-texture.js +95 -0
- package/dist/esm/adapter/resources/webgpu-texture.js.map +1 -0
- package/dist/esm/adapter/webgpu-canvas-context.js +74 -0
- package/dist/esm/adapter/webgpu-canvas-context.js.map +1 -0
- package/dist/esm/adapter/webgpu-device.js +196 -0
- package/dist/esm/adapter/webgpu-device.js.map +1 -0
- package/dist/esm/adapter/webgpu-types.js +2 -0
- package/dist/esm/adapter/webgpu-types.js.map +1 -0
- package/dist/esm/bundle.js +4 -0
- package/dist/esm/bundle.js.map +1 -0
- package/dist/esm/glsl/glsllang.js +9 -0
- package/dist/esm/glsl/glsllang.js.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/init.js +4 -0
- package/dist/esm/init.js.map +1 -0
- package/dist/glsl/glsllang.js +9 -7
- package/dist/index.js +8 -6
- package/dist/init.js +1 -2
- package/package.json +8 -8
- package/src/adapter/helpers/webgpu-parameters.ts +7 -2
- package/src/adapter/resources/webgpu-command-encoder.ts +2 -1
- package/src/adapter/resources/webgpu-compute-pass.ts +4 -4
- package/src/adapter/resources/webgpu-compute-pipeline.ts +2 -1
- package/src/adapter/resources/webgpu-framebuffer.ts +3 -2
- package/src/adapter/resources/webgpu-render-pass.ts +2 -2
- package/src/adapter/resources/webgpu-render-pipeline.ts +2 -1
- package/src/adapter/resources/webgpu-shader.ts +1 -1
- package/src/adapter/webgpu-canvas-context.ts +3 -2
- package/src/adapter/webgpu-device.ts +2 -2
- package/dist/adapter/helpers/accessor-to-format.js.map +0 -1
- package/dist/adapter/helpers/convert-texture-format.js.map +0 -1
- package/dist/adapter/helpers/generate-mipmaps.js.map +0 -1
- package/dist/adapter/helpers/get-bind-group.js.map +0 -1
- package/dist/adapter/helpers/get-vertex-buffer-layout.js.map +0 -1
- package/dist/adapter/helpers/webgpu-parameters.js.map +0 -1
- package/dist/adapter/resources/webgpu-buffer.js.map +0 -1
- package/dist/adapter/resources/webgpu-command-encoder.js.map +0 -1
- package/dist/adapter/resources/webgpu-compute-pass.js.map +0 -1
- package/dist/adapter/resources/webgpu-compute-pipeline.js.map +0 -1
- package/dist/adapter/resources/webgpu-external-texture.js.map +0 -1
- package/dist/adapter/resources/webgpu-framebuffer.js.map +0 -1
- package/dist/adapter/resources/webgpu-query.js.map +0 -1
- package/dist/adapter/resources/webgpu-render-pass.js.map +0 -1
- package/dist/adapter/resources/webgpu-render-pipeline.js.map +0 -1
- package/dist/adapter/resources/webgpu-sampler.js.map +0 -1
- package/dist/adapter/resources/webgpu-shader.js.map +0 -1
- package/dist/adapter/resources/webgpu-texture.js.map +0 -1
- package/dist/adapter/webgpu-canvas-context.js.map +0 -1
- package/dist/adapter/webgpu-device.js.map +0 -1
- package/dist/adapter/webgpu-types.js.map +0 -1
- package/dist/bundle.js.map +0 -1
- package/dist/glsl/glsllang.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.js.map +0 -1
|
@@ -1,142 +1,194 @@
|
|
|
1
1
|
function addDepthStencil(descriptor) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
descriptor.depthStencil = descriptor.depthStencil || {
|
|
3
|
+
// required, set something
|
|
4
|
+
format: 'depth24plus',
|
|
5
|
+
stencilFront: {},
|
|
6
|
+
stencilBack: {},
|
|
7
|
+
// TODO can this cause trouble? Should we set to WebGPU defaults? Are there defaults?
|
|
8
|
+
depthWriteEnabled: undefined,
|
|
9
|
+
depthCompare: undefined
|
|
10
|
+
};
|
|
11
|
+
return descriptor.depthStencil;
|
|
8
12
|
}
|
|
9
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Supports for luma.gl's flat parameter space
|
|
15
|
+
* Populates the corresponding sub-objects in a GPURenderPipelineDescriptor
|
|
16
|
+
*/
|
|
17
|
+
// @ts-expect-error
|
|
10
18
|
export const PARAMETER_TABLE = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
19
|
+
// RASTERIZATION PARAMETERS
|
|
20
|
+
cullMode: (parameter, value, descriptor) => {
|
|
21
|
+
descriptor.primitive = descriptor.primitive || {};
|
|
22
|
+
descriptor.primitive.cullMode = value;
|
|
23
|
+
},
|
|
24
|
+
frontFace: (parameter, value, descriptor) => {
|
|
25
|
+
descriptor.primitive = descriptor.primitive || {};
|
|
26
|
+
descriptor.primitive.frontFace = value;
|
|
27
|
+
},
|
|
28
|
+
// DEPTH
|
|
29
|
+
depthWriteEnabled: (parameter, value, descriptor) => {
|
|
30
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
31
|
+
depthStencil.depthWriteEnabled = value;
|
|
32
|
+
},
|
|
33
|
+
depthCompare: (parameter, value, descriptor) => {
|
|
34
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
35
|
+
depthStencil.depthCompare = value;
|
|
36
|
+
},
|
|
37
|
+
depthFormat: (parameter, value, descriptor) => {
|
|
38
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
39
|
+
depthStencil.format = value;
|
|
40
|
+
},
|
|
41
|
+
depthBias: (parameter, value, descriptor) => {
|
|
42
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
43
|
+
depthStencil.depthBias = value;
|
|
44
|
+
},
|
|
45
|
+
depthBiasSlopeScale: (parameter, value, descriptor) => {
|
|
46
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
47
|
+
depthStencil.depthBiasSlopeScale = value;
|
|
48
|
+
},
|
|
49
|
+
depthBiasClamp: (parameter, value, descriptor) => {
|
|
50
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
51
|
+
depthStencil.depthBiasClamp = value;
|
|
52
|
+
},
|
|
53
|
+
// STENCIL
|
|
54
|
+
stencilReadMask: (parameter, value, descriptor) => {
|
|
55
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
56
|
+
depthStencil.stencilReadMask = value;
|
|
57
|
+
},
|
|
58
|
+
stencilWriteMask: (parameter, value, descriptor) => {
|
|
59
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
60
|
+
depthStencil.stencilWriteMask = value;
|
|
61
|
+
},
|
|
62
|
+
stencilCompare: (parameter, value, descriptor) => {
|
|
63
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
64
|
+
depthStencil.stencilFront.compare = value;
|
|
65
|
+
depthStencil.stencilBack.compare = value;
|
|
66
|
+
},
|
|
67
|
+
stencilPassOperation: (parameter, value, descriptor) => {
|
|
68
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
69
|
+
depthStencil.stencilFront.passOp = value;
|
|
70
|
+
depthStencil.stencilBack.passOp = value;
|
|
71
|
+
},
|
|
72
|
+
stencilFailOperation: (parameter, value, descriptor) => {
|
|
73
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
74
|
+
depthStencil.stencilFront.failOp = value;
|
|
75
|
+
depthStencil.stencilBack.failOp = value;
|
|
76
|
+
},
|
|
77
|
+
stencilDepthFailOperation: (parameter, value, descriptor) => {
|
|
78
|
+
const depthStencil = addDepthStencil(descriptor);
|
|
79
|
+
depthStencil.stencilFront.depthFailOp = value;
|
|
80
|
+
depthStencil.stencilBack.depthFailOp = value;
|
|
81
|
+
},
|
|
82
|
+
// MULTISAMPLE
|
|
83
|
+
sampleCount: (parameter, value, descriptor) => {
|
|
84
|
+
descriptor.multisample = descriptor.multisample || {};
|
|
85
|
+
descriptor.multisample.count = value;
|
|
86
|
+
},
|
|
87
|
+
sampleMask: (parameter, value, descriptor) => {
|
|
88
|
+
descriptor.multisample = descriptor.multisample || {};
|
|
89
|
+
descriptor.multisample.mask = value;
|
|
90
|
+
},
|
|
91
|
+
sampleAlphaToCoverageEnabled: (parameter, value, descriptor) => {
|
|
92
|
+
descriptor.multisample = descriptor.multisample || {};
|
|
93
|
+
descriptor.multisample.alphaToCoverageEnabled = value;
|
|
94
|
+
},
|
|
95
|
+
// COLOR
|
|
96
|
+
colorMask: (parameter, value, descriptor) => {
|
|
97
|
+
const targets = addColorState(descriptor);
|
|
98
|
+
targets[0].writeMask = value;
|
|
99
|
+
},
|
|
100
|
+
blendColorOperation: (parameter, value, descriptor) => {
|
|
101
|
+
addColorState(descriptor);
|
|
102
|
+
// const targets = addColorState(descriptor);
|
|
103
|
+
// const target = targets[0];
|
|
104
|
+
// const blend: GPUBlendState = target.blend || {color: {alpha: 0}};
|
|
105
|
+
// blend.color = blend.color || {};
|
|
106
|
+
// target.blend.color.operation = value;
|
|
107
|
+
}
|
|
108
|
+
/*
|
|
109
|
+
blendColorSrcTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
|
|
110
|
+
addColorState(descriptor);
|
|
111
|
+
targets[0].blend = targets[0].blend || {};
|
|
112
|
+
targets[0].blend.color = targets[0].blend.color || {};
|
|
113
|
+
targets[0].blend.color.srcTarget = value;
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
blendColorDstTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
|
|
117
|
+
addColorState(descriptor);
|
|
118
|
+
targets[0].blend = targets[0].blend || {};
|
|
119
|
+
targets[0].blend.color = targets[0].blend.color || {};
|
|
120
|
+
targets[0].blend.color.dstTarget = value;
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
blendAlphaOperation: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
|
|
124
|
+
addColorState(descriptor);
|
|
125
|
+
targets[0].blend = targets[0].blend || {};
|
|
126
|
+
targets[0].blend.alpha = targets[0].blend.alpha || {};
|
|
127
|
+
targets[0].blend.alpha.operation = value;
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
blendAlphaSrcTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
|
|
131
|
+
addColorState(descriptor);
|
|
132
|
+
targets[0].blend = targets[0].blend || {};
|
|
133
|
+
targets[0].blend.alpha = targets[0].blend.alpha || {};
|
|
134
|
+
targets[0].blend.alpha.srcTarget = value;
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
blendAlphaDstTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
|
|
138
|
+
addColorState(descriptor);
|
|
139
|
+
targets[0].blend = targets[0].blend || {};
|
|
140
|
+
targets[0].blend.alpha = targets[0].blend.alpha || {};
|
|
141
|
+
targets[0].blend.alpha.dstTarget = value;
|
|
142
|
+
},
|
|
143
|
+
*/
|
|
90
144
|
};
|
|
91
145
|
const DEFAULT_PIPELINE_DESCRIPTOR = {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
146
|
+
// depthStencil: {
|
|
147
|
+
// stencilFront: {},
|
|
148
|
+
// stencilBack: {},
|
|
149
|
+
// // depthWriteEnabled: true,
|
|
150
|
+
// // depthCompare: 'less',
|
|
151
|
+
// // format: 'depth24plus-stencil8',
|
|
152
|
+
// },
|
|
153
|
+
primitive: {
|
|
154
|
+
cullMode: 'back',
|
|
155
|
+
topology: 'triangle-list'
|
|
156
|
+
},
|
|
157
|
+
vertex: {
|
|
158
|
+
module: undefined,
|
|
159
|
+
entryPoint: 'main'
|
|
160
|
+
},
|
|
161
|
+
fragment: {
|
|
162
|
+
module: undefined,
|
|
163
|
+
entryPoint: 'main',
|
|
164
|
+
targets: [
|
|
165
|
+
// { format: props.color0Format || 'bgra8unorm' }
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
layout: 'auto'
|
|
105
169
|
};
|
|
106
170
|
export function applyParametersToRenderPipelineDescriptor(pipelineDescriptor, parameters = {}) {
|
|
107
|
-
|
|
108
|
-
...pipelineDescriptor
|
|
109
|
-
|
|
110
|
-
setParameters(pipelineDescriptor, parameters);
|
|
171
|
+
// Apply defaults
|
|
172
|
+
Object.assign(pipelineDescriptor, { ...DEFAULT_PIPELINE_DESCRIPTOR, ...pipelineDescriptor });
|
|
173
|
+
setParameters(pipelineDescriptor, parameters);
|
|
111
174
|
}
|
|
112
|
-
|
|
175
|
+
// Apply any supplied parameters
|
|
113
176
|
function setParameters(pipelineDescriptor, parameters) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
177
|
+
for (const [key, value] of Object.entries(parameters)) {
|
|
178
|
+
const setterFunction = PARAMETER_TABLE[key];
|
|
179
|
+
if (!setterFunction) {
|
|
180
|
+
throw new Error(`Illegal parameter ${key}`);
|
|
181
|
+
}
|
|
182
|
+
setterFunction(key, value, pipelineDescriptor);
|
|
119
183
|
}
|
|
120
|
-
|
|
121
|
-
setterFunction(key, value, pipelineDescriptor);
|
|
122
|
-
}
|
|
123
184
|
}
|
|
124
|
-
|
|
125
185
|
function addColorState(descriptor) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (((_descriptor$fragment3 = descriptor.fragment) === null || _descriptor$fragment3 === void 0 ? void 0 : (_descriptor$fragment4 = _descriptor$fragment3.targets) === null || _descriptor$fragment4 === void 0 ? void 0 : _descriptor$fragment4.length) === 0) {
|
|
135
|
-
var _descriptor$fragment$;
|
|
136
|
-
|
|
137
|
-
(_descriptor$fragment$ = descriptor.fragment.targets) === null || _descriptor$fragment$ === void 0 ? void 0 : _descriptor$fragment$.push({});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return (_descriptor$fragment5 = descriptor.fragment) === null || _descriptor$fragment5 === void 0 ? void 0 : _descriptor$fragment5.targets;
|
|
186
|
+
descriptor.fragment.targets = descriptor.fragment?.targets || [];
|
|
187
|
+
if (!Array.isArray(descriptor.fragment?.targets)) {
|
|
188
|
+
throw new Error('colorstate');
|
|
189
|
+
}
|
|
190
|
+
if (descriptor.fragment?.targets?.length === 0) {
|
|
191
|
+
descriptor.fragment.targets?.push({});
|
|
192
|
+
}
|
|
193
|
+
return descriptor.fragment?.targets;
|
|
141
194
|
}
|
|
142
|
-
//# sourceMappingURL=webgpu-parameters.js.map
|
|
@@ -1,80 +1,64 @@
|
|
|
1
|
-
|
|
1
|
+
// WEBGPU Buffer implementation
|
|
2
2
|
import { Buffer } from '@luma.gl/api';
|
|
3
|
-
|
|
4
3
|
function getByteLength(props) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return props.byteLength || ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.byteLength) || 0;
|
|
4
|
+
return props.byteLength || props.data?.byteLength || 0;
|
|
8
5
|
}
|
|
9
|
-
|
|
10
6
|
export default class WebGPUBuffer extends Buffer {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (props.data) {
|
|
31
|
-
this._writeMapped(props.data);
|
|
7
|
+
constructor(device, props) {
|
|
8
|
+
super(device, props);
|
|
9
|
+
this.device = device;
|
|
10
|
+
this.byteLength = getByteLength(props);
|
|
11
|
+
const mapBuffer = Boolean(props.data);
|
|
12
|
+
this.handle = this.props.handle || this.device.handle.createBuffer({
|
|
13
|
+
size: this.byteLength,
|
|
14
|
+
// usage defaults to vertex
|
|
15
|
+
usage: this.props.usage || (GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST),
|
|
16
|
+
mappedAtCreation: this.props.mappedAtCreation || mapBuffer,
|
|
17
|
+
label: this.props.id
|
|
18
|
+
});
|
|
19
|
+
if (props.data) {
|
|
20
|
+
this._writeMapped(props.data);
|
|
21
|
+
// this.handle.writeAsync({data: props.data, map: false, unmap: false});
|
|
22
|
+
}
|
|
23
|
+
if (mapBuffer && !props.mappedAtCreation) {
|
|
24
|
+
this.handle.unmap();
|
|
25
|
+
}
|
|
32
26
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
destroy() {
|
|
28
|
+
this.handle.destroy();
|
|
29
|
+
}
|
|
30
|
+
// WebGPU provides multiple ways to write a buffer...
|
|
31
|
+
write(data, byteOffset = 0) {
|
|
32
|
+
this.device.handle.queue.writeBuffer(this.handle, byteOffset, data.buffer, data.byteOffset, data.byteLength);
|
|
33
|
+
}
|
|
34
|
+
async readAsync(byteOffset = 0, byteLength = this.byteLength) {
|
|
35
|
+
// We need MAP_READ flag, but only COPY_DST buffers can have MAP_READ flag, so we need to create a temp buffer
|
|
36
|
+
const tempBuffer = new WebGPUBuffer(this.device, { usage: Buffer.MAP_READ | Buffer.COPY_DST, byteLength });
|
|
37
|
+
// Now do a GPU-side copy into the temp buffer we can actually read.
|
|
38
|
+
// TODO - we are spinning up an independent command queue here, what does this mean
|
|
39
|
+
const commandEncoder = this.device.handle.createCommandEncoder();
|
|
40
|
+
commandEncoder.copyBufferToBuffer(this.handle, byteOffset, tempBuffer.handle, 0, byteLength);
|
|
41
|
+
this.device.handle.queue.submit([commandEncoder.finish()]);
|
|
42
|
+
// Map the temp buffer and read the data.
|
|
43
|
+
await tempBuffer.handle.mapAsync(GPUMapMode.READ, byteOffset, byteLength);
|
|
44
|
+
const arrayBuffer = tempBuffer.handle.getMappedRange().slice(0);
|
|
45
|
+
tempBuffer.handle.unmap();
|
|
46
|
+
tempBuffer.destroy();
|
|
47
|
+
return arrayBuffer;
|
|
48
|
+
}
|
|
49
|
+
_writeMapped(typedArray) {
|
|
50
|
+
const arrayBuffer = this.handle.getMappedRange();
|
|
51
|
+
// @ts-expect-error
|
|
52
|
+
new typedArray.constructor(arrayBuffer).set(typedArray);
|
|
53
|
+
}
|
|
54
|
+
// WEBGPU API
|
|
55
|
+
mapAsync(mode, offset = 0, size) {
|
|
56
|
+
return this.handle.mapAsync(mode, offset, size);
|
|
57
|
+
}
|
|
58
|
+
getMappedRange(offset = 0, size) {
|
|
59
|
+
return this.handle.getMappedRange(offset, size);
|
|
60
|
+
}
|
|
61
|
+
unmap() {
|
|
62
|
+
this.handle.unmap();
|
|
36
63
|
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
destroy() {
|
|
40
|
-
this.handle.destroy();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
write(data, byteOffset = 0) {
|
|
44
|
-
this.device.handle.queue.writeBuffer(this.handle, byteOffset, data.buffer, data.byteOffset, data.byteLength);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async readAsync(byteOffset = 0, byteLength = this.byteLength) {
|
|
48
|
-
const tempBuffer = new WebGPUBuffer(this.device, {
|
|
49
|
-
usage: Buffer.MAP_READ | Buffer.COPY_DST,
|
|
50
|
-
byteLength
|
|
51
|
-
});
|
|
52
|
-
const commandEncoder = this.device.handle.createCommandEncoder();
|
|
53
|
-
commandEncoder.copyBufferToBuffer(this.handle, byteOffset, tempBuffer.handle, 0, byteLength);
|
|
54
|
-
this.device.handle.queue.submit([commandEncoder.finish()]);
|
|
55
|
-
await tempBuffer.handle.mapAsync(GPUMapMode.READ, byteOffset, byteLength);
|
|
56
|
-
const arrayBuffer = tempBuffer.handle.getMappedRange().slice(0);
|
|
57
|
-
tempBuffer.handle.unmap();
|
|
58
|
-
tempBuffer.destroy();
|
|
59
|
-
return arrayBuffer;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
_writeMapped(typedArray) {
|
|
63
|
-
const arrayBuffer = this.handle.getMappedRange();
|
|
64
|
-
new typedArray.constructor(arrayBuffer).set(typedArray);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
mapAsync(mode, offset = 0, size) {
|
|
68
|
-
return this.handle.mapAsync(mode, offset, size);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
getMappedRange(offset = 0, size) {
|
|
72
|
-
return this.handle.getMappedRange(offset, size);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
unmap() {
|
|
76
|
-
this.handle.unmap();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
64
|
}
|
|
80
|
-
//# sourceMappingURL=webgpu-buffer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-command-encoder.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-command-encoder.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAO,MAAM,cAAc,CAAC;AACxF,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAI5C,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,cAAc;IAC9D,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"webgpu-command-encoder.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-command-encoder.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAO,MAAM,cAAc,CAAC;AACxF,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAI5C,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,cAAc;IAC9D,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB;IAUnD,OAAO,IAAI,IAAI;IAExB,MAAM,CAAC,OAAO,CAAC,EAAE;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,gBAAgB;IAOjD,kBAAkB,CAAC,OAAO,EAAE;QAC1B,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GAAG,IAAI;IAUR,mBAAmB,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QAErB,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,KAAK,GAAG,cAAc,GAAG,YAAY,CAAC;QAE/C,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAC7C,GAAG,IAAI;IAuBR,mBAAmB,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,mBAAmB,CAAC;QAC5B,WAAW,EAAE,kBAAkB,CAAC;QAChC,QAAQ,EAAE,WAAW,CAAA;KACtB,GAAG,IAAI;IAER,oBAAoB,CAAC,OAAO,EAAE;QAC5B,MAAM,EAAE,mBAAmB,CAAE;QAC7B,WAAW,EAAE,mBAAmB,CAAC;QACjC,QAAQ,EAAE,WAAW,CAAA;KACtB,GAAG,IAAI;IAEC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,aAAa,IAAI,IAAI;IAIrB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAatD"}
|
|
@@ -1,66 +1,50 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
1
|
import { CommandEncoder, cast } from '@luma.gl/api';
|
|
3
2
|
export default class WebGPUCommandEncoder extends CommandEncoder {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
copyTextureToTexture(options) {}
|
|
52
|
-
|
|
53
|
-
pushDebugGroup(groupLabel) {
|
|
54
|
-
this.handle.pushDebugGroup(groupLabel);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
popDebugGroup() {
|
|
58
|
-
this.handle.popDebugGroup();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
insertDebugMarker(markerLabel) {
|
|
62
|
-
this.handle.insertDebugMarker(markerLabel);
|
|
63
|
-
}
|
|
64
|
-
|
|
3
|
+
constructor(device, props) {
|
|
4
|
+
super(props);
|
|
5
|
+
this.device = device;
|
|
6
|
+
this.handle = props.handle || this.device.handle.createCommandEncoder({
|
|
7
|
+
// TODO was this removed in standard?
|
|
8
|
+
// measureExecutionTime: this.props.measureExecutionTime
|
|
9
|
+
});
|
|
10
|
+
this.handle.label = this.props.id;
|
|
11
|
+
}
|
|
12
|
+
destroy() { }
|
|
13
|
+
finish(options) {
|
|
14
|
+
return this.finish(options);
|
|
15
|
+
}
|
|
16
|
+
// beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;
|
|
17
|
+
// beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;
|
|
18
|
+
copyBufferToBuffer(options) {
|
|
19
|
+
this.handle.copyBufferToBuffer(cast(options.source).handle, options.sourceOffset ?? 0, cast(options.destination).handle, options.destinationOffset ?? 0, options.size ?? 0);
|
|
20
|
+
}
|
|
21
|
+
copyBufferToTexture(options) {
|
|
22
|
+
this.handle.copyBufferToTexture({
|
|
23
|
+
buffer: cast(options.source).handle,
|
|
24
|
+
offset: options.offset ?? 0,
|
|
25
|
+
bytesPerRow: options.bytesPerRow,
|
|
26
|
+
rowsPerImage: options.rowsPerImage,
|
|
27
|
+
}, {
|
|
28
|
+
texture: cast(options.destination).handle,
|
|
29
|
+
mipLevel: options.mipLevel ?? 0,
|
|
30
|
+
origin: options.origin ?? {},
|
|
31
|
+
// aspect: options.aspect
|
|
32
|
+
}, {
|
|
33
|
+
// TODO exclamation mark hack
|
|
34
|
+
width: options.extent[0],
|
|
35
|
+
height: options.extent[1],
|
|
36
|
+
depthOrArrayLayers: options.extent[2]
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
copyTextureToBuffer(options) { }
|
|
40
|
+
copyTextureToTexture(options) { }
|
|
41
|
+
pushDebugGroup(groupLabel) {
|
|
42
|
+
this.handle.pushDebugGroup(groupLabel);
|
|
43
|
+
}
|
|
44
|
+
popDebugGroup() {
|
|
45
|
+
this.handle.popDebugGroup();
|
|
46
|
+
}
|
|
47
|
+
insertDebugMarker(markerLabel) {
|
|
48
|
+
this.handle.insertDebugMarker(markerLabel);
|
|
49
|
+
}
|
|
65
50
|
}
|
|
66
|
-
//# sourceMappingURL=webgpu-command-encoder.js.map
|
|
@@ -8,7 +8,7 @@ export default class WebGPUComputePass extends ComputePass {
|
|
|
8
8
|
constructor(device: WebGPUDevice, props: ComputePassProps);
|
|
9
9
|
/** @note no WebGPU destroy method, just gc */
|
|
10
10
|
destroy(): void;
|
|
11
|
-
|
|
11
|
+
end(): void;
|
|
12
12
|
setPipeline(pipeline: ComputePipeline): void;
|
|
13
13
|
/** Sets an array of bindings (uniform buffers, samplers, textures, ...) */
|
|
14
14
|
setBindings(bindings: Binding[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-compute-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-compute-pass.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAO,MAAM,cAAc,CAAC;AACnG,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAK5C,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;gBAEvC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB;IAUzD,8CAA8C;IACrC,OAAO,IAAI,IAAI;IAExB,
|
|
1
|
+
{"version":3,"file":"webgpu-compute-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-compute-pass.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAO,MAAM,cAAc,CAAC;AACnG,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAK5C,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;gBAEvC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB;IAUzD,8CAA8C;IACrC,OAAO,IAAI,IAAI;IAExB,GAAG,IAAI,IAAI;IAIX,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAM5C,2EAA2E;IAC3E,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAMtC;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIjD;;;;OAIG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,GAAE,MAAU,GAAG,IAAI;IAI1E,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAGxC,aAAa,IAAI,IAAI;IAGrB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAO7C"}
|