minerva-design 1.0.2 → 1.1.0

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 (165) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +21 -19
  3. package/dist/charts/core.cjs +1 -0
  4. package/dist/charts/core.d.cts +3 -0
  5. package/dist/charts/core.d.ts +3 -0
  6. package/dist/charts/core.js +3 -0
  7. package/dist/charts/engine/axis.cjs +2 -0
  8. package/dist/charts/engine/axis.cjs.map +1 -0
  9. package/dist/charts/engine/axis.d.cts +13 -0
  10. package/dist/charts/engine/axis.d.ts +13 -0
  11. package/dist/charts/engine/axis.js +38 -0
  12. package/dist/charts/engine/axis.js.map +1 -0
  13. package/dist/charts/engine/chart.cjs +3 -0
  14. package/dist/charts/engine/chart.cjs.map +1 -0
  15. package/dist/charts/engine/chart.d.cts +6 -0
  16. package/dist/charts/engine/chart.d.ts +6 -0
  17. package/dist/charts/engine/chart.js +624 -0
  18. package/dist/charts/engine/chart.js.map +1 -0
  19. package/dist/charts/engine/color.cjs +2 -0
  20. package/dist/charts/engine/color.cjs.map +1 -0
  21. package/dist/charts/engine/color.d.cts +23 -0
  22. package/dist/charts/engine/color.d.ts +23 -0
  23. package/dist/charts/engine/color.js +95 -0
  24. package/dist/charts/engine/color.js.map +1 -0
  25. package/dist/charts/engine/data.cjs +2 -0
  26. package/dist/charts/engine/data.cjs.map +1 -0
  27. package/dist/charts/engine/data.d.cts +29 -0
  28. package/dist/charts/engine/data.d.ts +29 -0
  29. package/dist/charts/engine/data.js +104 -0
  30. package/dist/charts/engine/data.js.map +1 -0
  31. package/dist/charts/engine/decimate.cjs +2 -0
  32. package/dist/charts/engine/decimate.cjs.map +1 -0
  33. package/dist/charts/engine/decimate.d.cts +13 -0
  34. package/dist/charts/engine/decimate.d.ts +13 -0
  35. package/dist/charts/engine/decimate.js +28 -0
  36. package/dist/charts/engine/decimate.js.map +1 -0
  37. package/dist/charts/engine/dom.cjs +2 -0
  38. package/dist/charts/engine/dom.cjs.map +1 -0
  39. package/dist/charts/engine/dom.d.cts +21 -0
  40. package/dist/charts/engine/dom.d.ts +21 -0
  41. package/dist/charts/engine/dom.js +125 -0
  42. package/dist/charts/engine/dom.js.map +1 -0
  43. package/dist/charts/engine/format.cjs +2 -0
  44. package/dist/charts/engine/format.cjs.map +1 -0
  45. package/dist/charts/engine/format.d.cts +9 -0
  46. package/dist/charts/engine/format.d.ts +9 -0
  47. package/dist/charts/engine/format.js +34 -0
  48. package/dist/charts/engine/format.js.map +1 -0
  49. package/dist/charts/engine/items.cjs +2 -0
  50. package/dist/charts/engine/items.cjs.map +1 -0
  51. package/dist/charts/engine/items.d.cts +8 -0
  52. package/dist/charts/engine/items.d.ts +8 -0
  53. package/dist/charts/engine/items.js +91 -0
  54. package/dist/charts/engine/items.js.map +1 -0
  55. package/dist/charts/engine/layout.cjs +2 -0
  56. package/dist/charts/engine/layout.cjs.map +1 -0
  57. package/dist/charts/engine/layout.d.cts +37 -0
  58. package/dist/charts/engine/layout.d.ts +37 -0
  59. package/dist/charts/engine/layout.js +26 -0
  60. package/dist/charts/engine/layout.js.map +1 -0
  61. package/dist/charts/engine/model.cjs +2 -0
  62. package/dist/charts/engine/model.cjs.map +1 -0
  63. package/dist/charts/engine/model.d.cts +74 -0
  64. package/dist/charts/engine/model.d.ts +74 -0
  65. package/dist/charts/engine/model.js +175 -0
  66. package/dist/charts/engine/model.js.map +1 -0
  67. package/dist/charts/engine/overlay.cjs +2 -0
  68. package/dist/charts/engine/overlay.cjs.map +1 -0
  69. package/dist/charts/engine/overlay.d.cts +62 -0
  70. package/dist/charts/engine/overlay.d.ts +62 -0
  71. package/dist/charts/engine/overlay.js +123 -0
  72. package/dist/charts/engine/overlay.js.map +1 -0
  73. package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
  74. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
  75. package/dist/charts/engine/renderers/canvas2d.d.cts +4 -0
  76. package/dist/charts/engine/renderers/canvas2d.d.ts +4 -0
  77. package/dist/charts/engine/renderers/canvas2d.js +156 -0
  78. package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
  79. package/dist/charts/engine/renderers/detect.cjs +2 -0
  80. package/dist/charts/engine/renderers/detect.cjs.map +1 -0
  81. package/dist/charts/engine/renderers/detect.d.cts +12 -0
  82. package/dist/charts/engine/renderers/detect.d.ts +12 -0
  83. package/dist/charts/engine/renderers/detect.js +33 -0
  84. package/dist/charts/engine/renderers/detect.js.map +1 -0
  85. package/dist/charts/engine/renderers/range.cjs +2 -0
  86. package/dist/charts/engine/renderers/range.cjs.map +1 -0
  87. package/dist/charts/engine/renderers/range.d.cts +5 -0
  88. package/dist/charts/engine/renderers/range.d.ts +5 -0
  89. package/dist/charts/engine/renderers/range.js +32 -0
  90. package/dist/charts/engine/renderers/range.js.map +1 -0
  91. package/dist/charts/engine/renderers/shaders.cjs +266 -0
  92. package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
  93. package/dist/charts/engine/renderers/shaders.d.cts +20 -0
  94. package/dist/charts/engine/renderers/shaders.d.ts +20 -0
  95. package/dist/charts/engine/renderers/shaders.js +251 -0
  96. package/dist/charts/engine/renderers/shaders.js.map +1 -0
  97. package/dist/charts/engine/renderers/types.cjs +2 -0
  98. package/dist/charts/engine/renderers/types.cjs.map +1 -0
  99. package/dist/charts/engine/renderers/types.d.cts +83 -0
  100. package/dist/charts/engine/renderers/types.d.ts +83 -0
  101. package/dist/charts/engine/renderers/types.js +6 -0
  102. package/dist/charts/engine/renderers/types.js.map +1 -0
  103. package/dist/charts/engine/renderers/webgl2.cjs +2 -0
  104. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
  105. package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
  106. package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
  107. package/dist/charts/engine/renderers/webgl2.js +134 -0
  108. package/dist/charts/engine/renderers/webgl2.js.map +1 -0
  109. package/dist/charts/engine/renderers/webgpu.cjs +2 -0
  110. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
  111. package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
  112. package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
  113. package/dist/charts/engine/renderers/webgpu.js +220 -0
  114. package/dist/charts/engine/renderers/webgpu.js.map +1 -0
  115. package/dist/charts/engine/scale.cjs +2 -0
  116. package/dist/charts/engine/scale.cjs.map +1 -0
  117. package/dist/charts/engine/scale.d.cts +13 -0
  118. package/dist/charts/engine/scale.d.ts +13 -0
  119. package/dist/charts/engine/scale.js +37 -0
  120. package/dist/charts/engine/scale.js.map +1 -0
  121. package/dist/charts/engine/spatial.cjs +2 -0
  122. package/dist/charts/engine/spatial.cjs.map +1 -0
  123. package/dist/charts/engine/spatial.d.cts +18 -0
  124. package/dist/charts/engine/spatial.d.ts +18 -0
  125. package/dist/charts/engine/spatial.js +53 -0
  126. package/dist/charts/engine/spatial.js.map +1 -0
  127. package/dist/charts/engine/theme.cjs +2 -0
  128. package/dist/charts/engine/theme.cjs.map +1 -0
  129. package/dist/charts/engine/theme.d.cts +21 -0
  130. package/dist/charts/engine/theme.d.ts +21 -0
  131. package/dist/charts/engine/theme.js +70 -0
  132. package/dist/charts/engine/theme.js.map +1 -0
  133. package/dist/charts/engine/time.cjs +2 -0
  134. package/dist/charts/engine/time.cjs.map +1 -0
  135. package/dist/charts/engine/time.d.cts +10 -0
  136. package/dist/charts/engine/time.d.ts +10 -0
  137. package/dist/charts/engine/time.js +189 -0
  138. package/dist/charts/engine/time.js.map +1 -0
  139. package/dist/charts/engine/types.d.cts +289 -0
  140. package/dist/charts/engine/types.d.ts +289 -0
  141. package/dist/charts/engine/viewport.cjs +2 -0
  142. package/dist/charts/engine/viewport.cjs.map +1 -0
  143. package/dist/charts/engine/viewport.d.cts +12 -0
  144. package/dist/charts/engine/viewport.d.ts +12 -0
  145. package/dist/charts/engine/viewport.js +15 -0
  146. package/dist/charts/engine/viewport.js.map +1 -0
  147. package/dist/charts/index.cjs +1 -0
  148. package/dist/charts/index.d.cts +4 -0
  149. package/dist/charts/index.d.ts +4 -0
  150. package/dist/charts/index.js +7 -0
  151. package/dist/charts/react/Chart.cjs +2 -0
  152. package/dist/charts/react/Chart.cjs.map +1 -0
  153. package/dist/charts/react/Chart.d.cts +28 -0
  154. package/dist/charts/react/Chart.d.ts +28 -0
  155. package/dist/charts/react/Chart.js +75 -0
  156. package/dist/charts/react/Chart.js.map +1 -0
  157. package/dist/charts/react/charts.cjs +2 -0
  158. package/dist/charts/react/charts.cjs.map +1 -0
  159. package/dist/charts/react/charts.d.cts +13 -0
  160. package/dist/charts/react/charts.d.ts +13 -0
  161. package/dist/charts/react/charts.js +179 -0
  162. package/dist/charts/react/charts.js.map +1 -0
  163. package/dist/charts/react/types.d.cts +168 -0
  164. package/dist/charts/react/types.d.ts +168 -0
  165. package/package.json +28 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n points: Float32Array;\n count: number;\n /** Relative y of the baseline */\n baseline: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Interleaved relative x (center), y0, y1 */\n instances: Float32Array;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n"],"mappings":"AA2BA,IAAaA,EAAM"}
@@ -0,0 +1,83 @@
1
+ import { Rgba } from '../color.cjs';
2
+ import { ChartRendererKind } from '../types.cjs';
3
+ /**
4
+ * Data -> clip-space transform. Positions are uploaded relative to an
5
+ * origin (float32 keeps its precision for timestamps), so
6
+ * `clip = relative * scale + offset`.
7
+ */
8
+ export interface RenderTransform {
9
+ xScale: number;
10
+ xOffset: number;
11
+ yScale: number;
12
+ yOffset: number;
13
+ }
14
+ export interface RenderFrame {
15
+ transform: RenderTransform;
16
+ /** Size of the drawing buffer in device pixels */
17
+ width: number;
18
+ height: number;
19
+ /** Device pixel ratio */
20
+ dpr: number;
21
+ }
22
+ /** Missing values are written as this sentinel (NaN is unreliable in shaders) */
23
+ export declare const GAP = 3e+38;
24
+ interface RenderItemBase {
25
+ /** Identifies the GPU resources of the item */
26
+ key: string;
27
+ /** Changes when the buffers must be uploaded again */
28
+ version: number;
29
+ /** Straight RGBA */
30
+ color: Rgba;
31
+ }
32
+ export interface LineItem extends RenderItemBase {
33
+ kind: "line";
34
+ /** Interleaved relative x, y */
35
+ points: Float32Array;
36
+ count: number;
37
+ /** CSS pixels */
38
+ width: number;
39
+ sorted: boolean;
40
+ }
41
+ export interface AreaItem extends RenderItemBase {
42
+ kind: "area";
43
+ points: Float32Array;
44
+ count: number;
45
+ /** Relative y of the baseline */
46
+ baseline: number;
47
+ opacity: number;
48
+ sorted: boolean;
49
+ }
50
+ export interface BarItem extends RenderItemBase {
51
+ kind: "bar";
52
+ /** Interleaved relative x (center), y0, y1 */
53
+ instances: Float32Array;
54
+ count: number;
55
+ /** Half of the bar width, in relative x units */
56
+ halfWidth: number;
57
+ /** Corner radius in CSS pixels */
58
+ radius: number;
59
+ /** Instances are sorted by x */
60
+ sorted: boolean;
61
+ }
62
+ export interface ScatterItem extends RenderItemBase {
63
+ kind: "scatter";
64
+ /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */
65
+ instances: ArrayBuffer;
66
+ count: number;
67
+ opacity: number;
68
+ /** Outline width in CSS pixels */
69
+ stroke: number;
70
+ }
71
+ export type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;
72
+ export interface ChartRenderer {
73
+ readonly kind: ChartRendererKind;
74
+ readonly canvas: HTMLCanvasElement;
75
+ /** Drawing buffer size in device pixels */
76
+ resize(width: number, height: number): void;
77
+ render(items: readonly RenderItem[], frame: RenderFrame): void;
78
+ destroy(): void;
79
+ }
80
+ /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
+ export type RendererLostHandler = () => void;
82
+ export declare const SCATTER_STRIDE = 16;
83
+ export {};
@@ -0,0 +1,83 @@
1
+ import { Rgba } from '../color.js';
2
+ import { ChartRendererKind } from '../types.js';
3
+ /**
4
+ * Data -> clip-space transform. Positions are uploaded relative to an
5
+ * origin (float32 keeps its precision for timestamps), so
6
+ * `clip = relative * scale + offset`.
7
+ */
8
+ export interface RenderTransform {
9
+ xScale: number;
10
+ xOffset: number;
11
+ yScale: number;
12
+ yOffset: number;
13
+ }
14
+ export interface RenderFrame {
15
+ transform: RenderTransform;
16
+ /** Size of the drawing buffer in device pixels */
17
+ width: number;
18
+ height: number;
19
+ /** Device pixel ratio */
20
+ dpr: number;
21
+ }
22
+ /** Missing values are written as this sentinel (NaN is unreliable in shaders) */
23
+ export declare const GAP = 3e+38;
24
+ interface RenderItemBase {
25
+ /** Identifies the GPU resources of the item */
26
+ key: string;
27
+ /** Changes when the buffers must be uploaded again */
28
+ version: number;
29
+ /** Straight RGBA */
30
+ color: Rgba;
31
+ }
32
+ export interface LineItem extends RenderItemBase {
33
+ kind: "line";
34
+ /** Interleaved relative x, y */
35
+ points: Float32Array;
36
+ count: number;
37
+ /** CSS pixels */
38
+ width: number;
39
+ sorted: boolean;
40
+ }
41
+ export interface AreaItem extends RenderItemBase {
42
+ kind: "area";
43
+ points: Float32Array;
44
+ count: number;
45
+ /** Relative y of the baseline */
46
+ baseline: number;
47
+ opacity: number;
48
+ sorted: boolean;
49
+ }
50
+ export interface BarItem extends RenderItemBase {
51
+ kind: "bar";
52
+ /** Interleaved relative x (center), y0, y1 */
53
+ instances: Float32Array;
54
+ count: number;
55
+ /** Half of the bar width, in relative x units */
56
+ halfWidth: number;
57
+ /** Corner radius in CSS pixels */
58
+ radius: number;
59
+ /** Instances are sorted by x */
60
+ sorted: boolean;
61
+ }
62
+ export interface ScatterItem extends RenderItemBase {
63
+ kind: "scatter";
64
+ /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */
65
+ instances: ArrayBuffer;
66
+ count: number;
67
+ opacity: number;
68
+ /** Outline width in CSS pixels */
69
+ stroke: number;
70
+ }
71
+ export type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;
72
+ export interface ChartRenderer {
73
+ readonly kind: ChartRendererKind;
74
+ readonly canvas: HTMLCanvasElement;
75
+ /** Drawing buffer size in device pixels */
76
+ resize(width: number, height: number): void;
77
+ render(items: readonly RenderItem[], frame: RenderFrame): void;
78
+ destroy(): void;
79
+ }
80
+ /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
+ export type RendererLostHandler = () => void;
82
+ export declare const SCATTER_STRIDE = 16;
83
+ export {};
@@ -0,0 +1,6 @@
1
+ //#region src/engine/renderers/types.ts
2
+ var e = 3e38;
3
+ //#endregion
4
+ export { e as GAP };
5
+
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n points: Float32Array;\n count: number;\n /** Relative y of the baseline */\n baseline: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Interleaved relative x (center), y0, y1 */\n instances: Float32Array;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n"],"mappings":";AA2BA,IAAaA,IAAM"}
@@ -0,0 +1,2 @@
1
+ const e=require("./range.cjs"),t=require("./shaders.cjs");var n={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`],scatter:[`a_pos`,`a_size`,`a_color`]},r=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},i=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,a=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),n=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return i.test(String(n??``))},o=(i,o,s=!1)=>{let c=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:s});if(!c)return null;if(s&&a(c))return c.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let l=r(c,t.GLSL_LINE,n.line),u=r(c,t.GLSL_AREA,n.area),d=r(c,t.GLSL_BAR,n.bar),f=r(c,t.GLSL_SCATTER,n.scatter);if(!l||!u||!d||!f)return null;let p={line:l,area:u,bar:d,scatter:f},m=!1,h=e=>{e.preventDefault(),m=!0,o()};i.addEventListener(`webglcontextlost`,h);let g=new Map,_=(e,t)=>{let n=c.FLOAT;switch(e.kind){case`line`:case`area`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,8,t*8),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,2,n,!1,8,t*8+8),c.vertexAttribDivisor(1,1);break;case`bar`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,12,t*12),c.vertexAttribDivisor(0,1);break;default:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,16,0),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,1,n,!1,16,8),c.vertexAttribDivisor(1,1),c.enableVertexAttribArray(2),c.vertexAttribPointer(2,4,c.UNSIGNED_BYTE,!0,16,12),c.vertexAttribDivisor(2,1)}},v=e=>{c.deleteBuffer(e.buffer),c.deleteVertexArray(e.vao)},y=e=>{let t=g.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&v(t);let n=c.createBuffer(),r=c.createVertexArray();if(!n||!r)return null;switch(c.bindVertexArray(r),c.bindBuffer(c.ARRAY_BUFFER,n),e.kind){case`line`:case`area`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*2);break;case`bar`:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW,0,e.count*3);break;default:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW)}_(e,0),c.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return g.set(e.key,i),i},b=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0];case`area`:return[e.baseline,e.opacity];case`bar`:return[e.halfWidth,e.radius];default:return[e.opacity,e.stroke]}};return{kind:`webgl2`,canvas:i,resize(e,t){i.width=Math.max(1,e),i.height=Math.max(1,t)},render(t,n){if(m||c.isContextLost())return;c.viewport(0,0,i.width,i.height),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);let r=n.transform,a=new Set;for(let i of t){a.add(i.key);let[t,o]=e.instanceRange(i,n);if(o<=0)continue;let s=y(i);if(!s)continue;let l=p[i.kind];c.useProgram(l.program),c.uniform4f(l.xform,r.xScale,r.xOffset,r.yScale,r.yOffset),c.uniform4f(l.viewport,n.width,n.height,n.dpr,0),c.uniform4f(l.color,i.color[0],i.color[1],i.color[2],i.color[3]);let[u,d]=b(i,n);c.uniform4f(l.params,u,d,0,0),c.bindVertexArray(s.vao),s.first!==t&&(c.bindBuffer(c.ARRAY_BUFFER,s.buffer),_(i,t),s.first=t),c.drawArraysInstanced(c.TRIANGLE_STRIP,0,4,o)}c.bindVertexArray(null);for(let[e,t]of g)a.has(e)||(v(t),g.delete(e))},destroy(){if(i.removeEventListener(`webglcontextlost`,h),!c.isContextLost()){for(let e of g.values())v(e);for(let e of Object.values(p))c.deleteProgram(e.program)}g.clear(),c.getExtension(`WEBGL_lose_context`)?.loseContext()}}};exports.SOFTWARE_RENDERER=i,exports.createWebGl2Renderer=o;
2
+ //# sourceMappingURL=webgl2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.cjs","names":["GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","instanceRange","require_range","require_shaders","ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","area","bar","scatter","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.cjs';
2
+ export declare const SOFTWARE_RENDERER: RegExp;
3
+ export declare const createWebGl2Renderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
4
+ /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */
5
+ requireHardware?: boolean) => ChartRenderer | null;
@@ -0,0 +1,5 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.js';
2
+ export declare const SOFTWARE_RENDERER: RegExp;
3
+ export declare const createWebGl2Renderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
4
+ /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */
5
+ requireHardware?: boolean) => ChartRenderer | null;
@@ -0,0 +1,134 @@
1
+ import { instanceRange as e } from "./range.js";
2
+ import { GLSL_AREA as t, GLSL_BAR as n, GLSL_LINE as r, GLSL_SCATTER as i } from "./shaders.js";
3
+ //#region src/engine/renderers/webgl2.ts
4
+ var a = {
5
+ line: ["a_a", "a_b"],
6
+ area: ["a_a", "a_b"],
7
+ bar: ["a_inst"],
8
+ scatter: [
9
+ "a_pos",
10
+ "a_size",
11
+ "a_color"
12
+ ]
13
+ }, o = (e, t, n) => {
14
+ let r = (t, n) => {
15
+ let r = e.createShader(t);
16
+ return r ? (e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (e.deleteShader(r), null)) : null;
17
+ }, i = r(e.VERTEX_SHADER, t.vertex), a = r(e.FRAGMENT_SHADER, t.fragment), o = e.createProgram();
18
+ return !i || !a || !o ? null : (e.attachShader(o, i), e.attachShader(o, a), n.forEach((t, n) => e.bindAttribLocation(o, n, t)), e.linkProgram(o), e.deleteShader(i), e.deleteShader(a), e.getProgramParameter(o, e.LINK_STATUS) ? {
19
+ program: o,
20
+ xform: e.getUniformLocation(o, "u_xform"),
21
+ viewport: e.getUniformLocation(o, "u_viewport"),
22
+ color: e.getUniformLocation(o, "u_color"),
23
+ params: e.getUniformLocation(o, "u_params")
24
+ } : (e.deleteProgram(o), null));
25
+ }, s = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i, c = (e) => {
26
+ let t = e.getExtension("WEBGL_debug_renderer_info"), n = t ? e.getParameter(t.UNMASKED_RENDERER_WEBGL) : e.getParameter(e.RENDERER);
27
+ return s.test(String(n ?? ""));
28
+ }, l = (s, l, u = !1) => {
29
+ let d = s.getContext("webgl2", {
30
+ alpha: !0,
31
+ premultipliedAlpha: !0,
32
+ antialias: !1,
33
+ depth: !1,
34
+ stencil: !1,
35
+ preserveDrawingBuffer: !1,
36
+ failIfMajorPerformanceCaveat: u
37
+ });
38
+ if (!d) return null;
39
+ if (u && c(d)) return d.getExtension("WEBGL_lose_context")?.loseContext(), null;
40
+ let f = o(d, r, a.line), p = o(d, t, a.area), m = o(d, n, a.bar), h = o(d, i, a.scatter);
41
+ if (!f || !p || !m || !h) return null;
42
+ let g = {
43
+ line: f,
44
+ area: p,
45
+ bar: m,
46
+ scatter: h
47
+ }, _ = !1, v = (e) => {
48
+ e.preventDefault(), _ = !0, l();
49
+ };
50
+ s.addEventListener("webglcontextlost", v);
51
+ let y = /* @__PURE__ */ new Map(), b = (e, t) => {
52
+ let n = d.FLOAT;
53
+ switch (e.kind) {
54
+ case "line":
55
+ case "area":
56
+ d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 8, t * 8), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 2, n, !1, 8, t * 8 + 8), d.vertexAttribDivisor(1, 1);
57
+ break;
58
+ case "bar":
59
+ d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 3, n, !1, 12, t * 12), d.vertexAttribDivisor(0, 1);
60
+ break;
61
+ default: d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 16, 0), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 1, n, !1, 16, 8), d.vertexAttribDivisor(1, 1), d.enableVertexAttribArray(2), d.vertexAttribPointer(2, 4, d.UNSIGNED_BYTE, !0, 16, 12), d.vertexAttribDivisor(2, 1);
62
+ }
63
+ }, x = (e) => {
64
+ d.deleteBuffer(e.buffer), d.deleteVertexArray(e.vao);
65
+ }, S = (e) => {
66
+ let t = y.get(e.key);
67
+ if (t && t.version === e.version && t.kind === e.kind) return t;
68
+ t && x(t);
69
+ let n = d.createBuffer(), r = d.createVertexArray();
70
+ if (!n || !r) return null;
71
+ switch (d.bindVertexArray(r), d.bindBuffer(d.ARRAY_BUFFER, n), e.kind) {
72
+ case "line":
73
+ case "area":
74
+ d.bufferData(d.ARRAY_BUFFER, e.points, d.STATIC_DRAW, 0, e.count * 2);
75
+ break;
76
+ case "bar":
77
+ d.bufferData(d.ARRAY_BUFFER, e.instances, d.STATIC_DRAW, 0, e.count * 3);
78
+ break;
79
+ default: d.bufferData(d.ARRAY_BUFFER, e.instances, d.STATIC_DRAW);
80
+ }
81
+ b(e, 0), d.bindVertexArray(null);
82
+ let i = {
83
+ version: e.version,
84
+ kind: e.kind,
85
+ buffer: n,
86
+ vao: r,
87
+ first: 0
88
+ };
89
+ return y.set(e.key, i), i;
90
+ }, C = (e, t) => {
91
+ switch (e.kind) {
92
+ case "line": return [e.width * t.dpr / 2, 0];
93
+ case "area": return [e.baseline, e.opacity];
94
+ case "bar": return [e.halfWidth, e.radius];
95
+ default: return [e.opacity, e.stroke];
96
+ }
97
+ };
98
+ return {
99
+ kind: "webgl2",
100
+ canvas: s,
101
+ resize(e, t) {
102
+ s.width = Math.max(1, e), s.height = Math.max(1, t);
103
+ },
104
+ render(t, n) {
105
+ if (_ || d.isContextLost()) return;
106
+ d.viewport(0, 0, s.width, s.height), d.clearColor(0, 0, 0, 0), d.clear(d.COLOR_BUFFER_BIT), d.enable(d.BLEND), d.blendFunc(d.ONE, d.ONE_MINUS_SRC_ALPHA);
107
+ let r = n.transform, i = /* @__PURE__ */ new Set();
108
+ for (let a of t) {
109
+ i.add(a.key);
110
+ let [t, o] = e(a, n);
111
+ if (o <= 0) continue;
112
+ let s = S(a);
113
+ if (!s) continue;
114
+ let c = g[a.kind];
115
+ d.useProgram(c.program), d.uniform4f(c.xform, r.xScale, r.xOffset, r.yScale, r.yOffset), d.uniform4f(c.viewport, n.width, n.height, n.dpr, 0), d.uniform4f(c.color, a.color[0], a.color[1], a.color[2], a.color[3]);
116
+ let [l, u] = C(a, n);
117
+ d.uniform4f(c.params, l, u, 0, 0), d.bindVertexArray(s.vao), s.first !== t && (d.bindBuffer(d.ARRAY_BUFFER, s.buffer), b(a, t), s.first = t), d.drawArraysInstanced(d.TRIANGLE_STRIP, 0, 4, o);
118
+ }
119
+ d.bindVertexArray(null);
120
+ for (let [e, t] of y) i.has(e) || (x(t), y.delete(e));
121
+ },
122
+ destroy() {
123
+ if (s.removeEventListener("webglcontextlost", v), !d.isContextLost()) {
124
+ for (let e of y.values()) x(e);
125
+ for (let e of Object.values(g)) d.deleteProgram(e.program);
126
+ }
127
+ y.clear(), d.getExtension("WEBGL_lose_context")?.loseContext();
128
+ }
129
+ };
130
+ };
131
+ //#endregion
132
+ export { s as SOFTWARE_RENDERER, l as createWebGl2Renderer };
133
+
134
+ //# sourceMappingURL=webgl2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.js","names":["ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","instanceRange","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=[{arrayStride:8,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`}]},{arrayStride:8,stepMode:`instance`,attributes:[{shaderLocation:1,offset:0,format:`float32x2`}]}],v={line:g(t.WGSL_LINE,_),area:g(t.WGSL_AREA,_),bar:g(t.WGSL_BAR,[{arrayStride:12,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`}]}]),scatter:g(t.WGSL_SCATTER,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`},{shaderLocation:1,offset:8,format:`float32`},{shaderLocation:2,offset:12,format:`unorm8x4`}]}])},y=new Map,b=new Float32Array(n/4),x=e=>{switch(e.kind){case`line`:case`area`:return e.points.subarray(0,e.count*2);case`bar`:return e.instances.subarray(0,e.count*3);default:return e.instances}},S=e=>{let t=y.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t?.vertex?.destroy();let r=x(e),i=Math.max(16,Math.ceil(r.byteLength/4)*4),a=r.byteLength>0?l.createBuffer({size:i,usage:40}):null;if(a&&(r instanceof Float32Array?l.queue.writeBuffer(a,0,r.buffer,r.byteOffset,r.byteLength):l.queue.writeBuffer(a,0,r)),t)t.version=e.version,t.kind=e.kind,t.vertex=a;else{let r=l.createBuffer({size:n,usage:72});t={version:e.version,kind:e.kind,vertex:a,uniform:r,bindGroup:l.createBindGroup({layout:p,entries:[{binding:0,resource:{buffer:r}}]})},y.set(e.key,t)}return t},C=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[e.baseline,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,0,0];default:return[e.opacity,e.stroke,0,0]}};return{kind:`webgpu`,canvas:r,resize(e,t){r.width=Math.max(1,e),r.height=Math.max(1,t)},render(t,n){if(f)return;let r=new Set,i=l.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:u.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`store`}]}),o=n.transform;for(let i of t){r.add(i.key);let[t,s]=e.instanceRange(i,n);if(s<=0)continue;let c=S(i);c.vertex&&(b.set([o.xScale,o.xOffset,o.yScale,o.yOffset,n.width,n.height,n.dpr,0,...i.color,...C(i,n)],0),l.queue.writeBuffer(c.uniform,0,b),a.setPipeline(v[i.kind]),a.setBindGroup(0,c.bindGroup),a.setVertexBuffer(0,c.vertex),(i.kind===`line`||i.kind===`area`)&&a.setVertexBuffer(1,c.vertex,8),a.draw(4,s,0,t))}a.end(),l.queue.submit([i.finish()]);for(let[e,t]of y)r.has(e)||(t.vertex?.destroy(),t.uniform.destroy(),y.delete(e))},destroy(){f=!0;for(let e of y.values())e.vertex?.destroy(),e.uniform.destroy();y.clear(),u.unconfigure(),l.destroy()}}};exports.createWebGpuRenderer=r;
2
+ //# sourceMappingURL=webgpu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment),\n area: pipeline(WGSL_AREA, segment),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: 12,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" }],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n case \"area\":\n return item.points.subarray(0, item.count * 2);\n case \"bar\":\n return item.instances.subarray(0, item.count * 3);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.baseline, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, 0, 0];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\" || item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.cjs';
2
+ /** Whether `navigator.gpu` exists (an adapter may still be unavailable) */
3
+ export declare const hasWebGpu: () => boolean;
4
+ export declare const createWebGpuRenderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
5
+ /** Refuses fallback (software) adapters */
6
+ requireHardware?: boolean) => Promise<ChartRenderer | null>;
@@ -0,0 +1,6 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.js';
2
+ /** Whether `navigator.gpu` exists (an adapter may still be unavailable) */
3
+ export declare const hasWebGpu: () => boolean;
4
+ export declare const createWebGpuRenderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
5
+ /** Refuses fallback (software) adapters */
6
+ requireHardware?: boolean) => Promise<ChartRenderer | null>;