akarisub 0.2.2 → 1.0.1
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/README.md +198 -167
- package/THIRD_PARTY_NOTICES.md +55 -163
- package/dist/COPYRIGHT +56 -164
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -147
- package/dist/index.js.map +1 -0
- package/dist/ts/akarisub.d.ts +323 -0
- package/dist/ts/akarisub.d.ts.map +1 -0
- package/dist/ts/akarisub.js +2235 -0
- package/dist/ts/akarisub.js.map +1 -0
- package/dist/ts/timing.d.ts +63 -0
- package/dist/ts/timing.d.ts.map +1 -0
- package/dist/ts/timing.js +219 -0
- package/dist/ts/timing.js.map +1 -0
- package/dist/ts/{ts/types.d.ts → types.d.ts} +176 -78
- package/dist/ts/types.d.ts.map +1 -0
- package/dist/ts/types.js +2 -0
- package/dist/ts/{ts/types.js.map → types.js.map} +1 -1
- package/dist/ts/{ts/utils.d.ts → utils.d.ts} +24 -37
- package/dist/ts/utils.d.ts.map +1 -0
- package/dist/ts/{ts/utils.js → utils.js} +12 -56
- package/dist/ts/utils.js.map +1 -0
- package/dist/ts/wasm.d.ts +12 -0
- package/dist/ts/wasm.d.ts.map +1 -0
- package/dist/ts/wasm.js +46 -0
- package/dist/ts/wasm.js.map +1 -0
- package/dist/ts/{ts/webgl2-renderer.d.ts → webgl2-renderer.d.ts} +17 -12
- package/dist/ts/webgl2-renderer.d.ts.map +1 -0
- package/dist/ts/{ts/webgl2-renderer.js → webgl2-renderer.js} +17 -27
- package/dist/ts/webgl2-renderer.js.map +1 -0
- package/dist/ts/webgpu-renderer.d.ts +88 -0
- package/dist/ts/webgpu-renderer.d.ts.map +1 -0
- package/dist/ts/{ts/webgpu-renderer.js → webgpu-renderer.js} +173 -71
- package/dist/ts/webgpu-renderer.js.map +1 -0
- package/dist/ts/worker.d.ts +2 -0
- package/dist/ts/{ts/worker.d.ts.map → worker.d.ts.map} +1 -1
- package/dist/ts/{ts/worker.js → worker.js} +1064 -264
- package/dist/ts/worker.js.map +1 -0
- package/dist/wrapper.d.ts +8 -0
- package/dist/wrapper.d.ts.map +1 -0
- package/dist/{ts/index.js → wrapper.js} +4 -14
- package/dist/wrapper.js.map +1 -0
- package/package.json +24 -22
- package/pkg/akarisub.js +53 -0
- package/{dist/akarisub-worker.wasm → pkg/akarisub.wasm} +0 -0
- package/src/wrapper.ts +46 -0
- package/dist/akarisub-worker.js +0 -39
- package/dist/akarisub.umd.js +0 -159
- package/dist/ts/index.d.ts +0 -14
- package/dist/ts/index.d.ts.map +0 -1
- package/dist/ts/index.js.map +0 -1
- package/dist/ts/ts/akarisub.d.ts +0 -225
- package/dist/ts/ts/akarisub.d.ts.map +0 -1
- package/dist/ts/ts/akarisub.js +0 -1073
- package/dist/ts/ts/akarisub.js.map +0 -1
- package/dist/ts/ts/types.d.ts.map +0 -1
- package/dist/ts/ts/types.js +0 -5
- package/dist/ts/ts/utils.d.ts.map +0 -1
- package/dist/ts/ts/utils.js.map +0 -1
- package/dist/ts/ts/webgl2-renderer.d.ts.map +0 -1
- package/dist/ts/ts/webgl2-renderer.js.map +0 -1
- package/dist/ts/ts/webgpu-renderer.d.ts +0 -62
- package/dist/ts/ts/webgpu-renderer.d.ts.map +0 -1
- package/dist/ts/ts/webgpu-renderer.js.map +0 -1
- package/dist/ts/ts/worker.d.ts +0 -6
- package/dist/ts/ts/worker.js.map +0 -1
- package/dist/ts/wrapper.d.ts +0 -8
- package/dist/ts/wrapper.d.ts.map +0 -1
- package/dist/ts/wrapper.js +0 -9
- package/dist/ts/wrapper.js.map +0 -1
- package/src/ts/akarisub.ts +0 -1272
- package/src/ts/types.ts +0 -397
- package/src/ts/utils.ts +0 -512
- package/src/ts/webgl2-renderer.ts +0 -426
- package/src/ts/webgpu-renderer.ts +0 -691
- package/src/ts/worker.ts +0 -2052
- /package/{dist → assets}/default.woff2 +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { RenderImage } from './types';
|
|
2
|
+
/** True when `navigator.gpu` is present. */
|
|
3
|
+
export declare function isWebGPUSupported(): boolean;
|
|
4
|
+
/** Premultiplied-alpha WebGPU compositor for subtitle bitmaps. */
|
|
5
|
+
export declare class WebGPURenderer {
|
|
6
|
+
private device;
|
|
7
|
+
private context;
|
|
8
|
+
private stageContexts;
|
|
9
|
+
private pipeline;
|
|
10
|
+
private bindGroupLayout;
|
|
11
|
+
private uniformBuffer;
|
|
12
|
+
private imageDataBuffer;
|
|
13
|
+
private textureArray;
|
|
14
|
+
private textureArrayView;
|
|
15
|
+
private textureArraySize;
|
|
16
|
+
private textureArrayWidth;
|
|
17
|
+
private textureArrayHeight;
|
|
18
|
+
private pendingDestroyTextures;
|
|
19
|
+
private externalUploadCanvas;
|
|
20
|
+
private externalUploadContext;
|
|
21
|
+
private warnedExternalUploadFallback;
|
|
22
|
+
private readonly imageDataArray;
|
|
23
|
+
private readonly resolutionArray;
|
|
24
|
+
private bindGroup;
|
|
25
|
+
private bindGroupDirty;
|
|
26
|
+
private lastCanvasWidth;
|
|
27
|
+
private lastCanvasHeight;
|
|
28
|
+
/** Swap-chain texture format used when configuring the canvas. */
|
|
29
|
+
format: GPUTextureFormat;
|
|
30
|
+
private _canvas;
|
|
31
|
+
private _initPromise;
|
|
32
|
+
private _initialized;
|
|
33
|
+
/** Allocate GPU upload buffers. Call {@linkcode init} before rendering. */
|
|
34
|
+
constructor();
|
|
35
|
+
/** Acquire a GPU device and compile the subtitle shaders. */
|
|
36
|
+
init(): Promise<void>;
|
|
37
|
+
/** @internal */
|
|
38
|
+
private _initDevice;
|
|
39
|
+
/** @internal */
|
|
40
|
+
private roundDim;
|
|
41
|
+
/** @internal */
|
|
42
|
+
private roundLayers;
|
|
43
|
+
/** @internal */
|
|
44
|
+
private createTextureArray;
|
|
45
|
+
/** @internal */
|
|
46
|
+
private ensureTextureArray;
|
|
47
|
+
/** @internal */
|
|
48
|
+
private updateBindGroup;
|
|
49
|
+
/** Bind `canvas` as the primary output and size the swap chain. */
|
|
50
|
+
setCanvas(canvas: HTMLCanvasElement, width: number, height: number): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Render a prepared full-frame subtitle snapshot into its own WebGPU canvas.
|
|
53
|
+
* Keeping prepared frames on the selected backend avoids switching to a 2D
|
|
54
|
+
* compositor during playback (and lets Chromium keep one GPU overlay stack).
|
|
55
|
+
*/
|
|
56
|
+
renderBitmapToCanvas(canvas: HTMLCanvasElement, bitmap: ImageBitmap, width: number, height: number): boolean;
|
|
57
|
+
/** Drop a staging canvas previously used with {@linkcode renderBitmapToCanvas}. */
|
|
58
|
+
releaseCanvas(canvas: HTMLCanvasElement): void;
|
|
59
|
+
/** Resize the primary canvas and uniform resolution. */
|
|
60
|
+
updateSize(width: number, height: number): void;
|
|
61
|
+
/** Composite `images` onto the primary canvas. Returns `false` if the context is missing. */
|
|
62
|
+
renderBitmaps(images: {
|
|
63
|
+
image: ImageBitmap;
|
|
64
|
+
x: number;
|
|
65
|
+
y: number;
|
|
66
|
+
}[], canvasWidth: number, canvasHeight: number): boolean;
|
|
67
|
+
/** Wait until submitted GPU work has finished. */
|
|
68
|
+
submittedWorkDone(): Promise<void>;
|
|
69
|
+
/** @internal */
|
|
70
|
+
private renderBitmapsToContext;
|
|
71
|
+
/** Composite {@linkcode RenderImage} planes onto the primary canvas. */
|
|
72
|
+
render(images: RenderImage[], _canvasWidth: number, _canvasHeight: number): boolean;
|
|
73
|
+
/** @internal */
|
|
74
|
+
private uploadImageBitmap;
|
|
75
|
+
/** @internal */
|
|
76
|
+
private uploadTextureData;
|
|
77
|
+
/** @internal */
|
|
78
|
+
private cleanupPendingTextures;
|
|
79
|
+
/** Clear the primary canvas to transparent black. */
|
|
80
|
+
clear(): boolean;
|
|
81
|
+
/** @internal */
|
|
82
|
+
private clearContext;
|
|
83
|
+
/** True after {@linkcode init} has completed successfully. */
|
|
84
|
+
get initialized(): boolean;
|
|
85
|
+
/** Release GPU resources and unconfigure all canvases. */
|
|
86
|
+
destroy(): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=webgpu-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-renderer.d.ts","sourceRoot":"","sources":["../../src/ts/webgpu-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAgG1C,4CAA4C;AAC5C,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAUD,kEAAkE;AAClE,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,eAAe,CAAkC;IAEzD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,eAAe,CAAyB;IAEhD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,sBAAsB,CAAmB;IACjD,OAAO,CAAC,oBAAoB,CAAmD;IAC/E,OAAO,CAAC,qBAAqB,CAA4E;IACzG,OAAO,CAAC,4BAA4B,CAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IAEtD,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,cAAc,CAAO;IAE7B,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,gBAAgB,CAAI;IAE5B,kEAAkE;IAClE,MAAM,EAAE,gBAAgB,CAAe;IAEvC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAQ;IAE5B,2EAA2E;IAC3E,cAEC;IAED,6DAA6D;IACvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;IAED,gBAAgB;YACF,WAAW;IA4EzB,gBAAgB;IAChB,OAAO,CAAC,QAAQ;IAIhB,gBAAgB;IAChB,OAAO,CAAC,WAAW;IAInB,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IA0C1B,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB;IAChB,OAAO,CAAC,eAAe;IAcvB,mEAAmE;IAC7D,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvF;IAED;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAkB3G;IAED,mFAAmF;IACnF,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAS7C;IAED,wDAAwD;IACxD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAY9C;IAED,6FAA6F;IAC7F,aAAa,CACX,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,EACtD,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAGT;IAED,kDAAkD;IAClD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IA4G9B,wEAAwE;IACxE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CA6GlF;IAED,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IA+CzB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAczB,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAW9B,qDAAqD;IACrD,KAAK,IAAI,OAAO,CAIf;IAED,gBAAgB;IAChB,OAAO,CAAC,YAAY;IA0BpB,8DAA8D;IAC9D,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAgCd;CACF"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/// <reference types="@webgpu/types" />
|
|
2
|
-
// Maximum images per batch
|
|
3
2
|
const MAX_IMAGES_PER_BATCH = 256;
|
|
4
|
-
// WebGPU max texture array layers
|
|
5
3
|
const MAX_TEXTURE_ARRAY_LAYERS = 256;
|
|
6
|
-
// WGSL Vertex Shader
|
|
7
4
|
const VERTEX_SHADER = /* wgsl */ `
|
|
8
5
|
struct VertexOutput {
|
|
9
6
|
@builtin(position) position: vec4f,
|
|
@@ -24,7 +21,6 @@ struct ImageData {
|
|
|
24
21
|
@group(0) @binding(0) var<uniform> uniforms: Uniforms;
|
|
25
22
|
@group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
|
|
26
23
|
|
|
27
|
-
// Quad vertices (two triangles)
|
|
28
24
|
const QUAD_POSITIONS = array<vec2f, 6>(
|
|
29
25
|
vec2f(0.0, 0.0),
|
|
30
26
|
vec2f(1.0, 0.0),
|
|
@@ -45,10 +41,8 @@ fn vertexMain(
|
|
|
45
41
|
let quadPos = QUAD_POSITIONS[vertexIndex];
|
|
46
42
|
let wh = data.destRect.zw;
|
|
47
43
|
|
|
48
|
-
// Calculate pixel position
|
|
49
44
|
let pixelPos = data.destRect.xy + quadPos * wh;
|
|
50
45
|
|
|
51
|
-
// Convert to clip space (-1 to 1)
|
|
52
46
|
var clipPos = (pixelPos / uniforms.resolution) * 2.0 - 1.0;
|
|
53
47
|
clipPos.y = -clipPos.y;
|
|
54
48
|
|
|
@@ -60,7 +54,6 @@ fn vertexMain(
|
|
|
60
54
|
return output;
|
|
61
55
|
}
|
|
62
56
|
`;
|
|
63
|
-
// WGSL Fragment Shader
|
|
64
57
|
const FRAGMENT_SHADER = /* wgsl */ `
|
|
65
58
|
@group(0) @binding(2) var texArray: texture_2d_array<f32>;
|
|
66
59
|
|
|
@@ -83,26 +76,20 @@ fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
|
|
|
83
76
|
let data = imageData[input.instanceIndex];
|
|
84
77
|
let texIndex = u32(data.texInfo.z);
|
|
85
78
|
|
|
86
|
-
// Calculate texel coordinates
|
|
87
79
|
let texCoordF = floor(input.fragCoord.xy - input.destXY);
|
|
88
80
|
let texCoord = vec2i(texCoordF);
|
|
89
81
|
|
|
90
|
-
// Bounds check
|
|
91
82
|
let texSizeI = vec2i(input.texSize);
|
|
92
83
|
if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
|
|
93
84
|
discard;
|
|
94
85
|
}
|
|
95
86
|
|
|
96
|
-
// Load from texture array
|
|
97
87
|
let color = textureLoad(texArray, texCoord, texIndex, 0);
|
|
98
88
|
|
|
99
|
-
// Premultiplied alpha output
|
|
100
89
|
return vec4f(color.rgb * color.a, color.a);
|
|
101
90
|
}
|
|
102
91
|
`;
|
|
103
|
-
/**
|
|
104
|
-
* Check if WebGPU is supported in the current browser.
|
|
105
|
-
*/
|
|
92
|
+
/** True when `navigator.gpu` is present. */
|
|
106
93
|
export function isWebGPUSupported() {
|
|
107
94
|
return typeof navigator !== 'undefined' && 'gpu' in navigator;
|
|
108
95
|
}
|
|
@@ -112,46 +99,47 @@ function toUint8View(data) {
|
|
|
112
99
|
}
|
|
113
100
|
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
114
101
|
}
|
|
115
|
-
/**
|
|
116
|
-
* High-performance WebGPU subtitle renderer for AkariSub.
|
|
117
|
-
*/
|
|
102
|
+
/** Premultiplied-alpha WebGPU compositor for subtitle bitmaps. */
|
|
118
103
|
export class WebGPURenderer {
|
|
119
104
|
device = null;
|
|
120
105
|
context = null;
|
|
106
|
+
stageContexts = new Map();
|
|
121
107
|
pipeline = null;
|
|
122
108
|
bindGroupLayout = null;
|
|
123
109
|
uniformBuffer = null;
|
|
124
110
|
imageDataBuffer = null;
|
|
125
|
-
// Texture array for batched rendering
|
|
126
111
|
textureArray = null;
|
|
127
112
|
textureArrayView = null;
|
|
128
113
|
textureArraySize = 0;
|
|
129
114
|
textureArrayWidth = 0;
|
|
130
115
|
textureArrayHeight = 0;
|
|
131
116
|
pendingDestroyTextures = [];
|
|
132
|
-
|
|
117
|
+
externalUploadCanvas = null;
|
|
118
|
+
externalUploadContext = null;
|
|
119
|
+
warnedExternalUploadFallback = false;
|
|
133
120
|
imageDataArray;
|
|
134
121
|
resolutionArray = new Float32Array(2);
|
|
135
|
-
// Bind group (recreated only when texture array changes)
|
|
136
122
|
bindGroup = null;
|
|
137
123
|
bindGroupDirty = true;
|
|
138
|
-
// Track canvas size to avoid redundant updates
|
|
139
124
|
lastCanvasWidth = 0;
|
|
140
125
|
lastCanvasHeight = 0;
|
|
126
|
+
/** Swap-chain texture format used when configuring the canvas. */
|
|
141
127
|
format = 'bgra8unorm';
|
|
142
128
|
_canvas = null;
|
|
143
129
|
_initPromise = null;
|
|
144
130
|
_initialized = false;
|
|
131
|
+
/** Allocate GPU upload buffers. Call {@linkcode init} before rendering. */
|
|
145
132
|
constructor() {
|
|
146
|
-
// Pre-allocate buffer for max images (8 floats per image: destRect + texInfo)
|
|
147
133
|
this.imageDataArray = new Float32Array(MAX_IMAGES_PER_BATCH * 8);
|
|
148
134
|
}
|
|
135
|
+
/** Acquire a GPU device and compile the subtitle shaders. */
|
|
149
136
|
async init() {
|
|
150
137
|
if (this._initPromise)
|
|
151
138
|
return this._initPromise;
|
|
152
139
|
this._initPromise = this._initDevice();
|
|
153
140
|
return this._initPromise;
|
|
154
141
|
}
|
|
142
|
+
/** @internal */
|
|
155
143
|
async _initDevice() {
|
|
156
144
|
if (!navigator.gpu) {
|
|
157
145
|
throw new Error('WebGPU not supported');
|
|
@@ -170,12 +158,10 @@ export class WebGPURenderer {
|
|
|
170
158
|
size: 16,
|
|
171
159
|
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
|
|
172
160
|
});
|
|
173
|
-
// Large storage buffer for all image data
|
|
174
161
|
this.imageDataBuffer = this.device.createBuffer({
|
|
175
162
|
size: MAX_IMAGES_PER_BATCH * 8 * 4,
|
|
176
163
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
|
|
177
164
|
});
|
|
178
|
-
// Create initial texture array with reasonable defaults
|
|
179
165
|
this.createTextureArray(256, 256, 32);
|
|
180
166
|
this.bindGroupLayout = this.device.createBindGroupLayout({
|
|
181
167
|
entries: [
|
|
@@ -218,13 +204,15 @@ export class WebGPURenderer {
|
|
|
218
204
|
// Round up to a multiple of 64: gives headroom against size jitter without
|
|
219
205
|
// power-of-2 over-allocation (a 1920x1080 blend region would otherwise
|
|
220
206
|
// round to 2048x2048 and waste ~2x memory).
|
|
207
|
+
/** @internal */
|
|
221
208
|
roundDim(n) {
|
|
222
209
|
return (Math.max(n, 64) + 63) & ~63;
|
|
223
210
|
}
|
|
224
|
-
|
|
211
|
+
/** @internal */
|
|
225
212
|
roundLayers(n) {
|
|
226
213
|
return Math.min((Math.max(n, 8) + 7) & ~7, MAX_TEXTURE_ARRAY_LAYERS);
|
|
227
214
|
}
|
|
215
|
+
/** @internal */
|
|
228
216
|
createTextureArray(width, height, layers) {
|
|
229
217
|
if (this.textureArray) {
|
|
230
218
|
this.pendingDestroyTextures.push(this.textureArray);
|
|
@@ -242,7 +230,6 @@ export class WebGPURenderer {
|
|
|
242
230
|
this.textureArrayHeight = h;
|
|
243
231
|
this.textureArraySize = l;
|
|
244
232
|
this.bindGroupDirty = true;
|
|
245
|
-
// Clear all texture layers to transparent to prevent garbage border artifacts
|
|
246
233
|
const commandEncoder = this.device.createCommandEncoder();
|
|
247
234
|
for (let layer = 0; layer < l; layer++) {
|
|
248
235
|
const layerView = this.textureArray.createView({
|
|
@@ -264,8 +251,8 @@ export class WebGPURenderer {
|
|
|
264
251
|
}
|
|
265
252
|
this.device.queue.submit([commandEncoder.finish()]);
|
|
266
253
|
}
|
|
254
|
+
/** @internal */
|
|
267
255
|
ensureTextureArray(maxWidth, maxHeight, count) {
|
|
268
|
-
// Clamp count to max layers
|
|
269
256
|
const clampedCount = Math.min(count, MAX_TEXTURE_ARRAY_LAYERS);
|
|
270
257
|
if (maxWidth <= this.textureArrayWidth &&
|
|
271
258
|
maxHeight <= this.textureArrayHeight &&
|
|
@@ -278,6 +265,7 @@ export class WebGPURenderer {
|
|
|
278
265
|
this.createTextureArray(newWidth, newHeight, newLayers);
|
|
279
266
|
return true;
|
|
280
267
|
}
|
|
268
|
+
/** @internal */
|
|
281
269
|
updateBindGroup() {
|
|
282
270
|
if (!this.bindGroupDirty || !this.device || !this.bindGroupLayout)
|
|
283
271
|
return;
|
|
@@ -291,6 +279,7 @@ export class WebGPURenderer {
|
|
|
291
279
|
});
|
|
292
280
|
this.bindGroupDirty = false;
|
|
293
281
|
}
|
|
282
|
+
/** Bind `canvas` as the primary output and size the swap chain. */
|
|
294
283
|
async setCanvas(canvas, width, height) {
|
|
295
284
|
await this.init();
|
|
296
285
|
if (!this.device)
|
|
@@ -316,6 +305,44 @@ export class WebGPURenderer {
|
|
|
316
305
|
this.lastCanvasWidth = width;
|
|
317
306
|
this.lastCanvasHeight = height;
|
|
318
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Render a prepared full-frame subtitle snapshot into its own WebGPU canvas.
|
|
310
|
+
* Keeping prepared frames on the selected backend avoids switching to a 2D
|
|
311
|
+
* compositor during playback (and lets Chromium keep one GPU overlay stack).
|
|
312
|
+
*/
|
|
313
|
+
renderBitmapToCanvas(canvas, bitmap, width, height) {
|
|
314
|
+
if (!this.device || !this.pipeline || width <= 0 || height <= 0)
|
|
315
|
+
return false;
|
|
316
|
+
canvas.width = width;
|
|
317
|
+
canvas.height = height;
|
|
318
|
+
let context = this.stageContexts.get(canvas);
|
|
319
|
+
if (!context) {
|
|
320
|
+
context = canvas.getContext('webgpu');
|
|
321
|
+
if (!context)
|
|
322
|
+
return false;
|
|
323
|
+
context.configure({
|
|
324
|
+
device: this.device,
|
|
325
|
+
format: this.format,
|
|
326
|
+
alphaMode: 'premultiplied'
|
|
327
|
+
});
|
|
328
|
+
this.stageContexts.set(canvas, context);
|
|
329
|
+
}
|
|
330
|
+
return this.renderBitmapsToContext([{ image: bitmap, x: 0, y: 0 }], context, width, height);
|
|
331
|
+
}
|
|
332
|
+
/** Drop a staging canvas previously used with {@linkcode renderBitmapToCanvas}. */
|
|
333
|
+
releaseCanvas(canvas) {
|
|
334
|
+
const context = this.stageContexts.get(canvas);
|
|
335
|
+
if (!context)
|
|
336
|
+
return;
|
|
337
|
+
try {
|
|
338
|
+
context.unconfigure();
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Device loss can invalidate a context before DOM-stage cleanup.
|
|
342
|
+
}
|
|
343
|
+
this.stageContexts.delete(canvas);
|
|
344
|
+
}
|
|
345
|
+
/** Resize the primary canvas and uniform resolution. */
|
|
319
346
|
updateSize(width, height) {
|
|
320
347
|
if (!this.device || !this._canvas || width <= 0 || height <= 0)
|
|
321
348
|
return;
|
|
@@ -329,22 +356,30 @@ export class WebGPURenderer {
|
|
|
329
356
|
this.lastCanvasWidth = width;
|
|
330
357
|
this.lastCanvasHeight = height;
|
|
331
358
|
}
|
|
332
|
-
/**
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
359
|
+
/** Composite `images` onto the primary canvas. Returns `false` if the context is missing. */
|
|
360
|
+
renderBitmaps(images, canvasWidth, canvasHeight) {
|
|
361
|
+
if (!this.context)
|
|
362
|
+
return false;
|
|
363
|
+
return this.renderBitmapsToContext(images, this.context, canvasWidth, canvasHeight);
|
|
364
|
+
}
|
|
365
|
+
/** Wait until submitted GPU work has finished. */
|
|
366
|
+
submittedWorkDone() {
|
|
367
|
+
return this.device?.queue.onSubmittedWorkDone() ?? Promise.resolve();
|
|
368
|
+
}
|
|
369
|
+
/** @internal */
|
|
370
|
+
renderBitmapsToContext(images, context, canvasWidth, canvasHeight) {
|
|
371
|
+
if (!this.device || !this.pipeline || canvasWidth <= 0 || canvasHeight <= 0)
|
|
372
|
+
return false;
|
|
373
|
+
this.resolutionArray[0] = canvasWidth;
|
|
374
|
+
this.resolutionArray[1] = canvasHeight;
|
|
375
|
+
this.device.queue.writeBuffer(this.uniformBuffer, 0, this.resolutionArray);
|
|
339
376
|
const len = images.length;
|
|
340
377
|
if (len === 0) {
|
|
341
|
-
this.
|
|
342
|
-
return;
|
|
378
|
+
return this.clearContext(context);
|
|
343
379
|
}
|
|
344
|
-
const currentTexture =
|
|
380
|
+
const currentTexture = context.getCurrentTexture();
|
|
345
381
|
if (currentTexture.width === 0 || currentTexture.height === 0)
|
|
346
|
-
return;
|
|
347
|
-
// Single pass: find max dimensions and count valid images
|
|
382
|
+
return false;
|
|
348
383
|
let maxW = 0, maxH = 0, validCount = 0;
|
|
349
384
|
for (let i = 0; i < len; i++) {
|
|
350
385
|
const { image } = images[i];
|
|
@@ -358,10 +393,8 @@ export class WebGPURenderer {
|
|
|
358
393
|
}
|
|
359
394
|
}
|
|
360
395
|
if (validCount === 0) {
|
|
361
|
-
this.
|
|
362
|
-
return;
|
|
396
|
+
return this.clearContext(context);
|
|
363
397
|
}
|
|
364
|
-
// Ensure texture array is large enough (capped at MAX_TEXTURE_ARRAY_LAYERS)
|
|
365
398
|
const batchSize = Math.min(validCount, MAX_TEXTURE_ARRAY_LAYERS);
|
|
366
399
|
this.ensureTextureArray(maxW, maxH, batchSize);
|
|
367
400
|
this.updateBindGroup();
|
|
@@ -370,21 +403,19 @@ export class WebGPURenderer {
|
|
|
370
403
|
const textureArray = this.textureArray;
|
|
371
404
|
const imageDataArray = this.imageDataArray;
|
|
372
405
|
const textureView = currentTexture.createView();
|
|
373
|
-
// Process images in batches if needed
|
|
374
406
|
let imageIndex = 0;
|
|
375
407
|
let isFirstBatch = true;
|
|
408
|
+
let renderedAnyBatch = false;
|
|
376
409
|
while (imageIndex < len) {
|
|
377
410
|
let texIndex = 0;
|
|
378
|
-
// Upload batch of textures
|
|
379
411
|
while (imageIndex < len && texIndex < MAX_TEXTURE_ARRAY_LAYERS) {
|
|
380
412
|
const img = images[imageIndex++];
|
|
381
413
|
const bitmap = img.image;
|
|
382
414
|
const w = bitmap.width, h = bitmap.height;
|
|
383
415
|
if (w <= 0 || h <= 0)
|
|
384
416
|
continue;
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
// Fill pre-allocated array
|
|
417
|
+
if (!this.uploadImageBitmap(texIndex, bitmap, w, h))
|
|
418
|
+
continue;
|
|
388
419
|
const offset = texIndex << 3;
|
|
389
420
|
imageDataArray[offset] = img.x;
|
|
390
421
|
imageDataArray[offset + 1] = img.y;
|
|
@@ -398,7 +429,6 @@ export class WebGPURenderer {
|
|
|
398
429
|
}
|
|
399
430
|
if (texIndex === 0)
|
|
400
431
|
continue;
|
|
401
|
-
// Upload buffer and draw batch
|
|
402
432
|
queue.writeBuffer(this.imageDataBuffer, 0, imageDataArray.buffer, 0, texIndex << 5);
|
|
403
433
|
const commandEncoder = device.createCommandEncoder();
|
|
404
434
|
const renderPass = commandEncoder.beginRenderPass({
|
|
@@ -417,25 +447,27 @@ export class WebGPURenderer {
|
|
|
417
447
|
renderPass.end();
|
|
418
448
|
queue.submit([commandEncoder.finish()]);
|
|
419
449
|
isFirstBatch = false;
|
|
450
|
+
renderedAnyBatch = true;
|
|
420
451
|
}
|
|
452
|
+
if (!renderedAnyBatch)
|
|
453
|
+
this.clearContext(context);
|
|
421
454
|
this.cleanupPendingTextures();
|
|
455
|
+
return renderedAnyBatch;
|
|
422
456
|
}
|
|
423
|
-
/**
|
|
424
|
-
* Render from raw ArrayBuffer data (non-async render mode)
|
|
425
|
-
* Handles batching when image count exceeds MAX_TEXTURE_ARRAY_LAYERS
|
|
426
|
-
*/
|
|
457
|
+
/** Composite {@linkcode RenderImage} planes onto the primary canvas. */
|
|
427
458
|
render(images, _canvasWidth, _canvasHeight) {
|
|
428
459
|
if (!this.device || !this.context || !this.pipeline)
|
|
429
|
-
return;
|
|
460
|
+
return false;
|
|
461
|
+
this.resolutionArray[0] = _canvasWidth;
|
|
462
|
+
this.resolutionArray[1] = _canvasHeight;
|
|
463
|
+
this.device.queue.writeBuffer(this.uniformBuffer, 0, this.resolutionArray);
|
|
430
464
|
const len = images.length;
|
|
431
465
|
if (len === 0) {
|
|
432
|
-
this.clear();
|
|
433
|
-
return;
|
|
466
|
+
return this.clear();
|
|
434
467
|
}
|
|
435
468
|
const currentTexture = this.context.getCurrentTexture();
|
|
436
469
|
if (currentTexture.width === 0 || currentTexture.height === 0)
|
|
437
|
-
return;
|
|
438
|
-
// Single pass: find max dimensions and count valid images
|
|
470
|
+
return false;
|
|
439
471
|
let maxW = 0, maxH = 0, validCount = 0;
|
|
440
472
|
for (let i = 0; i < len; i++) {
|
|
441
473
|
const { w, h } = images[i];
|
|
@@ -448,10 +480,8 @@ export class WebGPURenderer {
|
|
|
448
480
|
}
|
|
449
481
|
}
|
|
450
482
|
if (validCount === 0) {
|
|
451
|
-
this.clear();
|
|
452
|
-
return;
|
|
483
|
+
return this.clear();
|
|
453
484
|
}
|
|
454
|
-
// Ensure texture array is large enough (capped at MAX_TEXTURE_ARRAY_LAYERS)
|
|
455
485
|
const batchSize = Math.min(validCount, MAX_TEXTURE_ARRAY_LAYERS);
|
|
456
486
|
this.ensureTextureArray(maxW, maxH, batchSize);
|
|
457
487
|
this.updateBindGroup();
|
|
@@ -460,26 +490,29 @@ export class WebGPURenderer {
|
|
|
460
490
|
const textureArray = this.textureArray;
|
|
461
491
|
const imageDataArray = this.imageDataArray;
|
|
462
492
|
const textureView = currentTexture.createView();
|
|
463
|
-
// Process images in batches if needed
|
|
464
493
|
let imageIndex = 0;
|
|
465
494
|
let isFirstBatch = true;
|
|
495
|
+
let renderedAnyBatch = false;
|
|
466
496
|
while (imageIndex < len) {
|
|
467
497
|
let texIndex = 0;
|
|
468
|
-
// Upload batch of textures
|
|
469
498
|
while (imageIndex < len && texIndex < MAX_TEXTURE_ARRAY_LAYERS) {
|
|
470
499
|
const img = images[imageIndex++];
|
|
471
500
|
const w = img.w, h = img.h;
|
|
472
501
|
if (w <= 0 || h <= 0)
|
|
473
502
|
continue;
|
|
474
|
-
// Upload texture data
|
|
475
503
|
const imgData = img.image;
|
|
476
504
|
if (imgData instanceof ImageBitmap) {
|
|
477
|
-
|
|
505
|
+
if (!this.uploadImageBitmap(texIndex, imgData, w, h))
|
|
506
|
+
continue;
|
|
478
507
|
}
|
|
479
|
-
else if (imgData instanceof ArrayBuffer ||
|
|
508
|
+
else if (imgData instanceof ArrayBuffer ||
|
|
509
|
+
imgData instanceof Uint8Array ||
|
|
510
|
+
imgData instanceof Uint8ClampedArray) {
|
|
480
511
|
this.uploadTextureData(texIndex, imgData, w, h);
|
|
481
512
|
}
|
|
482
|
-
|
|
513
|
+
else {
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
483
516
|
const offset = texIndex << 3;
|
|
484
517
|
imageDataArray[offset] = img.x;
|
|
485
518
|
imageDataArray[offset + 1] = img.y;
|
|
@@ -493,7 +526,6 @@ export class WebGPURenderer {
|
|
|
493
526
|
}
|
|
494
527
|
if (texIndex === 0)
|
|
495
528
|
continue;
|
|
496
|
-
// Upload buffer and draw batch
|
|
497
529
|
queue.writeBuffer(this.imageDataBuffer, 0, imageDataArray.buffer, 0, texIndex << 5);
|
|
498
530
|
const commandEncoder = device.createCommandEncoder();
|
|
499
531
|
const renderPass = commandEncoder.beginRenderPass({
|
|
@@ -512,12 +544,60 @@ export class WebGPURenderer {
|
|
|
512
544
|
renderPass.end();
|
|
513
545
|
queue.submit([commandEncoder.finish()]);
|
|
514
546
|
isFirstBatch = false;
|
|
547
|
+
renderedAnyBatch = true;
|
|
515
548
|
}
|
|
549
|
+
if (!renderedAnyBatch)
|
|
550
|
+
this.clear();
|
|
516
551
|
this.cleanupPendingTextures();
|
|
552
|
+
return renderedAnyBatch;
|
|
517
553
|
}
|
|
554
|
+
/** @internal */
|
|
555
|
+
uploadImageBitmap(layerIndex, bitmap, width, height) {
|
|
556
|
+
try {
|
|
557
|
+
this.device.queue.copyExternalImageToTexture({ source: bitmap, flipY: false }, { texture: this.textureArray, origin: [0, 0, layerIndex], premultipliedAlpha: false }, { width, height });
|
|
558
|
+
return true;
|
|
559
|
+
}
|
|
560
|
+
catch (externalUploadError) {
|
|
561
|
+
try {
|
|
562
|
+
let canvas = this.externalUploadCanvas;
|
|
563
|
+
if (!canvas) {
|
|
564
|
+
canvas =
|
|
565
|
+
typeof OffscreenCanvas !== 'undefined'
|
|
566
|
+
? new OffscreenCanvas(width, height)
|
|
567
|
+
: document.createElement('canvas');
|
|
568
|
+
this.externalUploadCanvas = canvas;
|
|
569
|
+
}
|
|
570
|
+
if (canvas.width !== width)
|
|
571
|
+
canvas.width = width;
|
|
572
|
+
if (canvas.height !== height)
|
|
573
|
+
canvas.height = height;
|
|
574
|
+
let context = this.externalUploadContext;
|
|
575
|
+
if (!context) {
|
|
576
|
+
context = canvas.getContext('2d', { alpha: true, willReadFrequently: true });
|
|
577
|
+
this.externalUploadContext = context;
|
|
578
|
+
}
|
|
579
|
+
if (!context)
|
|
580
|
+
return false;
|
|
581
|
+
context.clearRect(0, 0, width, height);
|
|
582
|
+
context.drawImage(bitmap, 0, 0);
|
|
583
|
+
this.uploadTextureData(layerIndex, context.getImageData(0, 0, width, height).data, width, height);
|
|
584
|
+
if (!this.warnedExternalUploadFallback) {
|
|
585
|
+
this.warnedExternalUploadFallback = true;
|
|
586
|
+
console.warn('[AkariSub] WebGPU external-image upload failed; using RGBA fallback.', externalUploadError);
|
|
587
|
+
}
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
590
|
+
catch (fallbackError) {
|
|
591
|
+
console.warn('[AkariSub] Failed to upload subtitle bitmap to WebGPU.', fallbackError);
|
|
592
|
+
return false;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
/** @internal */
|
|
518
597
|
uploadTextureData(layerIndex, rgbaBuffer, width, height) {
|
|
519
598
|
this.device.queue.writeTexture({ texture: this.textureArray, origin: [0, 0, layerIndex] }, toUint8View(rgbaBuffer), { bytesPerRow: width * 4 }, { width, height });
|
|
520
599
|
}
|
|
600
|
+
/** @internal */
|
|
521
601
|
cleanupPendingTextures() {
|
|
522
602
|
const pending = this.pendingDestroyTextures;
|
|
523
603
|
const len = pending.length;
|
|
@@ -528,13 +608,20 @@ export class WebGPURenderer {
|
|
|
528
608
|
}
|
|
529
609
|
pending.length = 0;
|
|
530
610
|
}
|
|
611
|
+
/** Clear the primary canvas to transparent black. */
|
|
531
612
|
clear() {
|
|
532
613
|
if (!this.device || !this.context)
|
|
533
|
-
return;
|
|
614
|
+
return false;
|
|
615
|
+
return this.clearContext(this.context);
|
|
616
|
+
}
|
|
617
|
+
/** @internal */
|
|
618
|
+
clearContext(context) {
|
|
619
|
+
if (!this.device)
|
|
620
|
+
return false;
|
|
534
621
|
try {
|
|
535
|
-
const currentTexture =
|
|
622
|
+
const currentTexture = context.getCurrentTexture();
|
|
536
623
|
if (currentTexture.width === 0 || currentTexture.height === 0)
|
|
537
|
-
return;
|
|
624
|
+
return false;
|
|
538
625
|
const commandEncoder = this.device.createCommandEncoder();
|
|
539
626
|
const renderPass = commandEncoder.beginRenderPass({
|
|
540
627
|
colorAttachments: [
|
|
@@ -548,16 +635,28 @@ export class WebGPURenderer {
|
|
|
548
635
|
});
|
|
549
636
|
renderPass.end();
|
|
550
637
|
this.device.queue.submit([commandEncoder.finish()]);
|
|
638
|
+
return true;
|
|
551
639
|
}
|
|
552
640
|
catch {
|
|
553
|
-
|
|
641
|
+
return false;
|
|
554
642
|
}
|
|
555
643
|
}
|
|
644
|
+
/** True after {@linkcode init} has completed successfully. */
|
|
556
645
|
get initialized() {
|
|
557
646
|
return this._initialized;
|
|
558
647
|
}
|
|
648
|
+
/** Release GPU resources and unconfigure all canvases. */
|
|
559
649
|
destroy() {
|
|
560
650
|
this.cleanupPendingTextures();
|
|
651
|
+
for (const context of this.stageContexts.values()) {
|
|
652
|
+
try {
|
|
653
|
+
context.unconfigure();
|
|
654
|
+
}
|
|
655
|
+
catch {
|
|
656
|
+
// Context can already be invalid after device loss.
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
this.stageContexts.clear();
|
|
561
660
|
this.textureArray?.destroy();
|
|
562
661
|
this.textureArray = null;
|
|
563
662
|
this.textureArrayView = null;
|
|
@@ -570,6 +669,9 @@ export class WebGPURenderer {
|
|
|
570
669
|
this.device = null;
|
|
571
670
|
this.context = null;
|
|
572
671
|
this._canvas = null;
|
|
672
|
+
this.externalUploadCanvas = null;
|
|
673
|
+
this.externalUploadContext = null;
|
|
674
|
+
this.warnedExternalUploadFallback = false;
|
|
573
675
|
this._initialized = false;
|
|
574
676
|
this._initPromise = null;
|
|
575
677
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-renderer.js","sourceRoot":"","sources":["../../src/ts/webgpu-renderer.ts"],"names":[],"mappings":"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"}
|