jassub 2.3.3 → 2.4.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.
@@ -0,0 +1,361 @@
1
+ // fallback for browsers that don't support WebGL2
2
+ import { colorMatrixConversionMap, IDENTITY_MATRIX, IS_FIREFOX, SHOULD_REFERENCE_MEMORY } from "../util.js";
3
+ // GLSL ES 3.0 Vertex Shader with Instancing
4
+ const VERTEX_SHADER = /* glsl */ `#version 300 es
5
+ precision mediump float;
6
+
7
+ const vec2 QUAD_POSITIONS[6] = vec2[6](
8
+ vec2(0.0, 0.0),
9
+ vec2(1.0, 0.0),
10
+ vec2(0.0, 1.0),
11
+ vec2(1.0, 0.0),
12
+ vec2(1.0, 1.0),
13
+ vec2(0.0, 1.0)
14
+ );
15
+
16
+ uniform vec2 u_resolution;
17
+
18
+ // Instance attributes
19
+ in vec4 a_destRect; // x, y, w, h
20
+ in vec4 a_color; // r, g, b, a
21
+ in float a_texLayer;
22
+
23
+ flat out vec2 v_destXY;
24
+ flat out vec4 v_color;
25
+ flat out vec2 v_texSize;
26
+ flat out float v_texLayer;
27
+
28
+ void main() {
29
+ vec2 quadPos = QUAD_POSITIONS[gl_VertexID];
30
+ vec2 pixelPos = a_destRect.xy + quadPos * a_destRect.zw;
31
+ vec2 clipPos = (pixelPos / u_resolution) * 2.0 - 1.0;
32
+ clipPos.y = -clipPos.y;
33
+
34
+ gl_Position = vec4(clipPos, 0.0, 1.0);
35
+ v_destXY = a_destRect.xy;
36
+ v_color = a_color;
37
+ v_texSize = a_destRect.zw;
38
+ v_texLayer = a_texLayer;
39
+ }
40
+ `;
41
+ // GLSL ES 3.0 Fragment Shader - use texelFetch for pixel-perfect sampling
42
+ const FRAGMENT_SHADER = /* glsl */ `#version 300 es
43
+ precision mediump float;
44
+ precision mediump sampler2DArray;
45
+
46
+ uniform sampler2DArray u_texArray;
47
+ uniform mat3 u_colorMatrix;
48
+ uniform vec2 u_resolution;
49
+
50
+ flat in vec2 v_destXY;
51
+ flat in vec4 v_color;
52
+ flat in vec2 v_texSize;
53
+ flat in float v_texLayer;
54
+
55
+ out vec4 fragColor;
56
+
57
+ void main() {
58
+ // Flip Y: WebGL's gl_FragCoord.y is 0 at bottom, but destXY.y is from top
59
+ vec2 fragPos = vec2(gl_FragCoord.x, u_resolution.y - gl_FragCoord.y);
60
+
61
+ // Calculate local position within the quad (screen coords)
62
+ vec2 localPos = fragPos - v_destXY;
63
+
64
+ // Convert to integer texel coordinates for texelFetch
65
+ ivec2 texCoord = ivec2(floor(localPos));
66
+
67
+ // Bounds check (prevents out-of-bounds access)
68
+ ivec2 texSizeI = ivec2(v_texSize);
69
+ if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
70
+ discard;
71
+ }
72
+
73
+ // texelFetch: integer coords, no interpolation, no precision issues
74
+ float mask = texelFetch(u_texArray, ivec3(texCoord, int(v_texLayer)), 0).r;
75
+
76
+ // Apply color matrix conversion (identity if no conversion needed)
77
+ vec3 correctedColor = u_colorMatrix * v_color.rgb;
78
+
79
+ // libass color alpha: 0 = opaque, 255 = transparent (inverted)
80
+ float colorAlpha = 1.0 - v_color.a;
81
+
82
+ // Final alpha = colorAlpha * mask
83
+ float a = colorAlpha * mask;
84
+
85
+ // Premultiplied alpha output
86
+ fragColor = vec4(correctedColor * a, a);
87
+ }
88
+ `;
89
+ // Texture array configuration
90
+ const TEX_ARRAY_SIZE = 64; // Fixed layer count
91
+ const TEX_INITIAL_SIZE = 256; // Initial width/height
92
+ const MAX_INSTANCES = 256; // Maximum instances per draw call
93
+ export class WebGL2Renderer {
94
+ canvas = null;
95
+ gl = null;
96
+ program = null;
97
+ vao = null;
98
+ // Uniform locations
99
+ u_resolution = null;
100
+ u_texArray = null;
101
+ u_colorMatrix = null;
102
+ // Instance attribute buffers
103
+ instanceDestRectBuffer = null;
104
+ instanceColorBuffer = null;
105
+ instanceTexLayerBuffer = null;
106
+ // Instance data arrays
107
+ instanceDestRectData;
108
+ instanceColorData;
109
+ instanceTexLayerData;
110
+ texArray = null;
111
+ texArrayWidth = 0;
112
+ texArrayHeight = 0;
113
+ colorMatrix = IDENTITY_MATRIX;
114
+ constructor() {
115
+ this.instanceDestRectData = new Float32Array(MAX_INSTANCES * 4);
116
+ this.instanceColorData = new Float32Array(MAX_INSTANCES * 4);
117
+ this.instanceTexLayerData = new Float32Array(MAX_INSTANCES);
118
+ }
119
+ _scheduledResize;
120
+ resizeCanvas(width, height) {
121
+ // WebGL2 doesn't allow 0-sized canvases
122
+ if (width <= 0 || height <= 0)
123
+ return;
124
+ this._scheduledResize = { width, height };
125
+ }
126
+ setCanvas(canvas) {
127
+ this.canvas = canvas;
128
+ this.gl = canvas.getContext('webgl2', {
129
+ alpha: true,
130
+ premultipliedAlpha: true,
131
+ antialias: false,
132
+ depth: false,
133
+ preserveDrawingBuffer: false,
134
+ stencil: false,
135
+ desynchronized: true,
136
+ powerPreference: 'high-performance'
137
+ });
138
+ if (!this.gl) {
139
+ throw new Error('Could not get WebGL2 context');
140
+ }
141
+ // Create shaders
142
+ const vertexShader = this.createShader(this.gl.VERTEX_SHADER, VERTEX_SHADER);
143
+ const fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
144
+ if (!vertexShader || !fragmentShader) {
145
+ throw new Error('Failed to create shaders');
146
+ }
147
+ // Create program
148
+ this.program = this.gl.createProgram();
149
+ this.gl.attachShader(this.program, vertexShader);
150
+ this.gl.attachShader(this.program, fragmentShader);
151
+ this.gl.linkProgram(this.program);
152
+ if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) {
153
+ const info = this.gl.getProgramInfoLog(this.program);
154
+ throw new Error('Failed to link program: ' + info);
155
+ }
156
+ this.gl.deleteShader(vertexShader);
157
+ this.gl.deleteShader(fragmentShader);
158
+ // Get uniform locations
159
+ this.u_resolution = this.gl.getUniformLocation(this.program, 'u_resolution');
160
+ this.u_texArray = this.gl.getUniformLocation(this.program, 'u_texArray');
161
+ this.u_colorMatrix = this.gl.getUniformLocation(this.program, 'u_colorMatrix');
162
+ // Create instance attribute buffers
163
+ this.instanceDestRectBuffer = this.gl.createBuffer();
164
+ this.instanceColorBuffer = this.gl.createBuffer();
165
+ this.instanceTexLayerBuffer = this.gl.createBuffer();
166
+ // Create a VAO (required for WebGL2)
167
+ this.vao = this.gl.createVertexArray();
168
+ this.gl.bindVertexArray(this.vao);
169
+ // Setup instance attributes
170
+ const destRectLoc = this.gl.getAttribLocation(this.program, 'a_destRect');
171
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer);
172
+ this.gl.enableVertexAttribArray(destRectLoc);
173
+ this.gl.vertexAttribPointer(destRectLoc, 4, this.gl.FLOAT, false, 0, 0);
174
+ this.gl.vertexAttribDivisor(destRectLoc, 1);
175
+ const colorLoc = this.gl.getAttribLocation(this.program, 'a_color');
176
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer);
177
+ this.gl.enableVertexAttribArray(colorLoc);
178
+ this.gl.vertexAttribPointer(colorLoc, 4, this.gl.FLOAT, false, 0, 0);
179
+ this.gl.vertexAttribDivisor(colorLoc, 1);
180
+ const texLayerLoc = this.gl.getAttribLocation(this.program, 'a_texLayer');
181
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer);
182
+ this.gl.enableVertexAttribArray(texLayerLoc);
183
+ this.gl.vertexAttribPointer(texLayerLoc, 1, this.gl.FLOAT, false, 0, 0);
184
+ this.gl.vertexAttribDivisor(texLayerLoc, 1);
185
+ // Set up blending for premultiplied alpha
186
+ this.gl.enable(this.gl.BLEND);
187
+ this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
188
+ // Use the program
189
+ this.gl.useProgram(this.program);
190
+ // Set texture unit
191
+ this.gl.uniform1i(this.u_texArray, 0);
192
+ // Set initial color matrix
193
+ this.gl.uniformMatrix3fv(this.u_colorMatrix, false, this.colorMatrix);
194
+ // Set one-time GL state
195
+ this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);
196
+ this.gl.clearColor(0, 0, 0, 0);
197
+ this.gl.activeTexture(this.gl.TEXTURE0);
198
+ // Create initial texture array
199
+ this.createTexArray(TEX_INITIAL_SIZE, TEX_INITIAL_SIZE);
200
+ }
201
+ createShader(type, source) {
202
+ const shader = this.gl.createShader(type);
203
+ this.gl.shaderSource(shader, source);
204
+ this.gl.compileShader(shader);
205
+ if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {
206
+ const info = this.gl.getShaderInfoLog(shader);
207
+ console.log(info);
208
+ this.gl.deleteShader(shader);
209
+ return null;
210
+ }
211
+ return shader;
212
+ }
213
+ // Set the color matrix for color space conversion.
214
+ // Pass null or undefined to use identity (no conversion).
215
+ setColorMatrix(subtitleColorSpace, videoColorSpace) {
216
+ this.colorMatrix = (subtitleColorSpace && videoColorSpace && colorMatrixConversionMap[subtitleColorSpace]?.[videoColorSpace]) ?? IDENTITY_MATRIX;
217
+ if (this.gl && this.u_colorMatrix && this.program) {
218
+ this.gl.useProgram(this.program);
219
+ this.gl.uniformMatrix3fv(this.u_colorMatrix, false, this.colorMatrix);
220
+ }
221
+ }
222
+ createTexArray(width, height) {
223
+ if (this.texArray) {
224
+ this.gl.deleteTexture(this.texArray);
225
+ }
226
+ this.texArray = this.gl.createTexture();
227
+ this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, this.texArray);
228
+ // Allocate storage for texture array
229
+ this.gl.texImage3D(this.gl.TEXTURE_2D_ARRAY, 0, this.gl.R8, width, height, TEX_ARRAY_SIZE, 0, this.gl.RED, this.gl.UNSIGNED_BYTE, null // Firefox cries about uninitialized data, but is slower with zero initialized data...
230
+ );
231
+ // Set texture parameters (no filtering needed for texelFetch, but set anyway)
232
+ this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);
233
+ this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
234
+ this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
235
+ this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
236
+ this.texArrayWidth = width;
237
+ this.texArrayHeight = height;
238
+ }
239
+ render(images, heap) {
240
+ if (!this.gl || !this.program || !this.vao || !this.texArray)
241
+ return;
242
+ // HACK 1 and 2 [see above for explanation]
243
+ if ((self.HEAPU8RAW.buffer !== self.WASMMEMORY.buffer) || SHOULD_REFERENCE_MEMORY) {
244
+ heap = self.HEAPU8RAW = new Uint8Array(self.WASMMEMORY.buffer);
245
+ }
246
+ // we scheduled a resize because changing the canvas size clears it, and we don't want it to flicker
247
+ // so we do it here, right before rendering
248
+ if (this._scheduledResize) {
249
+ const { width, height } = this._scheduledResize;
250
+ this._scheduledResize = undefined;
251
+ this.canvas.width = width;
252
+ this.canvas.height = height;
253
+ // Update viewport and resolution uniform
254
+ this.gl.viewport(0, 0, width, height);
255
+ this.gl.uniform2f(this.u_resolution, width, height);
256
+ }
257
+ else {
258
+ // Clear canvas
259
+ this.gl.clear(this.gl.COLOR_BUFFER_BIT);
260
+ }
261
+ // Find max dimensions needed and filter valid images
262
+ let maxW = this.texArrayWidth;
263
+ let maxH = this.texArrayHeight;
264
+ const validImages = [];
265
+ for (const img of images) {
266
+ if (img.w <= 0 || img.h <= 0)
267
+ continue;
268
+ validImages.push(img);
269
+ if (img.w > maxW)
270
+ maxW = img.w;
271
+ if (img.h > maxH)
272
+ maxH = img.h;
273
+ }
274
+ if (validImages.length === 0)
275
+ return;
276
+ // Resize texture array if needed
277
+ if (maxW > this.texArrayWidth || maxH > this.texArrayHeight) {
278
+ this.createTexArray(maxW, maxH);
279
+ }
280
+ // Process images in chunks that fit within texture array size
281
+ const batchSize = Math.min(TEX_ARRAY_SIZE, MAX_INSTANCES);
282
+ for (let batchStart = 0; batchStart < validImages.length; batchStart += batchSize) {
283
+ const batchEnd = Math.min(batchStart + batchSize, validImages.length);
284
+ let instanceCount = 0;
285
+ // Upload textures for this batch
286
+ for (let i = batchStart; i < batchEnd; i++) {
287
+ const img = validImages[i];
288
+ const layer = instanceCount;
289
+ // Upload bitmap data to texture array layer
290
+ this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, img.stride);
291
+ if (IS_FIREFOX) {
292
+ // HACK 3 [see above for explanation]
293
+ const sourceView = new Uint8Array(heap.buffer, img.bitmap, img.stride * img.h);
294
+ const bitmapData = new Uint8Array(sourceView);
295
+ this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
296
+ img.w, img.h, 1, // depth (1 layer)
297
+ this.gl.RED, this.gl.UNSIGNED_BYTE, bitmapData);
298
+ }
299
+ else {
300
+ this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
301
+ img.w, img.h, 1, // depth (1 layer)
302
+ this.gl.RED, this.gl.UNSIGNED_BYTE, heap, img.bitmap);
303
+ }
304
+ // Fill instance data
305
+ const idx = instanceCount * 4;
306
+ this.instanceDestRectData[idx] = img.dst_x;
307
+ this.instanceDestRectData[idx + 1] = img.dst_y;
308
+ this.instanceDestRectData[idx + 2] = img.w;
309
+ this.instanceDestRectData[idx + 3] = img.h;
310
+ this.instanceColorData[idx] = ((img.color >>> 24) & 0xFF) / 255;
311
+ this.instanceColorData[idx + 1] = ((img.color >>> 16) & 0xFF) / 255;
312
+ this.instanceColorData[idx + 2] = ((img.color >>> 8) & 0xFF) / 255;
313
+ this.instanceColorData[idx + 3] = (img.color & 0xFF) / 255;
314
+ this.instanceTexLayerData[instanceCount] = layer;
315
+ instanceCount++;
316
+ }
317
+ this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, 0);
318
+ if (instanceCount === 0)
319
+ continue;
320
+ // Upload instance data to buffers
321
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer);
322
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceDestRectData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW);
323
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer);
324
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceColorData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW);
325
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer);
326
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceTexLayerData.subarray(0, instanceCount), this.gl.DYNAMIC_DRAW);
327
+ // Single instanced draw call
328
+ this.gl.drawArraysInstanced(this.gl.TRIANGLES, 0, 6, instanceCount);
329
+ }
330
+ }
331
+ destroy() {
332
+ if (this.gl) {
333
+ if (this.texArray) {
334
+ this.gl.deleteTexture(this.texArray);
335
+ this.texArray = null;
336
+ }
337
+ if (this.instanceDestRectBuffer) {
338
+ this.gl.deleteBuffer(this.instanceDestRectBuffer);
339
+ this.instanceDestRectBuffer = null;
340
+ }
341
+ if (this.instanceColorBuffer) {
342
+ this.gl.deleteBuffer(this.instanceColorBuffer);
343
+ this.instanceColorBuffer = null;
344
+ }
345
+ if (this.instanceTexLayerBuffer) {
346
+ this.gl.deleteBuffer(this.instanceTexLayerBuffer);
347
+ this.instanceTexLayerBuffer = null;
348
+ }
349
+ if (this.vao) {
350
+ this.gl.deleteVertexArray(this.vao);
351
+ this.vao = null;
352
+ }
353
+ if (this.program) {
354
+ this.gl.deleteProgram(this.program);
355
+ this.program = null;
356
+ }
357
+ this.gl = null;
358
+ }
359
+ }
360
+ }
361
+ //# sourceMappingURL=webgl2-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2-renderer.js","sourceRoot":"","sources":["../../../src/worker/renderers/webgl2-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ASSImage } from '../util.ts';
2
+ export declare const colorMatrixConversionMap: {
3
+ readonly BT601: {
4
+ readonly BT709: Float32Array<ArrayBuffer>;
5
+ readonly BT601: Float32Array<ArrayBuffer>;
6
+ };
7
+ readonly BT709: {
8
+ readonly BT601: Float32Array<ArrayBuffer>;
9
+ readonly BT709: Float32Array<ArrayBuffer>;
10
+ };
11
+ readonly FCC: {
12
+ readonly BT709: Float32Array<ArrayBuffer>;
13
+ readonly BT601: Float32Array<ArrayBuffer>;
14
+ };
15
+ readonly SMPTE240M: {
16
+ readonly BT709: Float32Array<ArrayBuffer>;
17
+ readonly BT601: Float32Array<ArrayBuffer>;
18
+ };
19
+ };
20
+ export type ColorSpace = keyof typeof colorMatrixConversionMap;
21
+ interface TextureInfo {
22
+ texture: GPUTexture;
23
+ view: GPUTextureView;
24
+ width: number;
25
+ height: number;
26
+ }
27
+ export declare class WebGPURenderer {
28
+ device: GPUDevice | null;
29
+ context: GPUCanvasContext | null;
30
+ pipeline: GPURenderPipeline | null;
31
+ bindGroupLayout: GPUBindGroupLayout | null;
32
+ uniformBuffer: GPUBuffer | null;
33
+ colorMatrixBuffer: GPUBuffer | null;
34
+ imageDataBuffers: GPUBuffer[];
35
+ textures: TextureInfo[];
36
+ pendingDestroyTextures: GPUTexture[];
37
+ format: GPUTextureFormat;
38
+ constructor(device: GPUDevice);
39
+ setCanvas(canvas: OffscreenCanvas, width: number, height: number): void;
40
+ /**
41
+ * Set the color matrix for color space conversion.
42
+ * Pass null or undefined to use identity (no conversion).
43
+ * Matrix should be a pre-padded Float32Array with 12 values (3 columns × 4 floats each).
44
+ */
45
+ setColorMatrix(subtitleColorSpace?: 'BT601' | 'BT709' | 'SMPTE240M' | 'FCC', videoColorSpace?: 'BT601' | 'BT709'): void;
46
+ createTextureInfo(width: number, height: number): TextureInfo;
47
+ render(images: ASSImage[], heap: Uint8Array): void;
48
+ destroy(): void;
49
+ }
50
+ export {};