minerva-design 1.0.2 → 1.2.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.
- package/CHANGELOG.md +14 -0
- package/README.md +21 -19
- package/dist/charts/canvas.d.cts +7 -0
- package/dist/charts/canvas.d.ts +7 -0
- package/dist/charts/core.cjs +1 -0
- package/dist/charts/core.d.cts +7 -0
- package/dist/charts/core.d.ts +7 -0
- package/dist/charts/core.js +6 -0
- package/dist/charts/engine/axis.cjs +2 -0
- package/dist/charts/engine/axis.cjs.map +1 -0
- package/dist/charts/engine/axis.d.cts +13 -0
- package/dist/charts/engine/axis.d.ts +13 -0
- package/dist/charts/engine/axis.js +38 -0
- package/dist/charts/engine/axis.js.map +1 -0
- package/dist/charts/engine/canvas.cjs +2 -0
- package/dist/charts/engine/canvas.cjs.map +1 -0
- package/dist/charts/engine/canvas.d.cts +85 -0
- package/dist/charts/engine/canvas.d.ts +85 -0
- package/dist/charts/engine/canvas.js +165 -0
- package/dist/charts/engine/canvas.js.map +1 -0
- package/dist/charts/engine/chart.cjs +3 -0
- package/dist/charts/engine/chart.cjs.map +1 -0
- package/dist/charts/engine/chart.d.cts +6 -0
- package/dist/charts/engine/chart.d.ts +6 -0
- package/dist/charts/engine/chart.js +566 -0
- package/dist/charts/engine/chart.js.map +1 -0
- package/dist/charts/engine/color.cjs +2 -0
- package/dist/charts/engine/color.cjs.map +1 -0
- package/dist/charts/engine/color.d.cts +33 -0
- package/dist/charts/engine/color.d.ts +33 -0
- package/dist/charts/engine/color.js +167 -0
- package/dist/charts/engine/color.js.map +1 -0
- package/dist/charts/engine/controller.cjs +3 -0
- package/dist/charts/engine/controller.cjs.map +1 -0
- package/dist/charts/engine/controller.d.cts +182 -0
- package/dist/charts/engine/controller.d.ts +182 -0
- package/dist/charts/engine/controller.js +528 -0
- package/dist/charts/engine/controller.js.map +1 -0
- package/dist/charts/engine/data.cjs +2 -0
- package/dist/charts/engine/data.cjs.map +1 -0
- package/dist/charts/engine/data.d.cts +29 -0
- package/dist/charts/engine/data.d.ts +29 -0
- package/dist/charts/engine/data.js +104 -0
- package/dist/charts/engine/data.js.map +1 -0
- package/dist/charts/engine/decimate.cjs +2 -0
- package/dist/charts/engine/decimate.cjs.map +1 -0
- package/dist/charts/engine/decimate.d.cts +13 -0
- package/dist/charts/engine/decimate.d.ts +13 -0
- package/dist/charts/engine/decimate.js +28 -0
- package/dist/charts/engine/decimate.js.map +1 -0
- package/dist/charts/engine/dom.cjs +2 -0
- package/dist/charts/engine/dom.cjs.map +1 -0
- package/dist/charts/engine/dom.d.cts +21 -0
- package/dist/charts/engine/dom.d.ts +21 -0
- package/dist/charts/engine/dom.js +125 -0
- package/dist/charts/engine/dom.js.map +1 -0
- package/dist/charts/engine/format.cjs +2 -0
- package/dist/charts/engine/format.cjs.map +1 -0
- package/dist/charts/engine/format.d.cts +9 -0
- package/dist/charts/engine/format.d.ts +9 -0
- package/dist/charts/engine/format.js +34 -0
- package/dist/charts/engine/format.js.map +1 -0
- package/dist/charts/engine/items.cjs +2 -0
- package/dist/charts/engine/items.cjs.map +1 -0
- package/dist/charts/engine/items.d.cts +8 -0
- package/dist/charts/engine/items.d.ts +8 -0
- package/dist/charts/engine/items.js +91 -0
- package/dist/charts/engine/items.js.map +1 -0
- package/dist/charts/engine/layout.cjs +2 -0
- package/dist/charts/engine/layout.cjs.map +1 -0
- package/dist/charts/engine/layout.d.cts +37 -0
- package/dist/charts/engine/layout.d.ts +37 -0
- package/dist/charts/engine/layout.js +26 -0
- package/dist/charts/engine/layout.js.map +1 -0
- package/dist/charts/engine/model.cjs +2 -0
- package/dist/charts/engine/model.cjs.map +1 -0
- package/dist/charts/engine/model.d.cts +74 -0
- package/dist/charts/engine/model.d.ts +74 -0
- package/dist/charts/engine/model.js +175 -0
- package/dist/charts/engine/model.js.map +1 -0
- package/dist/charts/engine/overlay.cjs +2 -0
- package/dist/charts/engine/overlay.cjs.map +1 -0
- package/dist/charts/engine/overlay.d.cts +78 -0
- package/dist/charts/engine/overlay.d.ts +78 -0
- package/dist/charts/engine/overlay.js +137 -0
- package/dist/charts/engine/overlay.js.map +1 -0
- package/dist/charts/engine/presets.cjs +3 -0
- package/dist/charts/engine/presets.cjs.map +1 -0
- package/dist/charts/engine/presets.d.cts +103 -0
- package/dist/charts/engine/presets.d.ts +103 -0
- package/dist/charts/engine/presets.js +153 -0
- package/dist/charts/engine/presets.js.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.d.cts +20 -0
- package/dist/charts/engine/renderers/canvas2d.d.ts +20 -0
- package/dist/charts/engine/renderers/canvas2d.js +193 -0
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
- package/dist/charts/engine/renderers/detect.cjs +2 -0
- package/dist/charts/engine/renderers/detect.cjs.map +1 -0
- package/dist/charts/engine/renderers/detect.d.cts +12 -0
- package/dist/charts/engine/renderers/detect.d.ts +12 -0
- package/dist/charts/engine/renderers/detect.js +33 -0
- package/dist/charts/engine/renderers/detect.js.map +1 -0
- package/dist/charts/engine/renderers/range.cjs +2 -0
- package/dist/charts/engine/renderers/range.cjs.map +1 -0
- package/dist/charts/engine/renderers/range.d.cts +5 -0
- package/dist/charts/engine/renderers/range.d.ts +5 -0
- package/dist/charts/engine/renderers/range.js +32 -0
- package/dist/charts/engine/renderers/range.js.map +1 -0
- package/dist/charts/engine/renderers/shaders.cjs +266 -0
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
- package/dist/charts/engine/renderers/shaders.d.cts +20 -0
- package/dist/charts/engine/renderers/shaders.d.ts +20 -0
- package/dist/charts/engine/renderers/shaders.js +251 -0
- package/dist/charts/engine/renderers/shaders.js.map +1 -0
- package/dist/charts/engine/renderers/types.cjs +2 -0
- package/dist/charts/engine/renderers/types.cjs.map +1 -0
- package/dist/charts/engine/renderers/types.d.cts +83 -0
- package/dist/charts/engine/renderers/types.d.ts +83 -0
- package/dist/charts/engine/renderers/types.js +6 -0
- package/dist/charts/engine/renderers/types.js.map +1 -0
- package/dist/charts/engine/renderers/webgl2.cjs +2 -0
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
- package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
- package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
- package/dist/charts/engine/renderers/webgl2.js +134 -0
- package/dist/charts/engine/renderers/webgl2.js.map +1 -0
- package/dist/charts/engine/renderers/webgpu.cjs +2 -0
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
- package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
- package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
- package/dist/charts/engine/renderers/webgpu.js +220 -0
- package/dist/charts/engine/renderers/webgpu.js.map +1 -0
- package/dist/charts/engine/scale.cjs +2 -0
- package/dist/charts/engine/scale.cjs.map +1 -0
- package/dist/charts/engine/scale.d.cts +13 -0
- package/dist/charts/engine/scale.d.ts +13 -0
- package/dist/charts/engine/scale.js +37 -0
- package/dist/charts/engine/scale.js.map +1 -0
- package/dist/charts/engine/scene.cjs +2 -0
- package/dist/charts/engine/scene.cjs.map +1 -0
- package/dist/charts/engine/scene.d.cts +89 -0
- package/dist/charts/engine/scene.d.ts +89 -0
- package/dist/charts/engine/scene.js +241 -0
- package/dist/charts/engine/scene.js.map +1 -0
- package/dist/charts/engine/spatial.cjs +2 -0
- package/dist/charts/engine/spatial.cjs.map +1 -0
- package/dist/charts/engine/spatial.d.cts +18 -0
- package/dist/charts/engine/spatial.d.ts +18 -0
- package/dist/charts/engine/spatial.js +53 -0
- package/dist/charts/engine/spatial.js.map +1 -0
- package/dist/charts/engine/theme.cjs +2 -0
- package/dist/charts/engine/theme.cjs.map +1 -0
- package/dist/charts/engine/theme.d.cts +45 -0
- package/dist/charts/engine/theme.d.ts +45 -0
- package/dist/charts/engine/theme.js +86 -0
- package/dist/charts/engine/theme.js.map +1 -0
- package/dist/charts/engine/time.cjs +2 -0
- package/dist/charts/engine/time.cjs.map +1 -0
- package/dist/charts/engine/time.d.cts +10 -0
- package/dist/charts/engine/time.d.ts +10 -0
- package/dist/charts/engine/time.js +189 -0
- package/dist/charts/engine/time.js.map +1 -0
- package/dist/charts/engine/types.d.cts +356 -0
- package/dist/charts/engine/types.d.ts +356 -0
- package/dist/charts/engine/viewport.cjs +2 -0
- package/dist/charts/engine/viewport.cjs.map +1 -0
- package/dist/charts/engine/viewport.d.cts +12 -0
- package/dist/charts/engine/viewport.d.ts +12 -0
- package/dist/charts/engine/viewport.js +15 -0
- package/dist/charts/engine/viewport.js.map +1 -0
- package/dist/charts/index.cjs +1 -0
- package/dist/charts/index.d.cts +4 -0
- package/dist/charts/index.d.ts +4 -0
- package/dist/charts/index.js +10 -0
- package/dist/charts/react/Chart.cjs +2 -0
- package/dist/charts/react/Chart.cjs.map +1 -0
- package/dist/charts/react/Chart.d.cts +35 -0
- package/dist/charts/react/Chart.d.ts +35 -0
- package/dist/charts/react/Chart.js +117 -0
- package/dist/charts/react/Chart.js.map +1 -0
- package/dist/charts/react/charts.cjs +2 -0
- package/dist/charts/react/charts.cjs.map +1 -0
- package/dist/charts/react/charts.d.cts +13 -0
- package/dist/charts/react/charts.d.ts +13 -0
- package/dist/charts/react/charts.js +133 -0
- package/dist/charts/react/charts.js.map +1 -0
- package/dist/charts/react/types.d.cts +136 -0
- package/dist/charts/react/types.d.ts +136 -0
- package/dist/native/charts/src/canvas.cjs +1 -0
- package/dist/native/charts/src/canvas.js +6 -0
- package/dist/native/charts/src/engine/axis.cjs +2 -0
- package/dist/native/charts/src/engine/axis.cjs.map +1 -0
- package/dist/native/charts/src/engine/axis.js +38 -0
- package/dist/native/charts/src/engine/axis.js.map +1 -0
- package/dist/native/charts/src/engine/canvas.cjs +1 -0
- package/dist/native/charts/src/engine/canvas.js +1 -0
- package/dist/native/charts/src/engine/color.cjs +2 -0
- package/dist/native/charts/src/engine/color.cjs.map +1 -0
- package/dist/native/charts/src/engine/color.js +130 -0
- package/dist/native/charts/src/engine/color.js.map +1 -0
- package/dist/native/charts/src/engine/controller.cjs +3 -0
- package/dist/native/charts/src/engine/controller.cjs.map +1 -0
- package/dist/native/charts/src/engine/controller.js +528 -0
- package/dist/native/charts/src/engine/controller.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +2 -0
- package/dist/native/charts/src/engine/data.cjs.map +1 -0
- package/dist/native/charts/src/engine/data.js +104 -0
- package/dist/native/charts/src/engine/data.js.map +1 -0
- package/dist/native/charts/src/engine/decimate.cjs +2 -0
- package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
- package/dist/native/charts/src/engine/decimate.js +28 -0
- package/dist/native/charts/src/engine/decimate.js.map +1 -0
- package/dist/native/charts/src/engine/format.cjs +2 -0
- package/dist/native/charts/src/engine/format.cjs.map +1 -0
- package/dist/native/charts/src/engine/format.js +34 -0
- package/dist/native/charts/src/engine/format.js.map +1 -0
- package/dist/native/charts/src/engine/layout.cjs +2 -0
- package/dist/native/charts/src/engine/layout.cjs.map +1 -0
- package/dist/native/charts/src/engine/layout.js +26 -0
- package/dist/native/charts/src/engine/layout.js.map +1 -0
- package/dist/native/charts/src/engine/model.cjs +2 -0
- package/dist/native/charts/src/engine/model.cjs.map +1 -0
- package/dist/native/charts/src/engine/model.js +175 -0
- package/dist/native/charts/src/engine/model.js.map +1 -0
- package/dist/native/charts/src/engine/overlay.cjs +2 -0
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
- package/dist/native/charts/src/engine/overlay.js +49 -0
- package/dist/native/charts/src/engine/overlay.js.map +1 -0
- package/dist/native/charts/src/engine/presets.cjs +3 -0
- package/dist/native/charts/src/engine/presets.cjs.map +1 -0
- package/dist/native/charts/src/engine/presets.js +147 -0
- package/dist/native/charts/src/engine/presets.js.map +1 -0
- package/dist/native/charts/src/engine/scale.cjs +2 -0
- package/dist/native/charts/src/engine/scale.cjs.map +1 -0
- package/dist/native/charts/src/engine/scale.js +37 -0
- package/dist/native/charts/src/engine/scale.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +2 -0
- package/dist/native/charts/src/engine/scene.cjs.map +1 -0
- package/dist/native/charts/src/engine/scene.js +241 -0
- package/dist/native/charts/src/engine/scene.js.map +1 -0
- package/dist/native/charts/src/engine/spatial.cjs +2 -0
- package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
- package/dist/native/charts/src/engine/spatial.js +53 -0
- package/dist/native/charts/src/engine/spatial.js.map +1 -0
- package/dist/native/charts/src/engine/theme.cjs +2 -0
- package/dist/native/charts/src/engine/theme.cjs.map +1 -0
- package/dist/native/charts/src/engine/theme.js +62 -0
- package/dist/native/charts/src/engine/theme.js.map +1 -0
- package/dist/native/charts/src/engine/time.cjs +2 -0
- package/dist/native/charts/src/engine/time.cjs.map +1 -0
- package/dist/native/charts/src/engine/time.js +189 -0
- package/dist/native/charts/src/engine/time.js.map +1 -0
- package/dist/native/charts/src/engine/viewport.cjs +2 -0
- package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
- package/dist/native/charts/src/engine/viewport.js +12 -0
- package/dist/native/charts/src/engine/viewport.js.map +1 -0
- package/dist/native/components/Chart/ChartBase.cjs +2 -0
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
- package/dist/native/components/Chart/ChartBase.d.cts +29 -0
- package/dist/native/components/Chart/ChartBase.d.ts +29 -0
- package/dist/native/components/Chart/ChartBase.js +287 -0
- package/dist/native/components/Chart/ChartBase.js.map +1 -0
- package/dist/native/components/Chart/charts.cjs +2 -0
- package/dist/native/components/Chart/charts.cjs.map +1 -0
- package/dist/native/components/Chart/charts.d.cts +19 -0
- package/dist/native/components/Chart/charts.d.ts +19 -0
- package/dist/native/components/Chart/charts.js +173 -0
- package/dist/native/components/Chart/charts.js.map +1 -0
- package/dist/native/components/Chart/index.cjs +1 -0
- package/dist/native/components/Chart/index.d.cts +2 -0
- package/dist/native/components/Chart/index.d.ts +2 -0
- package/dist/native/components/Chart/index.js +2 -0
- package/dist/native/components/Chart/measure.cjs +2 -0
- package/dist/native/components/Chart/measure.cjs.map +1 -0
- package/dist/native/components/Chart/measure.d.cts +5 -0
- package/dist/native/components/Chart/measure.d.ts +5 -0
- package/dist/native/components/Chart/measure.js +11 -0
- package/dist/native/components/Chart/measure.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +2 -0
- package/dist/native/components/Chart/scene.cjs.map +1 -0
- package/dist/native/components/Chart/scene.d.cts +41 -0
- package/dist/native/components/Chart/scene.d.ts +41 -0
- package/dist/native/components/Chart/scene.js +419 -0
- package/dist/native/components/Chart/scene.js.map +1 -0
- package/dist/native/components/Chart/theme.cjs +2 -0
- package/dist/native/components/Chart/theme.cjs.map +1 -0
- package/dist/native/components/Chart/theme.d.cts +10 -0
- package/dist/native/components/Chart/theme.d.ts +10 -0
- package/dist/native/components/Chart/theme.js +10 -0
- package/dist/native/components/Chart/theme.js.map +1 -0
- package/dist/native/components/Chart/types.d.cts +129 -0
- package/dist/native/components/Chart/types.d.ts +129 -0
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.d.cts +1 -0
- package/dist/native/index.d.ts +1 -0
- package/dist/native/index.js +6 -4
- package/dist/native/manifest.d.cts +7 -0
- package/dist/native/manifest.d.ts +7 -0
- package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
- package/dist/native/source/components/Chart/charts.tsx +291 -0
- package/dist/native/source/components/Chart/index.ts +8 -0
- package/dist/native/source/components/Chart/measure.ts +50 -0
- package/dist/native/source/components/Chart/scene.tsx +987 -0
- package/dist/native/source/components/Chart/theme.ts +16 -0
- package/dist/native/source/components/Chart/types.ts +194 -0
- package/dist/native/source/index.ts +1 -0
- package/dist/native/source/manifest.ts +14 -0
- package/dist/taro/charts.d.ts +144 -0
- package/dist/taro/index.d.ts +1 -0
- package/dist/taro/index.js +3064 -618
- package/dist/uni/BarChart.vue +75 -0
- package/dist/uni/BarChart.vue.d.ts +111 -0
- package/dist/uni/Chart.vue +68 -0
- package/dist/uni/Chart.vue.d.ts +100 -0
- package/dist/uni/LineChart.vue +75 -0
- package/dist/uni/LineChart.vue.d.ts +111 -0
- package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
- package/dist/uni/QuadrantChart.vue +184 -0
- package/dist/uni/QuadrantChart.vue.d.ts +173 -0
- package/dist/uni/ScatterChart.vue +69 -0
- package/dist/uni/ScatterChart.vue.d.ts +100 -0
- package/dist/uni/chart-canvas.d.ts +68 -0
- package/dist/uni/chart-canvas.js +363 -0
- package/dist/uni/chart-types.d.ts +135 -0
- package/dist/uni/chart-types.js +84 -0
- package/dist/uni/charts-canvas.d.ts +1 -0
- package/dist/uni/charts-canvas.js +8 -0
- package/dist/uni/index.d.ts +6 -0
- package/dist/uni/index.js +6 -0
- package/dist/weapp/bar-chart/index.js +1 -0
- package/dist/weapp/bar-chart/index.json +1 -0
- package/dist/weapp/bar-chart/index.wxml +1 -0
- package/dist/weapp/bar-chart/index.wxss +1 -0
- package/dist/weapp/chart/index.js +1 -0
- package/dist/weapp/chart/index.json +1 -0
- package/dist/weapp/chart/index.wxml +1 -0
- package/dist/weapp/chart/index.wxss +1 -0
- package/dist/weapp/controls.js +4019 -266
- package/dist/weapp/line-chart/index.js +1 -0
- package/dist/weapp/line-chart/index.json +1 -0
- package/dist/weapp/line-chart/index.wxml +1 -0
- package/dist/weapp/line-chart/index.wxss +1 -0
- package/dist/weapp/quadrant-chart/index.js +1 -0
- package/dist/weapp/quadrant-chart/index.json +1 -0
- package/dist/weapp/quadrant-chart/index.wxml +1 -0
- package/dist/weapp/quadrant-chart/index.wxss +1 -0
- package/dist/weapp/scatter-chart/index.js +1 -0
- package/dist/weapp/scatter-chart/index.json +1 -0
- package/dist/weapp/scatter-chart/index.wxml +1 -0
- package/dist/weapp/scatter-chart/index.wxss +1 -0
- package/dist/weapp/types.d.ts +295 -0
- package/package.json +48 -2
|
@@ -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 @@
|
|
|
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>;
|