@luma.gl/core 9.0.0-alpha.9 → 9.0.0-beta.2

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.
Files changed (306) hide show
  1. package/LICENSE +3 -1
  2. package/README.md +4 -4
  3. package/dist/adapter/attribute-utils/get-attribute-from-layouts.d.ts +52 -0
  4. package/dist/adapter/attribute-utils/get-attribute-from-layouts.d.ts.map +1 -0
  5. package/dist/adapter/attribute-utils/get-attribute-from-layouts.js +130 -0
  6. package/dist/adapter/attribute-utils/get-attribute-from-layouts.js.map +1 -0
  7. package/dist/adapter/canvas-context.d.ts +109 -0
  8. package/dist/adapter/canvas-context.d.ts.map +1 -0
  9. package/dist/adapter/canvas-context.js +254 -0
  10. package/dist/adapter/canvas-context.js.map +1 -0
  11. package/dist/adapter/device.d.ts +219 -0
  12. package/dist/adapter/device.d.ts.map +1 -0
  13. package/dist/adapter/device.js +99 -0
  14. package/dist/adapter/device.js.map +1 -0
  15. package/dist/adapter/resources/buffer.d.ts +56 -0
  16. package/dist/adapter/resources/buffer.d.ts.map +1 -0
  17. package/dist/adapter/resources/buffer.js +62 -0
  18. package/dist/adapter/resources/buffer.js.map +1 -0
  19. package/dist/adapter/resources/command-buffer.d.ts +12 -0
  20. package/dist/adapter/resources/command-buffer.d.ts.map +1 -0
  21. package/dist/adapter/resources/command-buffer.js +15 -0
  22. package/dist/adapter/resources/command-buffer.js.map +1 -0
  23. package/dist/adapter/resources/command-encoder.d.ts +113 -0
  24. package/dist/adapter/resources/command-encoder.d.ts.map +1 -0
  25. package/dist/adapter/resources/command-encoder.js +19 -0
  26. package/dist/adapter/resources/command-encoder.js.map +1 -0
  27. package/dist/adapter/resources/compute-pass.d.ts +31 -0
  28. package/dist/adapter/resources/compute-pass.d.ts.map +1 -0
  29. package/dist/adapter/resources/compute-pass.js +15 -0
  30. package/dist/adapter/resources/compute-pass.js.map +1 -0
  31. package/dist/adapter/resources/compute-pipeline.d.ts +24 -0
  32. package/dist/adapter/resources/compute-pipeline.d.ts.map +1 -0
  33. package/dist/adapter/resources/compute-pipeline.js +20 -0
  34. package/dist/adapter/resources/compute-pipeline.js.map +1 -0
  35. package/dist/adapter/resources/external-texture.d.ts +12 -0
  36. package/dist/adapter/resources/external-texture.d.ts.map +1 -0
  37. package/dist/adapter/resources/external-texture.js +17 -0
  38. package/dist/adapter/resources/external-texture.js.map +1 -0
  39. package/dist/adapter/resources/framebuffer.d.ts +50 -0
  40. package/dist/adapter/resources/framebuffer.d.ts.map +1 -0
  41. package/dist/adapter/resources/framebuffer.js +102 -0
  42. package/dist/adapter/resources/framebuffer.js.map +1 -0
  43. package/dist/adapter/resources/render-pass.d.ts +51 -0
  44. package/dist/adapter/resources/render-pass.d.ts.map +1 -0
  45. package/dist/adapter/resources/render-pass.js +23 -0
  46. package/dist/adapter/resources/render-pass.js.map +1 -0
  47. package/dist/adapter/resources/render-pipeline.d.ts +89 -0
  48. package/dist/adapter/resources/render-pipeline.d.ts.map +1 -0
  49. package/dist/adapter/resources/render-pipeline.js +36 -0
  50. package/dist/adapter/resources/render-pipeline.js.map +1 -0
  51. package/dist/adapter/resources/resource.d.ts +73 -0
  52. package/dist/adapter/resources/resource.d.ts.map +1 -0
  53. package/dist/adapter/resources/resource.js +101 -0
  54. package/dist/adapter/resources/resource.js.map +1 -0
  55. package/dist/adapter/resources/sampler.d.ts +42 -0
  56. package/dist/adapter/resources/sampler.d.ts.map +1 -0
  57. package/dist/adapter/resources/sampler.js +26 -0
  58. package/dist/adapter/resources/sampler.js.map +1 -0
  59. package/dist/adapter/resources/shader.d.ts +45 -0
  60. package/dist/adapter/resources/shader.d.ts.map +1 -0
  61. package/dist/adapter/resources/shader.js +90 -0
  62. package/dist/adapter/resources/shader.js.map +1 -0
  63. package/dist/adapter/resources/texture.d.ts +90 -0
  64. package/dist/adapter/resources/texture.d.ts.map +1 -0
  65. package/dist/adapter/resources/texture.js +45 -0
  66. package/dist/adapter/resources/texture.js.map +1 -0
  67. package/dist/adapter/resources/transform-feedback.d.ts +30 -0
  68. package/dist/adapter/resources/transform-feedback.d.ts.map +1 -0
  69. package/dist/adapter/resources/transform-feedback.js +17 -0
  70. package/dist/adapter/resources/transform-feedback.js.map +1 -0
  71. package/dist/adapter/resources/vertex-array.d.ts +40 -0
  72. package/dist/adapter/resources/vertex-array.d.ts.map +1 -0
  73. package/dist/adapter/resources/vertex-array.js +24 -0
  74. package/dist/adapter/resources/vertex-array.js.map +1 -0
  75. package/dist/adapter/type-utils/decode-attribute-type.d.ts +20 -0
  76. package/dist/adapter/type-utils/decode-attribute-type.d.ts.map +1 -0
  77. package/dist/adapter/type-utils/decode-attribute-type.js +60 -0
  78. package/dist/adapter/type-utils/decode-attribute-type.js.map +1 -0
  79. package/dist/adapter/type-utils/decode-data-type.d.ts +16 -0
  80. package/dist/adapter/type-utils/decode-data-type.d.ts.map +1 -0
  81. package/dist/adapter/type-utils/decode-data-type.js +43 -0
  82. package/dist/adapter/type-utils/decode-data-type.js.map +1 -0
  83. package/dist/adapter/type-utils/decode-shader-types.d.ts +9 -0
  84. package/dist/adapter/type-utils/decode-shader-types.d.ts.map +1 -0
  85. package/dist/adapter/type-utils/decode-shader-types.js +103 -0
  86. package/dist/adapter/type-utils/decode-shader-types.js.map +1 -0
  87. package/dist/adapter/type-utils/decode-texture-format.d.ts +19 -0
  88. package/dist/adapter/type-utils/decode-texture-format.d.ts.map +1 -0
  89. package/dist/adapter/type-utils/decode-texture-format.js +101 -0
  90. package/dist/adapter/type-utils/decode-texture-format.js.map +1 -0
  91. package/dist/adapter/type-utils/decode-vertex-format.d.ts +22 -0
  92. package/dist/adapter/type-utils/decode-vertex-format.d.ts.map +1 -0
  93. package/dist/adapter/type-utils/decode-vertex-format.js +25 -0
  94. package/dist/adapter/type-utils/decode-vertex-format.js.map +1 -0
  95. package/dist/adapter/type-utils/vertex-format-from-attribute.d.ts +10 -0
  96. package/dist/adapter/type-utils/vertex-format-from-attribute.d.ts.map +1 -0
  97. package/dist/adapter/type-utils/vertex-format-from-attribute.js +76 -0
  98. package/dist/adapter/type-utils/vertex-format-from-attribute.js.map +1 -0
  99. package/dist/adapter/type-utils/wgsl-utils.d.ts +4 -0
  100. package/dist/adapter/type-utils/wgsl-utils.d.ts.map +1 -0
  101. package/dist/adapter/type-utils/wgsl-utils.js +15 -0
  102. package/dist/adapter/type-utils/wgsl-utils.js.map +1 -0
  103. package/dist/adapter/types/accessor.d.ts +23 -0
  104. package/dist/adapter/types/accessor.d.ts.map +1 -0
  105. package/dist/adapter/types/accessor.js +2 -0
  106. package/dist/adapter/types/accessor.js.map +1 -0
  107. package/dist/adapter/types/buffer-layout.d.ts +59 -0
  108. package/dist/adapter/types/buffer-layout.d.ts.map +1 -0
  109. package/dist/adapter/types/buffer-layout.js +2 -0
  110. package/dist/adapter/types/buffer-layout.js.map +1 -0
  111. package/dist/adapter/types/parameters.d.ts +97 -0
  112. package/dist/adapter/types/parameters.d.ts.map +1 -0
  113. package/dist/adapter/types/parameters.js +28 -0
  114. package/dist/adapter/types/parameters.js.map +1 -0
  115. package/dist/adapter/types/shader-layout.d.ts +145 -0
  116. package/dist/adapter/types/shader-layout.d.ts.map +1 -0
  117. package/dist/adapter/types/shader-layout.js +2 -0
  118. package/dist/adapter/types/shader-layout.js.map +1 -0
  119. package/dist/adapter/types/shader-types.d.ts +21 -0
  120. package/dist/adapter/types/shader-types.d.ts.map +1 -0
  121. package/dist/adapter/types/shader-types.js +2 -0
  122. package/dist/adapter/types/shader-types.js.map +1 -0
  123. package/dist/adapter/types/texture-formats.d.ts +12 -0
  124. package/dist/adapter/types/texture-formats.d.ts.map +1 -0
  125. package/dist/adapter/types/texture-formats.js +2 -0
  126. package/dist/adapter/types/texture-formats.js.map +1 -0
  127. package/dist/adapter/types/types.d.ts +90 -0
  128. package/dist/adapter/types/types.d.ts.map +1 -0
  129. package/dist/adapter/types/types.js +2 -0
  130. package/dist/adapter/types/types.js.map +1 -0
  131. package/dist/adapter/types/vertex-formats.d.ts +14 -0
  132. package/dist/adapter/types/vertex-formats.d.ts.map +1 -0
  133. package/dist/adapter/types/vertex-formats.js +2 -0
  134. package/dist/adapter/types/vertex-formats.js.map +1 -0
  135. package/dist/dist.dev.js +2976 -0
  136. package/dist/index.cjs +2445 -0
  137. package/dist/index.d.ts +81 -128
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +45 -18
  140. package/dist/index.js.map +1 -1
  141. package/dist/init.d.ts +5 -0
  142. package/dist/init.d.ts.map +1 -0
  143. package/dist/init.js +24 -0
  144. package/dist/init.js.map +1 -0
  145. package/dist/lib/compiler-log/compiler-message.d.ts +8 -0
  146. package/dist/lib/compiler-log/compiler-message.d.ts.map +1 -0
  147. package/dist/lib/compiler-log/compiler-message.js +2 -0
  148. package/dist/lib/compiler-log/compiler-message.js.map +1 -0
  149. package/dist/lib/compiler-log/format-compiler-log.d.ts +8 -0
  150. package/dist/lib/compiler-log/format-compiler-log.d.ts.map +1 -0
  151. package/dist/lib/compiler-log/format-compiler-log.js +64 -0
  152. package/dist/lib/compiler-log/format-compiler-log.js.map +1 -0
  153. package/dist/lib/compiler-log/get-shader-info.d.ts +9 -0
  154. package/dist/lib/compiler-log/get-shader-info.d.ts.map +1 -0
  155. package/dist/lib/compiler-log/get-shader-info.js +25 -0
  156. package/dist/lib/compiler-log/get-shader-info.js.map +1 -0
  157. package/dist/lib/luma.d.ts +22 -0
  158. package/dist/lib/luma.d.ts.map +1 -0
  159. package/dist/lib/luma.js +63 -0
  160. package/dist/lib/luma.js.map +1 -0
  161. package/dist/lib/uniforms/uniform-block.d.ts +29 -0
  162. package/dist/lib/uniforms/uniform-block.d.ts.map +1 -0
  163. package/dist/lib/uniforms/uniform-block.js +48 -0
  164. package/dist/lib/uniforms/uniform-block.js.map +1 -0
  165. package/dist/lib/uniforms/uniform-buffer-layout.d.ts +27 -0
  166. package/dist/lib/uniforms/uniform-buffer-layout.d.ts.map +1 -0
  167. package/dist/lib/uniforms/uniform-buffer-layout.js +76 -0
  168. package/dist/lib/uniforms/uniform-buffer-layout.js.map +1 -0
  169. package/dist/lib/uniforms/uniform-store.d.ts +62 -0
  170. package/dist/lib/uniforms/uniform-store.d.ts.map +1 -0
  171. package/dist/lib/uniforms/uniform-store.js +89 -0
  172. package/dist/lib/uniforms/uniform-store.js.map +1 -0
  173. package/dist/lib/uniforms/uniform.d.ts +10 -0
  174. package/dist/lib/uniforms/uniform.d.ts.map +1 -0
  175. package/dist/lib/uniforms/uniform.js +20 -0
  176. package/dist/lib/uniforms/uniform.js.map +1 -0
  177. package/dist/types.d.ts +19 -0
  178. package/dist/types.d.ts.map +1 -0
  179. package/dist/types.js +3 -0
  180. package/dist/types.js.map +1 -0
  181. package/dist/utils/array-equal.d.ts +5 -0
  182. package/dist/utils/array-equal.d.ts.map +1 -0
  183. package/dist/utils/array-equal.js +28 -0
  184. package/dist/utils/array-equal.js.map +1 -0
  185. package/dist/utils/array-utils-flat.d.ts +10 -0
  186. package/dist/utils/array-utils-flat.d.ts.map +1 -0
  187. package/dist/utils/array-utils-flat.js +36 -0
  188. package/dist/utils/array-utils-flat.js.map +1 -0
  189. package/dist/utils/assert.d.ts +2 -0
  190. package/dist/utils/assert.d.ts.map +1 -0
  191. package/dist/utils/assert.js +6 -0
  192. package/dist/utils/assert.js.map +1 -0
  193. package/dist/utils/cast.d.ts +3 -0
  194. package/dist/utils/cast.d.ts.map +1 -0
  195. package/dist/utils/cast.js +4 -0
  196. package/dist/utils/cast.js.map +1 -0
  197. package/dist/utils/check-props.d.ts +7 -0
  198. package/dist/utils/check-props.d.ts.map +1 -0
  199. package/dist/utils/check-props.js +32 -0
  200. package/dist/utils/check-props.js.map +1 -0
  201. package/dist/utils/deep-equal.d.ts +9 -0
  202. package/dist/utils/deep-equal.d.ts.map +1 -0
  203. package/dist/utils/deep-equal.js +40 -0
  204. package/dist/utils/deep-equal.js.map +1 -0
  205. package/dist/utils/format-value.d.ts +7 -0
  206. package/dist/utils/format-value.d.ts.map +1 -0
  207. package/dist/utils/format-value.js +42 -0
  208. package/dist/utils/format-value.js.map +1 -0
  209. package/dist/utils/is-array.d.ts +16 -0
  210. package/dist/utils/is-array.d.ts.map +1 -0
  211. package/dist/utils/is-array.js +10 -0
  212. package/dist/utils/is-array.js.map +1 -0
  213. package/dist/utils/load-file.d.ts +35 -0
  214. package/dist/utils/load-file.d.ts.map +1 -0
  215. package/dist/utils/load-file.js +48 -0
  216. package/dist/utils/load-file.js.map +1 -0
  217. package/dist/utils/log.d.ts +4 -0
  218. package/dist/utils/log.d.ts.map +1 -0
  219. package/dist/utils/log.js +5 -0
  220. package/dist/utils/log.js.map +1 -0
  221. package/dist/utils/random.d.ts +5 -0
  222. package/dist/utils/random.d.ts.map +1 -0
  223. package/dist/utils/random.js +14 -0
  224. package/dist/utils/random.js.map +1 -0
  225. package/dist/utils/request-animation-frame.d.ts +3 -0
  226. package/dist/utils/request-animation-frame.d.ts.map +1 -0
  227. package/dist/utils/request-animation-frame.js +7 -0
  228. package/dist/utils/request-animation-frame.js.map +1 -0
  229. package/dist/utils/stats-manager.d.ts +12 -0
  230. package/dist/utils/stats-manager.d.ts.map +1 -0
  231. package/dist/utils/stats-manager.js +19 -0
  232. package/dist/utils/stats-manager.js.map +1 -0
  233. package/dist/utils/stub-methods.d.ts +2 -0
  234. package/dist/utils/stub-methods.d.ts.map +1 -0
  235. package/dist/utils/stub-methods.js +16 -0
  236. package/dist/utils/stub-methods.js.map +1 -0
  237. package/dist/utils/utils.d.ts +15 -0
  238. package/dist/utils/utils.d.ts.map +1 -0
  239. package/dist/utils/utils.js +19 -0
  240. package/dist/utils/utils.js.map +1 -0
  241. package/dist.min.js +33 -0
  242. package/package.json +17 -12
  243. package/src/adapter/attribute-utils/get-attribute-from-layouts.ts +259 -0
  244. package/src/adapter/canvas-context.ts +433 -0
  245. package/src/adapter/device.ts +435 -0
  246. package/src/adapter/resources/buffer.ts +106 -0
  247. package/src/adapter/resources/command-buffer.ts +38 -0
  248. package/src/adapter/resources/command-encoder.ts +172 -0
  249. package/src/adapter/resources/compute-pass.ts +52 -0
  250. package/src/adapter/resources/compute-pipeline.ts +39 -0
  251. package/src/adapter/resources/external-texture.ts +20 -0
  252. package/src/adapter/resources/framebuffer.ts +230 -0
  253. package/src/adapter/resources/render-pass.ts +117 -0
  254. package/src/adapter/resources/render-pipeline.ts +133 -0
  255. package/src/adapter/resources/resource.ts +176 -0
  256. package/src/adapter/resources/sampler.ts +69 -0
  257. package/src/adapter/resources/shader.ts +143 -0
  258. package/src/adapter/resources/texture.ts +140 -0
  259. package/src/adapter/resources/transform-feedback.ts +45 -0
  260. package/src/adapter/resources/vertex-array.ts +65 -0
  261. package/src/adapter/type-utils/decode-attribute-type.ts +82 -0
  262. package/src/adapter/type-utils/decode-data-type.ts +62 -0
  263. package/src/adapter/type-utils/decode-shader-types.ts +48 -0
  264. package/src/adapter/type-utils/decode-texture-format.ts +190 -0
  265. package/src/adapter/type-utils/decode-vertex-format.ts +49 -0
  266. package/src/adapter/type-utils/vertex-format-from-attribute.ts +103 -0
  267. package/src/adapter/type-utils/wgsl-utils.ts +18 -0
  268. package/src/adapter/types/accessor.ts +34 -0
  269. package/src/adapter/types/buffer-layout.ts +62 -0
  270. package/src/adapter/types/parameters.ts +250 -0
  271. package/src/adapter/types/shader-layout.ts +193 -0
  272. package/src/adapter/types/shader-types.ts +77 -0
  273. package/src/adapter/types/texture-formats.ts +168 -0
  274. package/src/adapter/types/types.ts +109 -0
  275. package/src/adapter/types/vertex-formats.ts +91 -0
  276. package/src/index.ts +160 -92
  277. package/src/init.ts +47 -0
  278. package/src/lib/compiler-log/compiler-message.ts +10 -0
  279. package/src/lib/compiler-log/format-compiler-log.ts +113 -0
  280. package/src/lib/compiler-log/get-shader-info.ts +41 -0
  281. package/src/lib/luma.ts +84 -0
  282. package/src/lib/uniforms/uniform-block.ts +80 -0
  283. package/src/lib/uniforms/uniform-buffer-layout.ts +109 -0
  284. package/src/lib/uniforms/uniform-store.ts +173 -0
  285. package/src/lib/uniforms/uniform.ts +25 -0
  286. package/src/types.ts +33 -0
  287. package/src/utils/array-equal.ts +33 -0
  288. package/src/utils/array-utils-flat.ts +43 -0
  289. package/src/utils/assert.ts +7 -0
  290. package/src/utils/cast.ts +4 -0
  291. package/src/utils/check-props.ts +74 -0
  292. package/src/utils/deep-equal.ts +47 -0
  293. package/src/utils/format-value.ts +40 -0
  294. package/src/utils/is-array.ts +24 -0
  295. package/src/utils/load-file.ts +89 -0
  296. package/src/utils/log.ts +4 -0
  297. package/src/utils/random.ts +17 -0
  298. package/src/utils/request-animation-frame.ts +15 -0
  299. package/src/utils/stats-manager.ts +23 -0
  300. package/src/utils/stub-methods.ts +20 -0
  301. package/src/utils/utils.ts +36 -0
  302. package/dist/bundle.d.ts +0 -2
  303. package/dist/bundle.d.ts.map +0 -1
  304. package/dist/bundle.js +0 -5
  305. package/dist/bundle.js.map +0 -1
  306. package/src/bundle.ts +0 -4
@@ -0,0 +1,435 @@
1
+ // luma.gl, MIT license
2
+ import {VERSION} from '../init';
3
+ import {StatsManager, lumaStats} from '../utils/stats-manager';
4
+ import {log} from '../utils/log';
5
+ import {uid} from '../utils/utils';
6
+ import type {TextureFormat} from './types/texture-formats';
7
+ import type {CanvasContext, CanvasContextProps} from './canvas-context';
8
+ import type {BufferProps} from './resources/buffer';
9
+ import {Buffer} from './resources/buffer';
10
+ import type {RenderPipeline, RenderPipelineProps} from './resources/render-pipeline';
11
+ import type {ComputePipeline, ComputePipelineProps} from './resources/compute-pipeline';
12
+ import type {Sampler, SamplerProps} from './resources/sampler';
13
+ import type {Shader, ShaderProps} from './resources/shader';
14
+ import type {Texture, TextureProps, TextureData} from './resources/texture';
15
+ import type {ExternalTexture, ExternalTextureProps} from './resources/external-texture';
16
+ import type {Framebuffer, FramebufferProps} from './resources/framebuffer';
17
+ import type {RenderPass, RenderPassProps} from './resources/render-pass';
18
+ import type {ComputePass, ComputePassProps} from './resources/compute-pass';
19
+ import type {CommandEncoder, CommandEncoderProps} from './resources/command-encoder';
20
+ import type {VertexArray, VertexArrayProps} from './resources/vertex-array';
21
+ import type {TransformFeedback, TransformFeedbackProps} from './resources/transform-feedback';
22
+
23
+ /** Device properties */
24
+ export type DeviceProps = {
25
+ id?: string;
26
+
27
+ type?: 'webgl' | 'webgl1' | 'webgl2' | 'webgpu' | 'best-available';
28
+
29
+ // Common parameters
30
+ canvas?: HTMLCanvasElement | OffscreenCanvas | string | null; // A canvas element or a canvas string id
31
+ container?: HTMLElement | string | null;
32
+ width?: number /** width is only used when creating a new canvas */;
33
+ height?: number /** height is only used when creating a new canvas */;
34
+
35
+ // WebGLDevice parameters
36
+ webgl2?: boolean; // Set to false to not create a WebGL2 context (force webgl1)
37
+ webgl1?: boolean; // set to false to not create a WebGL1 context (fails if webgl2 not available)
38
+
39
+ // WebGLContext PARAMETERS - Can only be set on context creation...
40
+ // alpha?: boolean; // Default render target has an alpha buffer.
41
+ // depth?: boolean; // Default render target has a depth buffer of at least 16 bits.
42
+ // stencil?: boolean; // Default render target has a stencil buffer of at least 8 bits.
43
+ // antialias?: boolean; // Boolean that indicates whether or not to perform anti-aliasing.
44
+ // premultipliedAlpha?: boolean; // Boolean that indicates that the page compositor will assume the drawing buffer contains colors with pre-multiplied alpha.
45
+ // preserveDrawingBuffer?: boolean; // Default render target buffers will not be automatically cleared and will preserve their values until cleared or overwritten
46
+ // failIfMajorPerformanceCaveat?: boolean; // Do not create if the system performance is low.
47
+
48
+ // Unclear if these are still supported
49
+ debug?: boolean; // Instrument context (at the expense of performance)
50
+ manageState?: boolean; // Set to false to disable WebGL state management instrumentation
51
+ break?: string[]; // TODO: types
52
+
53
+ // @deprecated Attach to existing context
54
+ gl?: WebGLRenderingContext | WebGL2RenderingContext | null;
55
+ };
56
+
57
+ /**
58
+ * Identifies the GPU vendor and driver.
59
+ * @note Chrome WebGPU does not provide much information, though more can be enabled with
60
+ * @see https://developer.chrome.com/blog/new-in-webgpu-120#adapter_information_updates
61
+ * chrome://flags/#enable-webgpu-developer-features
62
+ */
63
+ export type DeviceInfo = {
64
+ /** Type of device */
65
+ type: 'webgl' | 'webgl2' | 'webgpu';
66
+ /** Vendor (name of GPU vendor, Apple, nVidia etc */
67
+ vendor: string;
68
+ /** Renderer (usually driver name) */
69
+ renderer: string;
70
+ /** version of driver */
71
+ version: string;
72
+ /** family of GPU */
73
+ gpu: 'nvidia' | 'amd' | 'intel' | 'apple' | 'software' | 'unknown';
74
+ /** Type of GPU () */
75
+ gpuType: 'discrete' | 'integrated' | 'cpu' | 'unknown';
76
+ /** GPU architecture */
77
+ gpuArchitecture?: string; // 'common-3' on Apple
78
+ /** GPU driver backend. Can sometimes be sniffed */
79
+ gpuBackend?: 'opengl' | 'opengles' | 'metal' | 'd3d11' | 'd3d12' | 'vulkan' | 'unknown';
80
+ /** If this is a fallback adapter */
81
+ fallback?: boolean;
82
+ /** Shader language supported by device.createShader() */
83
+ shadingLanguage: 'wgsl' | 'glsl';
84
+ /** Highest supported shader language version (GLSL 3.00 = 300, GLSL 1.00 = 100) */
85
+ shadingLanguageVersion: number;
86
+ };
87
+
88
+ /** Limits for a device */
89
+ export type DeviceLimits = {
90
+ readonly maxTextureDimension1D?: number;
91
+ readonly maxTextureDimension2D?: number;
92
+ readonly maxTextureDimension3D?: number;
93
+ readonly maxTextureArrayLayers?: number;
94
+ readonly maxBindGroups: number;
95
+ readonly maxDynamicUniformBuffersPerPipelineLayout: number;
96
+ readonly maxDynamicStorageBuffersPerPipelineLayout: number;
97
+ readonly maxSampledTexturesPerShaderStage: number;
98
+ readonly maxSamplersPerShaderStage: number;
99
+ readonly maxStorageBuffersPerShaderStage: number;
100
+ readonly maxStorageTexturesPerShaderStage: number;
101
+ readonly maxUniformBuffersPerShaderStage: number;
102
+ readonly maxUniformBufferBindingSize: number;
103
+ readonly maxStorageBufferBindingSize?: number;
104
+ readonly minUniformBufferOffsetAlignment?: number;
105
+ readonly minStorageBufferOffsetAlignment?: number;
106
+ readonly maxVertexBuffers?: number;
107
+ readonly maxVertexAttributes: number;
108
+ readonly maxVertexBufferArrayStride?: number;
109
+ readonly maxInterStageShaderComponents?: number;
110
+ readonly maxComputeWorkgroupStorageSize?: number;
111
+ readonly maxComputeInvocationsPerWorkgroup?: number;
112
+ readonly maxComputeWorkgroupSizeX?: number;
113
+ readonly maxComputeWorkgroupSizeY?: number;
114
+ readonly maxComputeWorkgroupSizeZ?: number;
115
+ readonly maxComputeWorkgroupsPerDimension?: number;
116
+ };
117
+
118
+ export type WebGPUDeviceFeature =
119
+ | 'depth-clip-control'
120
+ | 'depth24unorm-stencil8'
121
+ | 'depth32float-stencil8'
122
+ | 'timestamp-query'
123
+ | 'indirect-first-instance'
124
+ | 'texture-compression-bc'
125
+ | 'texture-compression-etc2'
126
+ | 'texture-compression-astc';
127
+
128
+ // obsolete...
129
+ // 'depth-clamping' |
130
+ // 'depth24unorm-stencil8' |
131
+ // 'depth32float-stencil8' |
132
+ // 'pipeline-statistics-query' |
133
+ // 'timestamp-query' |
134
+ // 'texture-compression-bc'
135
+
136
+ export type WebGLDeviceFeature =
137
+ | 'webgpu'
138
+ | 'webgl2'
139
+ | 'webgl'
140
+
141
+ // api support (unify with WebGPU timestamp-query?)
142
+ | 'timer-query-webgl'
143
+ | 'uniform-buffers-webgl'
144
+ | 'uniforms-webgl'
145
+
146
+ // texture filtering
147
+ | 'texture-filter-linear-float32-webgl'
148
+ | 'texture-filter-linear-float16-webgl'
149
+ | 'texture-filter-anisotropic-webgl'
150
+
151
+ // texture rendering
152
+ | 'texture-renderable-float32-webgl'
153
+ | 'texture-renderable-float16-webgl'
154
+ | 'texture-renderable-rgba32float-webgl' // TODO - remove
155
+
156
+ // texture blending
157
+ | 'texture-blend-float-webgl1'
158
+
159
+ // texture format support
160
+ | 'texture-formats-norm16-webgl'
161
+ | 'texture-formats-srgb-webgl1'
162
+ | 'texture-formats-depth-webgl1'
163
+ | 'texture-formats-float32-webgl1'
164
+ | 'texture-formats-float16-webgl1'
165
+
166
+ // api support
167
+ | 'vertex-array-object-webgl1'
168
+ | 'instanced-rendering-webgl1'
169
+ | 'multiple-render-targets-webgl1'
170
+ | 'index-uint32-webgl1'
171
+ | 'blend-minmax-webgl1'
172
+ | 'transform-feedback-webgl2'
173
+
174
+ // glsl extensions
175
+ | 'glsl-frag-data'
176
+ | 'glsl-frag-depth'
177
+ | 'glsl-derivatives'
178
+ | 'glsl-texture-lod';
179
+
180
+ type WebGLCompressedTextureFeatures =
181
+ | 'texture-compression-bc5-webgl'
182
+ | 'texture-compression-etc1-webgl'
183
+ | 'texture-compression-pvrtc-webgl'
184
+ | 'texture-compression-atc-webgl';
185
+
186
+ /** Valid feature strings */
187
+ export type DeviceFeature =
188
+ | WebGPUDeviceFeature
189
+ | WebGLDeviceFeature
190
+ | WebGLCompressedTextureFeatures;
191
+
192
+ /**
193
+ * WebGPU Device/WebGL context abstraction
194
+ */
195
+ export abstract class Device {
196
+
197
+ static defaultProps: Required<DeviceProps> = {
198
+ id: null!,
199
+ type: 'best-available',
200
+ canvas: null,
201
+ container: null,
202
+ webgl2: true, // Attempt to create a WebGL2 context
203
+ webgl1: true, // Attempt to create a WebGL1 context (false to fail if webgl2 not available)
204
+ manageState: true,
205
+ width: 800, // width are height are only used by headless gl
206
+ height: 600,
207
+ debug: Boolean(log.get('debug')), // Instrument context (at the expense of performance)
208
+ break: [],
209
+
210
+ // alpha: undefined,
211
+ // depth: undefined,
212
+ // stencil: undefined,
213
+ // antialias: undefined,
214
+ // premultipliedAlpha: undefined,
215
+ // preserveDrawingBuffer: undefined,
216
+ // failIfMajorPerformanceCaveat: undefined
217
+
218
+ gl: null
219
+ };
220
+
221
+
222
+ get [Symbol.toStringTag](): string {
223
+ return 'Device';
224
+ }
225
+
226
+ static VERSION = VERSION;
227
+
228
+ constructor(props: DeviceProps) {
229
+ this.props = {...Device.defaultProps, ...props};
230
+ this.id = this.props.id || uid(this[Symbol.toStringTag].toLowerCase());
231
+ }
232
+
233
+ /** id of this device, primarily for debugging */
234
+ readonly id: string;
235
+ /** stats */
236
+ readonly statsManager: StatsManager = lumaStats;
237
+ /** A copy of the device props */
238
+ readonly props: Required<DeviceProps>;
239
+ /** Available for the application to store data on the device */
240
+ userData: {[key: string]: unknown} = {};
241
+ /** Used by other luma.gl modules to store data on the device */
242
+ _lumaData: {[key: string]: unknown} = {};
243
+
244
+ abstract destroy(): void;
245
+
246
+ // Capabilities
247
+
248
+ /** Information about the device (vendor, versions etc) */
249
+ abstract info: DeviceInfo;
250
+
251
+ /** Optional capability discovery */
252
+ abstract get features(): Set<DeviceFeature>;
253
+
254
+ /** WebGPU style device limits */
255
+ abstract get limits(): DeviceLimits;
256
+
257
+ /** Check if device supports a specific texture format (creation and `nearest` sampling) */
258
+ abstract isTextureFormatSupported(format: TextureFormat): boolean;
259
+
260
+ /** Check if linear filtering (sampler interpolation) is supported for a specific texture format */
261
+ abstract isTextureFormatFilterable(format: TextureFormat): boolean;
262
+
263
+ /** Check if device supports rendering to a specific texture format */
264
+ abstract isTextureFormatRenderable(format: TextureFormat): boolean;
265
+
266
+ // Device loss
267
+
268
+ /** `true` if device is already lost */
269
+ abstract get isLost(): boolean;
270
+
271
+ /** Promise that resolves when device is lost */
272
+ abstract readonly lost: Promise<{reason: 'destroyed'; message: string}>;
273
+
274
+ /**
275
+ * Trigger device loss.
276
+ * @returns `true` if context loss could actually be triggered.
277
+ * @note primarily intended for testing how application reacts to device loss
278
+ */
279
+ loseDevice(): boolean {
280
+ return false;
281
+ }
282
+
283
+ // Canvas context
284
+
285
+ /** Default / primary canvas context. Can be null as WebGPU devices can be created without a CanvasContext */
286
+ abstract canvasContext: CanvasContext | null;
287
+
288
+ /** Returns the default / primary canvas context. Throws an error if no canvas context is available (a WebGPU compute device) */
289
+ getCanvasContext(): CanvasContext {
290
+ if (!this.canvasContext) {
291
+ throw new Error('Device has no CanvasContext');
292
+ }
293
+ return this.canvasContext;
294
+ }
295
+
296
+ /** Creates a new CanvasContext (WebGPU only) */
297
+ abstract createCanvasContext(props?: CanvasContextProps): CanvasContext;
298
+
299
+ /** Call after rendering a frame (necessary e.g. on WebGL OffscreenCanvas) */
300
+ abstract submit(): void;
301
+
302
+ // Resource creation
303
+
304
+ /** Create a buffer */
305
+ abstract createBuffer(props: BufferProps | ArrayBuffer | ArrayBufferView): Buffer;
306
+
307
+ /** Create a texture */
308
+ abstract _createTexture(props: TextureProps): Texture;
309
+ createTexture(props: TextureProps): Texture;
310
+ createTexture(data: Promise<TextureData>): Texture;
311
+ createTexture(url: string): Texture;
312
+
313
+ createTexture(props: TextureProps | Promise<TextureData> | string): Texture {
314
+ // Signature: new Texture2D(gl, url | Promise)
315
+ if (props instanceof Promise || typeof props === 'string') {
316
+ props = {data: props};
317
+ }
318
+ return this._createTexture(props);
319
+ }
320
+
321
+ /** Create a temporary texture view of a video source */
322
+ abstract createExternalTexture(props: ExternalTextureProps): ExternalTexture;
323
+
324
+ /** Create a sampler */
325
+ abstract createSampler(props: SamplerProps): Sampler;
326
+
327
+ /** Create a Framebuffer. Must have at least one attachment. */
328
+ abstract createFramebuffer(props: FramebufferProps): Framebuffer;
329
+
330
+ /** Create a shader */
331
+ abstract createShader(props: ShaderProps): Shader;
332
+
333
+ /** Create a render pipeline (aka program) */
334
+ abstract createRenderPipeline(props: RenderPipelineProps): RenderPipeline;
335
+
336
+ /** Create a compute pipeline (aka program). WebGPU only. */
337
+ abstract createComputePipeline(props: ComputePipelineProps): ComputePipeline;
338
+
339
+ /** Create a vertex array */
340
+ abstract createVertexArray(props: VertexArrayProps): VertexArray;
341
+
342
+ /** Create a RenderPass */
343
+ abstract beginRenderPass(props?: RenderPassProps): RenderPass;
344
+
345
+ /** Create a ComputePass */
346
+ abstract beginComputePass(props?: ComputePassProps): ComputePass;
347
+
348
+ /** Get a renderpass that is set up to render to the primary CanvasContext */
349
+ abstract getDefaultRenderPass(): RenderPass;
350
+
351
+ /** Create a transform feedback (immutable set of output buffer bindings). WebGL 2 only. */
352
+ abstract createTransformFeedback(props: TransformFeedbackProps): TransformFeedback;
353
+
354
+ createCommandEncoder(props: CommandEncoderProps = {}): CommandEncoder {
355
+ throw new Error('not implemented');
356
+ }
357
+
358
+ // WebGL specific HACKS - enables app to remove webgl import
359
+ // Use until we have a better way to handle these
360
+
361
+ /** @deprecated - will be removed - should use command encoder */
362
+ readPixelsToArrayWebGL(
363
+ source: Framebuffer | Texture,
364
+ options?: {
365
+ sourceX?: number;
366
+ sourceY?: number;
367
+ sourceFormat?: number;
368
+ sourceAttachment?: number;
369
+ target?: Uint8Array | Uint16Array | Float32Array;
370
+ // following parameters are auto deduced if not provided
371
+ sourceWidth?: number;
372
+ sourceHeight?: number;
373
+ sourceType?: number;
374
+ }
375
+ ): Uint8Array | Uint16Array | Float32Array {
376
+ throw new Error('not implemented');
377
+ }
378
+
379
+ /** @deprecated - will be removed - should use command encoder */
380
+ readPixelsToBufferWebGL2(
381
+ source: Framebuffer | Texture,
382
+ options?: {
383
+ sourceX?: number;
384
+ sourceY?: number;
385
+ sourceFormat?: number;
386
+ target?: Buffer; // A new Buffer object is created when not provided.
387
+ targetByteOffset?: number; // byte offset in buffer object
388
+ // following parameters are auto deduced if not provided
389
+ sourceWidth?: number;
390
+ sourceHeight?: number;
391
+ sourceType?: number;
392
+ }
393
+ ): Buffer {
394
+ throw new Error('not implemented');
395
+ }
396
+
397
+ /** @deprecated - will be removed - should use WebGPU parameters (pipeline) */
398
+ setParametersWebGL(parameters: any): void {
399
+ throw new Error('not implemented');
400
+ }
401
+
402
+ /** @deprecated - will be removed - should use WebGPU parameters (pipeline) */
403
+ withParametersWebGL(parameters: any, func: any): any {
404
+ throw new Error('not implemented');
405
+ }
406
+
407
+ /** @deprecated - will be removed - should use clear arguments in RenderPass */
408
+ clearWebGL(options?: {framebuffer?: Framebuffer; color?: any; depth?: any; stencil?: any}): void {
409
+ throw new Error('not implemented');
410
+ }
411
+
412
+ // Implementation
413
+
414
+ protected _getBufferProps(props: BufferProps | ArrayBuffer | ArrayBufferView): BufferProps {
415
+ if (props instanceof ArrayBuffer || ArrayBuffer.isView(props)) {
416
+ props = {data: props};
417
+ }
418
+
419
+ // TODO - fragile, as this is done before we merge with default options
420
+ // inside the Buffer constructor
421
+
422
+ const newProps = {...props};
423
+ // Deduce indexType
424
+ if ((props.usage || 0) & Buffer.INDEX && !props.indexType) {
425
+ if (props.data instanceof Uint32Array) {
426
+ newProps.indexType = 'uint32';
427
+ } else if (props.data instanceof Uint16Array) {
428
+ newProps.indexType = 'uint16';
429
+ } else {
430
+ log.warn('indices buffer content must be of integer type')();
431
+ }
432
+ }
433
+ return newProps;
434
+ }
435
+ }
@@ -0,0 +1,106 @@
1
+ // luma.gl, MIT license
2
+
3
+ import type {Device} from '../device';
4
+ import {Resource, ResourceProps} from './resource';
5
+
6
+ export type BufferProps = ResourceProps & {
7
+ /** Supply a handle to connect to an existing device-specific buffer */
8
+ handle?: WebGLBuffer;
9
+ /** Specifies how this buffer can be used */
10
+ usage?: number;
11
+ /** Length in bytes of memory to be allocated. If not specified, `byteLength` of `props.data` will be used. */
12
+ byteLength?: number;
13
+ /** Data to initialize the buffer with. */
14
+ data?: ArrayBuffer | ArrayBufferView | null;
15
+ /** Byte offset into the newly created Buffer to store data at */
16
+ byteOffset?: number;
17
+ /** If props.usage includes Buffer.INDEX */
18
+ indexType?: 'uint16' | 'uint32';
19
+
20
+ // TBD
21
+ mappedAtCreation?: boolean;
22
+ }
23
+
24
+ /** Abstract GPU buffer */
25
+ export abstract class Buffer extends Resource<BufferProps> {
26
+ static override defaultProps: Required<BufferProps> = {
27
+ ...Resource.defaultProps,
28
+ usage: 0, // Buffer.COPY_DST | Buffer.COPY_SRC
29
+ byteLength: 0,
30
+ byteOffset: 0,
31
+ data: null,
32
+ indexType: 'uint16',
33
+ mappedAtCreation: false
34
+ };
35
+
36
+ // Usage Flags
37
+ static MAP_READ = 0x01;
38
+ static MAP_WRITE = 0x02;
39
+ static COPY_SRC = 0x0004;
40
+ static COPY_DST = 0x0008;
41
+ /** Index buffer */
42
+ static INDEX = 0x0010;
43
+ /** Vertex buffer */
44
+ static VERTEX = 0x0020;
45
+ /** Uniform buffer */
46
+ static UNIFORM = 0x0040;
47
+ /** Storage buffer */
48
+ static STORAGE = 0x0080;
49
+ static INDIRECT = 0x0100;
50
+ static QUERY_RESOLVE = 0x0200;
51
+
52
+ override get [Symbol.toStringTag](): string { return 'Buffer'; }
53
+
54
+ /** The usage with which this buffer was created */
55
+ readonly usage: number;
56
+ /** For index buffers, whether indices are 16 or 32 bit */
57
+ readonly indexType?: 'uint16' | 'uint32';
58
+ /** Length of buffer in bytes */
59
+ abstract byteLength: number;
60
+
61
+ constructor(device: Device, props: BufferProps) {
62
+ const deducedProps = {...props};
63
+
64
+ // Deduce indexType
65
+ if ((props.usage || 0) & Buffer.INDEX && !props.indexType) {
66
+ if (props.data instanceof Uint32Array) {
67
+ deducedProps.indexType = 'uint32';
68
+ } else if (props.data instanceof Uint16Array) {
69
+ deducedProps.indexType = 'uint16';
70
+ }
71
+ }
72
+
73
+ super(device, deducedProps, Buffer.defaultProps);
74
+
75
+ this.usage = props.usage || 0;
76
+ this.indexType = deducedProps.indexType;
77
+ }
78
+
79
+ /** Write data to buffer */
80
+ abstract write(data: ArrayBufferView, byteOffset?: number): void;
81
+ /** Read data asynchronoursly */
82
+ abstract readAsync(byteOffset?: number, byteLength?: number): Promise<Uint8Array>;
83
+
84
+ /** Read data synchronously. @note WebGL2 only */
85
+ readSyncWebGL2(byteOffset?: number, byteLength?: number): Uint8Array { throw new Error('not implemented'); }
86
+
87
+ // PROTECTED METHODS (INTENDED FOR USE BY OTHER FRAMEWORK CODE ONLY)
88
+
89
+ /** Max amount of debug data saved. Two vec4's */
90
+ static DEBUG_DATA_MAX_LENGTH = 32;
91
+ /** A partial CPU-side copy of the data in this buffer, for debugging purposes */
92
+ debugData: ArrayBuffer = new ArrayBuffer(0);
93
+
94
+ /** This doesn't handle partial non-zero offset updates correctly */
95
+ protected _setDebugData(data: ArrayBufferView | ArrayBuffer | null, byteOffset: number, byteLength: number): void {
96
+ const buffer: ArrayBuffer | null = ArrayBuffer.isView(data) ? data.buffer : data;
97
+ const debugDataLength = Math.min(data ? data.byteLength : byteLength, Buffer.DEBUG_DATA_MAX_LENGTH);
98
+ if (data === null) {
99
+ this.debugData = new ArrayBuffer(debugDataLength);
100
+ } else if (byteOffset === 0 && byteLength === data.byteLength) {
101
+ this.debugData = buffer.slice(0, debugDataLength);
102
+ } else {
103
+ this.debugData = buffer.slice(byteOffset, byteOffset + debugDataLength);
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,38 @@
1
+ // luma.gl, MIT license
2
+ import { Device } from '../device';
3
+ import {Resource, ResourceProps} from './resource';
4
+
5
+ // interface Queue {
6
+ // submit(commandBuffers);
7
+
8
+ // // onSubmittedWorkDone(): Promise<undefined>;
9
+
10
+ // writeBuffer(options: WriteBufferOptions): void;
11
+ // writeTexture(options: WriteTextureOptions): void;
12
+
13
+ // // copyExternalImageToTexture(
14
+ // // GPUImageCopyExternalImage source,
15
+ // // GPUImageCopyTextureTagged destination,
16
+ // // GPUExtent3D copySize
17
+ // // ): void;
18
+ // }
19
+
20
+ export type CommandBufferProps = ResourceProps & {
21
+ };
22
+
23
+ /**
24
+ * Encodes commands to queue that can be executed later
25
+ */
26
+ export abstract class CommandBuffer extends Resource<CommandBufferProps> {
27
+ static override defaultProps: Required<CommandBufferProps> = {
28
+ ...Resource.defaultProps
29
+ };
30
+
31
+ override get [Symbol.toStringTag](): string {
32
+ return 'CommandBuffer';
33
+ }
34
+
35
+ constructor(device: Device, props: CommandBufferProps) {
36
+ super(device, props, CommandBuffer.defaultProps);
37
+ }
38
+ }