jassub 2.2.4 → 2.2.5
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.
|
@@ -23,21 +23,21 @@ export declare class WebGL2Renderer {
|
|
|
23
23
|
program: WebGLProgram | null;
|
|
24
24
|
vao: WebGLVertexArrayObject | null;
|
|
25
25
|
u_resolution: WebGLUniformLocation | null;
|
|
26
|
-
u_destRect: WebGLUniformLocation | null;
|
|
27
|
-
u_color: WebGLUniformLocation | null;
|
|
28
26
|
u_texArray: WebGLUniformLocation | null;
|
|
29
27
|
u_colorMatrix: WebGLUniformLocation | null;
|
|
30
|
-
|
|
28
|
+
instanceDestRectBuffer: WebGLBuffer | null;
|
|
29
|
+
instanceColorBuffer: WebGLBuffer | null;
|
|
30
|
+
instanceTexLayerBuffer: WebGLBuffer | null;
|
|
31
|
+
instanceDestRectData: Float32Array;
|
|
32
|
+
instanceColorData: Float32Array;
|
|
33
|
+
instanceTexLayerData: Float32Array;
|
|
31
34
|
texArray: WebGLTexture | null;
|
|
32
35
|
texArrayWidth: number;
|
|
33
36
|
texArrayHeight: number;
|
|
34
37
|
colorMatrix: Float32Array;
|
|
38
|
+
constructor();
|
|
35
39
|
setCanvas(canvas: OffscreenCanvas, width: number, height: number): void;
|
|
36
40
|
createShader(type: number, source: string): WebGLShader | null;
|
|
37
|
-
/**
|
|
38
|
-
* Set the color matrix for color space conversion.
|
|
39
|
-
* Pass null or undefined to use identity (no conversion).
|
|
40
|
-
*/
|
|
41
41
|
setColorMatrix(subtitleColorSpace?: 'BT601' | 'BT709' | 'SMPTE240M' | 'FCC', videoColorSpace?: 'BT601' | 'BT709'): void;
|
|
42
42
|
createTexArray(width: number, height: number): void;
|
|
43
43
|
render(images: ASSImage[], heap: Uint8Array): void;
|
|
@@ -56,9 +56,9 @@ export const colorMatrixConversionMap = {
|
|
|
56
56
|
])
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
|
-
// GLSL ES 3.0 Vertex Shader
|
|
59
|
+
// GLSL ES 3.0 Vertex Shader with Instancing
|
|
60
60
|
const VERTEX_SHADER = /* glsl */ `#version 300 es
|
|
61
|
-
precision
|
|
61
|
+
precision mediump float;
|
|
62
62
|
|
|
63
63
|
const vec2 QUAD_POSITIONS[6] = vec2[6](
|
|
64
64
|
vec2(0.0, 0.0),
|
|
@@ -70,9 +70,11 @@ const vec2 QUAD_POSITIONS[6] = vec2[6](
|
|
|
70
70
|
);
|
|
71
71
|
|
|
72
72
|
uniform vec2 u_resolution;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
|
|
74
|
+
// Instance attributes
|
|
75
|
+
in vec4 a_destRect; // x, y, w, h
|
|
76
|
+
in vec4 a_color; // r, g, b, a
|
|
77
|
+
in float a_texLayer;
|
|
76
78
|
|
|
77
79
|
flat out vec2 v_destXY;
|
|
78
80
|
flat out vec4 v_color;
|
|
@@ -81,21 +83,21 @@ flat out float v_texLayer;
|
|
|
81
83
|
|
|
82
84
|
void main() {
|
|
83
85
|
vec2 quadPos = QUAD_POSITIONS[gl_VertexID];
|
|
84
|
-
vec2 pixelPos =
|
|
86
|
+
vec2 pixelPos = a_destRect.xy + quadPos * a_destRect.zw;
|
|
85
87
|
vec2 clipPos = (pixelPos / u_resolution) * 2.0 - 1.0;
|
|
86
88
|
clipPos.y = -clipPos.y;
|
|
87
89
|
|
|
88
90
|
gl_Position = vec4(clipPos, 0.0, 1.0);
|
|
89
|
-
v_destXY =
|
|
90
|
-
v_color =
|
|
91
|
-
v_texSize =
|
|
92
|
-
v_texLayer =
|
|
91
|
+
v_destXY = a_destRect.xy;
|
|
92
|
+
v_color = a_color;
|
|
93
|
+
v_texSize = a_destRect.zw;
|
|
94
|
+
v_texLayer = a_texLayer;
|
|
93
95
|
}
|
|
94
96
|
`;
|
|
95
97
|
// GLSL ES 3.0 Fragment Shader - use texelFetch for pixel-perfect sampling
|
|
96
98
|
const FRAGMENT_SHADER = /* glsl */ `#version 300 es
|
|
97
|
-
precision
|
|
98
|
-
precision
|
|
99
|
+
precision mediump float;
|
|
100
|
+
precision mediump sampler2DArray;
|
|
99
101
|
|
|
100
102
|
uniform sampler2DArray u_texArray;
|
|
101
103
|
uniform mat3 u_colorMatrix;
|
|
@@ -121,8 +123,7 @@ void main() {
|
|
|
121
123
|
// Bounds check (prevents out-of-bounds access)
|
|
122
124
|
ivec2 texSizeI = ivec2(v_texSize);
|
|
123
125
|
if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
|
|
124
|
-
|
|
125
|
-
return;
|
|
126
|
+
discard;
|
|
126
127
|
}
|
|
127
128
|
|
|
128
129
|
// texelFetch: integer coords, no interpolation, no precision issues
|
|
@@ -144,22 +145,32 @@ void main() {
|
|
|
144
145
|
// Texture array configuration
|
|
145
146
|
const TEX_ARRAY_SIZE = 64; // Fixed layer count
|
|
146
147
|
const TEX_INITIAL_SIZE = 256; // Initial width/height
|
|
148
|
+
const MAX_INSTANCES = 256; // Maximum instances per draw call
|
|
147
149
|
export class WebGL2Renderer {
|
|
148
150
|
gl = null;
|
|
149
151
|
program = null;
|
|
150
152
|
vao = null;
|
|
151
153
|
// Uniform locations
|
|
152
154
|
u_resolution = null;
|
|
153
|
-
u_destRect = null;
|
|
154
|
-
u_color = null;
|
|
155
155
|
u_texArray = null;
|
|
156
156
|
u_colorMatrix = null;
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
// Instance attribute buffers
|
|
158
|
+
instanceDestRectBuffer = null;
|
|
159
|
+
instanceColorBuffer = null;
|
|
160
|
+
instanceTexLayerBuffer = null;
|
|
161
|
+
// Instance data arrays
|
|
162
|
+
instanceDestRectData;
|
|
163
|
+
instanceColorData;
|
|
164
|
+
instanceTexLayerData;
|
|
159
165
|
texArray = null;
|
|
160
166
|
texArrayWidth = 0;
|
|
161
167
|
texArrayHeight = 0;
|
|
162
168
|
colorMatrix = IDENTITY_MATRIX;
|
|
169
|
+
constructor() {
|
|
170
|
+
this.instanceDestRectData = new Float32Array(MAX_INSTANCES * 4);
|
|
171
|
+
this.instanceColorData = new Float32Array(MAX_INSTANCES * 4);
|
|
172
|
+
this.instanceTexLayerData = new Float32Array(MAX_INSTANCES);
|
|
173
|
+
}
|
|
163
174
|
setCanvas(canvas, width, height) {
|
|
164
175
|
// WebGL2 doesn't allow 0-sized canvases
|
|
165
176
|
if (width <= 0 || height <= 0)
|
|
@@ -167,16 +178,15 @@ export class WebGL2Renderer {
|
|
|
167
178
|
canvas.width = width;
|
|
168
179
|
canvas.height = height;
|
|
169
180
|
if (!this.gl) {
|
|
170
|
-
// Get canvas context
|
|
171
|
-
// Note: preserveDrawingBuffer is false (default) - the browser handles
|
|
172
|
-
// buffer swaps for OffscreenCanvas, avoiding flicker
|
|
173
181
|
this.gl = canvas.getContext('webgl2', {
|
|
174
182
|
alpha: true,
|
|
175
183
|
premultipliedAlpha: true,
|
|
176
184
|
antialias: false,
|
|
177
185
|
depth: false,
|
|
186
|
+
preserveDrawingBuffer: false,
|
|
178
187
|
stencil: false,
|
|
179
|
-
desynchronized: true
|
|
188
|
+
desynchronized: true,
|
|
189
|
+
powerPreference: 'high-performance'
|
|
180
190
|
});
|
|
181
191
|
if (!this.gl) {
|
|
182
192
|
throw new Error('Could not get WebGL2 context');
|
|
@@ -200,14 +210,31 @@ export class WebGL2Renderer {
|
|
|
200
210
|
this.gl.deleteShader(fragmentShader);
|
|
201
211
|
// Get uniform locations
|
|
202
212
|
this.u_resolution = this.gl.getUniformLocation(this.program, 'u_resolution');
|
|
203
|
-
this.u_destRect = this.gl.getUniformLocation(this.program, 'u_destRect');
|
|
204
|
-
this.u_color = this.gl.getUniformLocation(this.program, 'u_color');
|
|
205
213
|
this.u_texArray = this.gl.getUniformLocation(this.program, 'u_texArray');
|
|
206
214
|
this.u_colorMatrix = this.gl.getUniformLocation(this.program, 'u_colorMatrix');
|
|
207
|
-
|
|
215
|
+
// Create instance attribute buffers
|
|
216
|
+
this.instanceDestRectBuffer = this.gl.createBuffer();
|
|
217
|
+
this.instanceColorBuffer = this.gl.createBuffer();
|
|
218
|
+
this.instanceTexLayerBuffer = this.gl.createBuffer();
|
|
208
219
|
// Create a VAO (required for WebGL2)
|
|
209
220
|
this.vao = this.gl.createVertexArray();
|
|
210
221
|
this.gl.bindVertexArray(this.vao);
|
|
222
|
+
// Setup instance attributes
|
|
223
|
+
const destRectLoc = this.gl.getAttribLocation(this.program, 'a_destRect');
|
|
224
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer);
|
|
225
|
+
this.gl.enableVertexAttribArray(destRectLoc);
|
|
226
|
+
this.gl.vertexAttribPointer(destRectLoc, 4, this.gl.FLOAT, false, 0, 0);
|
|
227
|
+
this.gl.vertexAttribDivisor(destRectLoc, 1);
|
|
228
|
+
const colorLoc = this.gl.getAttribLocation(this.program, 'a_color');
|
|
229
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer);
|
|
230
|
+
this.gl.enableVertexAttribArray(colorLoc);
|
|
231
|
+
this.gl.vertexAttribPointer(colorLoc, 4, this.gl.FLOAT, false, 0, 0);
|
|
232
|
+
this.gl.vertexAttribDivisor(colorLoc, 1);
|
|
233
|
+
const texLayerLoc = this.gl.getAttribLocation(this.program, 'a_texLayer');
|
|
234
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer);
|
|
235
|
+
this.gl.enableVertexAttribArray(texLayerLoc);
|
|
236
|
+
this.gl.vertexAttribPointer(texLayerLoc, 1, this.gl.FLOAT, false, 0, 0);
|
|
237
|
+
this.gl.vertexAttribDivisor(texLayerLoc, 1);
|
|
211
238
|
// Set up blending for premultiplied alpha
|
|
212
239
|
this.gl.enable(this.gl.BLEND);
|
|
213
240
|
this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
@@ -240,10 +267,8 @@ export class WebGL2Renderer {
|
|
|
240
267
|
}
|
|
241
268
|
return shader;
|
|
242
269
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
* Pass null or undefined to use identity (no conversion).
|
|
246
|
-
*/
|
|
270
|
+
// Set the color matrix for color space conversion.
|
|
271
|
+
// Pass null or undefined to use identity (no conversion).
|
|
247
272
|
setColorMatrix(subtitleColorSpace, videoColorSpace) {
|
|
248
273
|
this.colorMatrix = (subtitleColorSpace && videoColorSpace && colorMatrixConversionMap[subtitleColorSpace]?.[videoColorSpace]) ?? IDENTITY_MATRIX;
|
|
249
274
|
if (this.gl && this.u_colorMatrix && this.program) {
|
|
@@ -277,52 +302,74 @@ export class WebGL2Renderer {
|
|
|
277
302
|
}
|
|
278
303
|
// Clear canvas
|
|
279
304
|
this.gl.clear(this.gl.COLOR_BUFFER_BIT);
|
|
280
|
-
// Find max dimensions needed
|
|
305
|
+
// Find max dimensions needed and filter valid images
|
|
281
306
|
let maxW = this.texArrayWidth;
|
|
282
307
|
let maxH = this.texArrayHeight;
|
|
308
|
+
const validImages = [];
|
|
283
309
|
for (const img of images) {
|
|
310
|
+
if (img.w <= 0 || img.h <= 0)
|
|
311
|
+
continue;
|
|
312
|
+
validImages.push(img);
|
|
284
313
|
if (img.w > maxW)
|
|
285
314
|
maxW = img.w;
|
|
286
315
|
if (img.h > maxH)
|
|
287
316
|
maxH = img.h;
|
|
288
317
|
}
|
|
318
|
+
if (validImages.length === 0)
|
|
319
|
+
return;
|
|
289
320
|
// Resize texture array if needed
|
|
290
321
|
if (maxW > this.texArrayWidth || maxH > this.texArrayHeight) {
|
|
291
322
|
this.createTexArray(maxW, maxH);
|
|
292
|
-
this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, this.texArray);
|
|
293
323
|
}
|
|
294
|
-
//
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
324
|
+
// Process images in chunks that fit within texture array size
|
|
325
|
+
const batchSize = Math.min(TEX_ARRAY_SIZE, MAX_INSTANCES);
|
|
326
|
+
for (let batchStart = 0; batchStart < validImages.length; batchStart += batchSize) {
|
|
327
|
+
const batchEnd = Math.min(batchStart + batchSize, validImages.length);
|
|
328
|
+
let instanceCount = 0;
|
|
329
|
+
// Upload textures for this batch
|
|
330
|
+
for (let i = batchStart; i < batchEnd; i++) {
|
|
331
|
+
const img = validImages[i];
|
|
332
|
+
const layer = instanceCount;
|
|
333
|
+
// Upload bitmap data to texture array layer
|
|
334
|
+
this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, img.stride);
|
|
335
|
+
if (IS_FIREFOX) {
|
|
336
|
+
// HACK 3 [see above for explanation]
|
|
337
|
+
const sourceView = new Uint8Array(heap.buffer, img.bitmap, img.stride * img.h);
|
|
338
|
+
const bitmapData = new Uint8Array(sourceView);
|
|
339
|
+
this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
|
|
340
|
+
img.w, img.h, 1, // depth (1 layer)
|
|
341
|
+
this.gl.RED, this.gl.UNSIGNED_BYTE, bitmapData);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
|
|
345
|
+
img.w, img.h, 1, // depth (1 layer)
|
|
346
|
+
this.gl.RED, this.gl.UNSIGNED_BYTE, heap, img.bitmap);
|
|
347
|
+
}
|
|
348
|
+
// Fill instance data
|
|
349
|
+
const idx = instanceCount * 4;
|
|
350
|
+
this.instanceDestRectData[idx] = img.dst_x;
|
|
351
|
+
this.instanceDestRectData[idx + 1] = img.dst_y;
|
|
352
|
+
this.instanceDestRectData[idx + 2] = img.w;
|
|
353
|
+
this.instanceDestRectData[idx + 3] = img.h;
|
|
354
|
+
this.instanceColorData[idx] = ((img.color >>> 24) & 0xFF) / 255;
|
|
355
|
+
this.instanceColorData[idx + 1] = ((img.color >>> 16) & 0xFF) / 255;
|
|
356
|
+
this.instanceColorData[idx + 2] = ((img.color >>> 8) & 0xFF) / 255;
|
|
357
|
+
this.instanceColorData[idx + 3] = (img.color & 0xFF) / 255;
|
|
358
|
+
this.instanceTexLayerData[instanceCount] = layer;
|
|
359
|
+
instanceCount++;
|
|
317
360
|
}
|
|
318
361
|
this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, 0);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
this.gl.
|
|
324
|
-
|
|
325
|
-
this.gl.
|
|
362
|
+
if (instanceCount === 0)
|
|
363
|
+
continue;
|
|
364
|
+
// Upload instance data to buffers
|
|
365
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer);
|
|
366
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceDestRectData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW);
|
|
367
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer);
|
|
368
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceColorData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW);
|
|
369
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer);
|
|
370
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceTexLayerData.subarray(0, instanceCount), this.gl.DYNAMIC_DRAW);
|
|
371
|
+
// Single instanced draw call
|
|
372
|
+
this.gl.drawArraysInstanced(this.gl.TRIANGLES, 0, 6, instanceCount);
|
|
326
373
|
}
|
|
327
374
|
}
|
|
328
375
|
destroy() {
|
|
@@ -331,6 +378,18 @@ export class WebGL2Renderer {
|
|
|
331
378
|
this.gl.deleteTexture(this.texArray);
|
|
332
379
|
this.texArray = null;
|
|
333
380
|
}
|
|
381
|
+
if (this.instanceDestRectBuffer) {
|
|
382
|
+
this.gl.deleteBuffer(this.instanceDestRectBuffer);
|
|
383
|
+
this.instanceDestRectBuffer = null;
|
|
384
|
+
}
|
|
385
|
+
if (this.instanceColorBuffer) {
|
|
386
|
+
this.gl.deleteBuffer(this.instanceColorBuffer);
|
|
387
|
+
this.instanceColorBuffer = null;
|
|
388
|
+
}
|
|
389
|
+
if (this.instanceTexLayerBuffer) {
|
|
390
|
+
this.gl.deleteBuffer(this.instanceTexLayerBuffer);
|
|
391
|
+
this.instanceTexLayerBuffer = null;
|
|
392
|
+
}
|
|
334
393
|
if (this.vao) {
|
|
335
394
|
this.gl.deleteVertexArray(this.vao);
|
|
336
395
|
this.vao = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-renderer.js","sourceRoot":"","sources":["../../src/worker/webgl-renderer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-renderer.js","sourceRoot":"","sources":["../../src/worker/webgl-renderer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -72,9 +72,9 @@ export const colorMatrixConversionMap = {
|
|
|
72
72
|
|
|
73
73
|
export type ColorSpace = keyof typeof colorMatrixConversionMap
|
|
74
74
|
|
|
75
|
-
// GLSL ES 3.0 Vertex Shader
|
|
75
|
+
// GLSL ES 3.0 Vertex Shader with Instancing
|
|
76
76
|
const VERTEX_SHADER = /* glsl */`#version 300 es
|
|
77
|
-
precision
|
|
77
|
+
precision mediump float;
|
|
78
78
|
|
|
79
79
|
const vec2 QUAD_POSITIONS[6] = vec2[6](
|
|
80
80
|
vec2(0.0, 0.0),
|
|
@@ -86,9 +86,11 @@ const vec2 QUAD_POSITIONS[6] = vec2[6](
|
|
|
86
86
|
);
|
|
87
87
|
|
|
88
88
|
uniform vec2 u_resolution;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
|
|
90
|
+
// Instance attributes
|
|
91
|
+
in vec4 a_destRect; // x, y, w, h
|
|
92
|
+
in vec4 a_color; // r, g, b, a
|
|
93
|
+
in float a_texLayer;
|
|
92
94
|
|
|
93
95
|
flat out vec2 v_destXY;
|
|
94
96
|
flat out vec4 v_color;
|
|
@@ -97,22 +99,22 @@ flat out float v_texLayer;
|
|
|
97
99
|
|
|
98
100
|
void main() {
|
|
99
101
|
vec2 quadPos = QUAD_POSITIONS[gl_VertexID];
|
|
100
|
-
vec2 pixelPos =
|
|
102
|
+
vec2 pixelPos = a_destRect.xy + quadPos * a_destRect.zw;
|
|
101
103
|
vec2 clipPos = (pixelPos / u_resolution) * 2.0 - 1.0;
|
|
102
104
|
clipPos.y = -clipPos.y;
|
|
103
105
|
|
|
104
106
|
gl_Position = vec4(clipPos, 0.0, 1.0);
|
|
105
|
-
v_destXY =
|
|
106
|
-
v_color =
|
|
107
|
-
v_texSize =
|
|
108
|
-
v_texLayer =
|
|
107
|
+
v_destXY = a_destRect.xy;
|
|
108
|
+
v_color = a_color;
|
|
109
|
+
v_texSize = a_destRect.zw;
|
|
110
|
+
v_texLayer = a_texLayer;
|
|
109
111
|
}
|
|
110
112
|
`
|
|
111
113
|
|
|
112
114
|
// GLSL ES 3.0 Fragment Shader - use texelFetch for pixel-perfect sampling
|
|
113
115
|
const FRAGMENT_SHADER = /* glsl */`#version 300 es
|
|
114
|
-
precision
|
|
115
|
-
precision
|
|
116
|
+
precision mediump float;
|
|
117
|
+
precision mediump sampler2DArray;
|
|
116
118
|
|
|
117
119
|
uniform sampler2DArray u_texArray;
|
|
118
120
|
uniform mat3 u_colorMatrix;
|
|
@@ -138,8 +140,7 @@ void main() {
|
|
|
138
140
|
// Bounds check (prevents out-of-bounds access)
|
|
139
141
|
ivec2 texSizeI = ivec2(v_texSize);
|
|
140
142
|
if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
|
|
141
|
-
|
|
142
|
-
return;
|
|
143
|
+
discard;
|
|
143
144
|
}
|
|
144
145
|
|
|
145
146
|
// texelFetch: integer coords, no interpolation, no precision issues
|
|
@@ -162,6 +163,7 @@ void main() {
|
|
|
162
163
|
// Texture array configuration
|
|
163
164
|
const TEX_ARRAY_SIZE = 64 // Fixed layer count
|
|
164
165
|
const TEX_INITIAL_SIZE = 256 // Initial width/height
|
|
166
|
+
const MAX_INSTANCES = 256 // Maximum instances per draw call
|
|
165
167
|
|
|
166
168
|
export class WebGL2Renderer {
|
|
167
169
|
gl: WebGL2RenderingContext | null = null
|
|
@@ -170,19 +172,31 @@ export class WebGL2Renderer {
|
|
|
170
172
|
|
|
171
173
|
// Uniform locations
|
|
172
174
|
u_resolution: WebGLUniformLocation | null = null
|
|
173
|
-
u_destRect: WebGLUniformLocation | null = null
|
|
174
|
-
u_color: WebGLUniformLocation | null = null
|
|
175
175
|
u_texArray: WebGLUniformLocation | null = null
|
|
176
176
|
u_colorMatrix: WebGLUniformLocation | null = null
|
|
177
|
-
u_texLayer: WebGLUniformLocation | null = null
|
|
178
177
|
|
|
179
|
-
//
|
|
178
|
+
// Instance attribute buffers
|
|
179
|
+
instanceDestRectBuffer: WebGLBuffer | null = null
|
|
180
|
+
instanceColorBuffer: WebGLBuffer | null = null
|
|
181
|
+
instanceTexLayerBuffer: WebGLBuffer | null = null
|
|
182
|
+
|
|
183
|
+
// Instance data arrays
|
|
184
|
+
instanceDestRectData: Float32Array
|
|
185
|
+
instanceColorData: Float32Array
|
|
186
|
+
instanceTexLayerData: Float32Array
|
|
187
|
+
|
|
180
188
|
texArray: WebGLTexture | null = null
|
|
181
189
|
texArrayWidth = 0
|
|
182
190
|
texArrayHeight = 0
|
|
183
191
|
|
|
184
192
|
colorMatrix: Float32Array = IDENTITY_MATRIX
|
|
185
193
|
|
|
194
|
+
constructor () {
|
|
195
|
+
this.instanceDestRectData = new Float32Array(MAX_INSTANCES * 4)
|
|
196
|
+
this.instanceColorData = new Float32Array(MAX_INSTANCES * 4)
|
|
197
|
+
this.instanceTexLayerData = new Float32Array(MAX_INSTANCES)
|
|
198
|
+
}
|
|
199
|
+
|
|
186
200
|
setCanvas (canvas: OffscreenCanvas, width: number, height: number) {
|
|
187
201
|
// WebGL2 doesn't allow 0-sized canvases
|
|
188
202
|
if (width <= 0 || height <= 0) return
|
|
@@ -191,16 +205,15 @@ export class WebGL2Renderer {
|
|
|
191
205
|
canvas.height = height
|
|
192
206
|
|
|
193
207
|
if (!this.gl) {
|
|
194
|
-
// Get canvas context
|
|
195
|
-
// Note: preserveDrawingBuffer is false (default) - the browser handles
|
|
196
|
-
// buffer swaps for OffscreenCanvas, avoiding flicker
|
|
197
208
|
this.gl = canvas.getContext('webgl2', {
|
|
198
209
|
alpha: true,
|
|
199
210
|
premultipliedAlpha: true,
|
|
200
211
|
antialias: false,
|
|
201
212
|
depth: false,
|
|
213
|
+
preserveDrawingBuffer: false,
|
|
202
214
|
stencil: false,
|
|
203
|
-
desynchronized: true
|
|
215
|
+
desynchronized: true,
|
|
216
|
+
powerPreference: 'high-performance'
|
|
204
217
|
})
|
|
205
218
|
|
|
206
219
|
if (!this.gl) {
|
|
@@ -231,16 +244,37 @@ export class WebGL2Renderer {
|
|
|
231
244
|
|
|
232
245
|
// Get uniform locations
|
|
233
246
|
this.u_resolution = this.gl.getUniformLocation(this.program, 'u_resolution')
|
|
234
|
-
this.u_destRect = this.gl.getUniformLocation(this.program, 'u_destRect')
|
|
235
|
-
this.u_color = this.gl.getUniformLocation(this.program, 'u_color')
|
|
236
247
|
this.u_texArray = this.gl.getUniformLocation(this.program, 'u_texArray')
|
|
237
248
|
this.u_colorMatrix = this.gl.getUniformLocation(this.program, 'u_colorMatrix')
|
|
238
|
-
|
|
249
|
+
|
|
250
|
+
// Create instance attribute buffers
|
|
251
|
+
this.instanceDestRectBuffer = this.gl.createBuffer()
|
|
252
|
+
this.instanceColorBuffer = this.gl.createBuffer()
|
|
253
|
+
this.instanceTexLayerBuffer = this.gl.createBuffer()
|
|
239
254
|
|
|
240
255
|
// Create a VAO (required for WebGL2)
|
|
241
256
|
this.vao = this.gl.createVertexArray()
|
|
242
257
|
this.gl.bindVertexArray(this.vao)
|
|
243
258
|
|
|
259
|
+
// Setup instance attributes
|
|
260
|
+
const destRectLoc = this.gl.getAttribLocation(this.program, 'a_destRect')
|
|
261
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer)
|
|
262
|
+
this.gl.enableVertexAttribArray(destRectLoc)
|
|
263
|
+
this.gl.vertexAttribPointer(destRectLoc, 4, this.gl.FLOAT, false, 0, 0)
|
|
264
|
+
this.gl.vertexAttribDivisor(destRectLoc, 1)
|
|
265
|
+
|
|
266
|
+
const colorLoc = this.gl.getAttribLocation(this.program, 'a_color')
|
|
267
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer)
|
|
268
|
+
this.gl.enableVertexAttribArray(colorLoc)
|
|
269
|
+
this.gl.vertexAttribPointer(colorLoc, 4, this.gl.FLOAT, false, 0, 0)
|
|
270
|
+
this.gl.vertexAttribDivisor(colorLoc, 1)
|
|
271
|
+
|
|
272
|
+
const texLayerLoc = this.gl.getAttribLocation(this.program, 'a_texLayer')
|
|
273
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer)
|
|
274
|
+
this.gl.enableVertexAttribArray(texLayerLoc)
|
|
275
|
+
this.gl.vertexAttribPointer(texLayerLoc, 1, this.gl.FLOAT, false, 0, 0)
|
|
276
|
+
this.gl.vertexAttribDivisor(texLayerLoc, 1)
|
|
277
|
+
|
|
244
278
|
// Set up blending for premultiplied alpha
|
|
245
279
|
this.gl.enable(this.gl.BLEND)
|
|
246
280
|
this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA)
|
|
@@ -283,10 +317,8 @@ export class WebGL2Renderer {
|
|
|
283
317
|
return shader
|
|
284
318
|
}
|
|
285
319
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
* Pass null or undefined to use identity (no conversion).
|
|
289
|
-
*/
|
|
320
|
+
// Set the color matrix for color space conversion.
|
|
321
|
+
// Pass null or undefined to use identity (no conversion).
|
|
290
322
|
setColorMatrix (subtitleColorSpace?: 'BT601' | 'BT709' | 'SMPTE240M' | 'FCC', videoColorSpace?: 'BT601' | 'BT709') {
|
|
291
323
|
this.colorMatrix = (subtitleColorSpace && videoColorSpace && colorMatrixConversionMap[subtitleColorSpace]?.[videoColorSpace]) ?? IDENTITY_MATRIX
|
|
292
324
|
if (this.gl && this.u_colorMatrix && this.program) {
|
|
@@ -338,82 +370,102 @@ export class WebGL2Renderer {
|
|
|
338
370
|
// Clear canvas
|
|
339
371
|
this.gl.clear(this.gl.COLOR_BUFFER_BIT)
|
|
340
372
|
|
|
341
|
-
// Find max dimensions needed
|
|
373
|
+
// Find max dimensions needed and filter valid images
|
|
342
374
|
let maxW = this.texArrayWidth
|
|
343
375
|
let maxH = this.texArrayHeight
|
|
376
|
+
const validImages: ASSImage[] = []
|
|
377
|
+
|
|
344
378
|
for (const img of images) {
|
|
379
|
+
if (img.w <= 0 || img.h <= 0) continue
|
|
380
|
+
validImages.push(img)
|
|
345
381
|
if (img.w > maxW) maxW = img.w
|
|
346
382
|
if (img.h > maxH) maxH = img.h
|
|
347
383
|
}
|
|
348
384
|
|
|
385
|
+
if (validImages.length === 0) return
|
|
386
|
+
|
|
349
387
|
// Resize texture array if needed
|
|
350
388
|
if (maxW > this.texArrayWidth || maxH > this.texArrayHeight) {
|
|
351
389
|
this.createTexArray(maxW, maxH)
|
|
352
|
-
this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, this.texArray)
|
|
353
390
|
}
|
|
354
391
|
|
|
355
|
-
//
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
//
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
this.gl.
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
this.gl.
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
392
|
+
// Process images in chunks that fit within texture array size
|
|
393
|
+
const batchSize = Math.min(TEX_ARRAY_SIZE, MAX_INSTANCES)
|
|
394
|
+
|
|
395
|
+
for (let batchStart = 0; batchStart < validImages.length; batchStart += batchSize) {
|
|
396
|
+
const batchEnd = Math.min(batchStart + batchSize, validImages.length)
|
|
397
|
+
let instanceCount = 0
|
|
398
|
+
|
|
399
|
+
// Upload textures for this batch
|
|
400
|
+
for (let i = batchStart; i < batchEnd; i++) {
|
|
401
|
+
const img = validImages[i]!
|
|
402
|
+
const layer = instanceCount
|
|
403
|
+
|
|
404
|
+
// Upload bitmap data to texture array layer
|
|
405
|
+
this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, img.stride)
|
|
406
|
+
|
|
407
|
+
if (IS_FIREFOX) {
|
|
408
|
+
// HACK 3 [see above for explanation]
|
|
409
|
+
const sourceView = new Uint8Array(heap.buffer, img.bitmap, img.stride * img.h)
|
|
410
|
+
const bitmapData = new Uint8Array(sourceView)
|
|
411
|
+
|
|
412
|
+
this.gl.texSubImage3D(
|
|
413
|
+
this.gl.TEXTURE_2D_ARRAY,
|
|
414
|
+
0,
|
|
415
|
+
0, 0, layer, // x, y, z offset
|
|
416
|
+
img.w,
|
|
417
|
+
img.h,
|
|
418
|
+
1, // depth (1 layer)
|
|
419
|
+
this.gl.RED,
|
|
420
|
+
this.gl.UNSIGNED_BYTE,
|
|
421
|
+
bitmapData
|
|
422
|
+
)
|
|
423
|
+
} else {
|
|
424
|
+
this.gl.texSubImage3D(
|
|
425
|
+
this.gl.TEXTURE_2D_ARRAY,
|
|
426
|
+
0,
|
|
427
|
+
0, 0, layer, // x, y, z offset
|
|
428
|
+
img.w,
|
|
429
|
+
img.h,
|
|
430
|
+
1, // depth (1 layer)
|
|
431
|
+
this.gl.RED,
|
|
432
|
+
this.gl.UNSIGNED_BYTE,
|
|
433
|
+
heap,
|
|
434
|
+
img.bitmap
|
|
435
|
+
)
|
|
436
|
+
}
|
|
437
|
+
// Fill instance data
|
|
438
|
+
const idx = instanceCount * 4
|
|
439
|
+
this.instanceDestRectData[idx] = img.dst_x
|
|
440
|
+
this.instanceDestRectData[idx + 1] = img.dst_y
|
|
441
|
+
this.instanceDestRectData[idx + 2] = img.w
|
|
442
|
+
this.instanceDestRectData[idx + 3] = img.h
|
|
443
|
+
|
|
444
|
+
this.instanceColorData[idx] = ((img.color >>> 24) & 0xFF) / 255
|
|
445
|
+
this.instanceColorData[idx + 1] = ((img.color >>> 16) & 0xFF) / 255
|
|
446
|
+
this.instanceColorData[idx + 2] = ((img.color >>> 8) & 0xFF) / 255
|
|
447
|
+
this.instanceColorData[idx + 3] = (img.color & 0xFF) / 255
|
|
448
|
+
|
|
449
|
+
this.instanceTexLayerData[instanceCount] = layer
|
|
450
|
+
|
|
451
|
+
instanceCount++
|
|
398
452
|
}
|
|
399
453
|
|
|
400
454
|
this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, 0)
|
|
401
455
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
this.gl.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
this.gl.
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
// 6 vertices for quad
|
|
416
|
-
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6)
|
|
456
|
+
if (instanceCount === 0) continue
|
|
457
|
+
// Upload instance data to buffers
|
|
458
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceDestRectBuffer)
|
|
459
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceDestRectData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW)
|
|
460
|
+
|
|
461
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceColorBuffer)
|
|
462
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceColorData.subarray(0, instanceCount * 4), this.gl.DYNAMIC_DRAW)
|
|
463
|
+
|
|
464
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceTexLayerBuffer)
|
|
465
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.instanceTexLayerData.subarray(0, instanceCount), this.gl.DYNAMIC_DRAW)
|
|
466
|
+
|
|
467
|
+
// Single instanced draw call
|
|
468
|
+
this.gl.drawArraysInstanced(this.gl.TRIANGLES, 0, 6, instanceCount)
|
|
417
469
|
}
|
|
418
470
|
}
|
|
419
471
|
|
|
@@ -424,6 +476,21 @@ export class WebGL2Renderer {
|
|
|
424
476
|
this.texArray = null
|
|
425
477
|
}
|
|
426
478
|
|
|
479
|
+
if (this.instanceDestRectBuffer) {
|
|
480
|
+
this.gl.deleteBuffer(this.instanceDestRectBuffer)
|
|
481
|
+
this.instanceDestRectBuffer = null
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (this.instanceColorBuffer) {
|
|
485
|
+
this.gl.deleteBuffer(this.instanceColorBuffer)
|
|
486
|
+
this.instanceColorBuffer = null
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (this.instanceTexLayerBuffer) {
|
|
490
|
+
this.gl.deleteBuffer(this.instanceTexLayerBuffer)
|
|
491
|
+
this.instanceTexLayerBuffer = null
|
|
492
|
+
}
|
|
493
|
+
|
|
427
494
|
if (this.vao) {
|
|
428
495
|
this.gl.deleteVertexArray(this.vao)
|
|
429
496
|
this.vao = null
|