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
- u_texLayer: WebGLUniformLocation | null;
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 highp float;
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
- uniform vec4 u_destRect; // x, y, w, h
74
- uniform vec4 u_color; // r, g, b, a
75
- uniform float u_texLayer;
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 = u_destRect.xy + quadPos * u_destRect.zw;
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 = u_destRect.xy;
90
- v_color = u_color;
91
- v_texSize = u_destRect.zw;
92
- v_texLayer = u_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 highp float;
98
- precision highp sampler2DArray;
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
- fragColor = vec4(0.0);
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
- u_texLayer = null;
158
- // Single texture array instead of individual textures
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
- this.u_texLayer = this.gl.getUniformLocation(this.program, 'u_texLayer');
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
- * Set the color matrix for color space conversion.
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
- // Render each image
295
- for (let i = 0, texLayer = 0; i < images.length; i++) {
296
- const img = images[i];
297
- // Skip images with invalid dimensions
298
- if (img.w <= 0 || img.h <= 0)
299
- continue;
300
- // Use modulo to cycle through layers if we have more images than layers
301
- const layer = texLayer % TEX_ARRAY_SIZE;
302
- texLayer++;
303
- // Upload bitmap data to texture array layer
304
- this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, img.stride);
305
- if (IS_FIREFOX) {
306
- // HACK 3 [see above for explanation]
307
- const sourceView = new Uint8Array(heap.buffer, img.bitmap, img.stride * img.h);
308
- const bitmapData = new Uint8Array(sourceView);
309
- this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
310
- img.w, img.h, 1, // depth (1 layer)
311
- this.gl.RED, this.gl.UNSIGNED_BYTE, bitmapData);
312
- }
313
- else {
314
- this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, // x, y, z offset
315
- img.w, img.h, 1, // depth (1 layer)
316
- this.gl.RED, this.gl.UNSIGNED_BYTE, heap, img.bitmap);
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
- // Set uniforms
320
- this.gl.uniform4f(this.u_destRect, img.dst_x, img.dst_y, img.w, img.h);
321
- this.gl.uniform1f(this.u_texLayer, layer);
322
- // color (RGBA from 0xRRGGBBAA)
323
- this.gl.uniform4f(this.u_color, ((img.color >>> 24) & 0xFF) / 255, ((img.color >>> 16) & 0xFF) / 255, ((img.color >>> 8) & 0xFF) / 255, (img.color & 0xFF) / 255);
324
- // 6 vertices for quad
325
- this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jassub",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "The Fastest JavaScript SSA/ASS Subtitle Renderer For Browsers",
5
5
  "main": "dist/jassub.js",
6
6
  "type": "module",
@@ -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 highp float;
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
- uniform vec4 u_destRect; // x, y, w, h
90
- uniform vec4 u_color; // r, g, b, a
91
- uniform float u_texLayer;
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 = u_destRect.xy + quadPos * u_destRect.zw;
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 = u_destRect.xy;
106
- v_color = u_color;
107
- v_texSize = u_destRect.zw;
108
- v_texLayer = u_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 highp float;
115
- precision highp sampler2DArray;
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
- fragColor = vec4(0.0);
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
- // Single texture array instead of individual textures
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
- this.u_texLayer = this.gl.getUniformLocation(this.program, 'u_texLayer')
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
- * Set the color matrix for color space conversion.
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
- // Render each image
356
- for (let i = 0, texLayer = 0; i < images.length; i++) {
357
- const img = images[i]!
358
-
359
- // Skip images with invalid dimensions
360
- if (img.w <= 0 || img.h <= 0) continue
361
-
362
- // Use modulo to cycle through layers if we have more images than layers
363
- const layer = texLayer % TEX_ARRAY_SIZE
364
- texLayer++
365
-
366
- // Upload bitmap data to texture array layer
367
- this.gl.pixelStorei(this.gl.UNPACK_ROW_LENGTH, img.stride)
368
-
369
- if (IS_FIREFOX) {
370
- // HACK 3 [see above for explanation]
371
- const sourceView = new Uint8Array(heap.buffer, img.bitmap, img.stride * img.h)
372
- const bitmapData = new Uint8Array(sourceView)
373
-
374
- this.gl.texSubImage3D(
375
- this.gl.TEXTURE_2D_ARRAY,
376
- 0,
377
- 0, 0, layer, // x, y, z offset
378
- img.w,
379
- img.h,
380
- 1, // depth (1 layer)
381
- this.gl.RED,
382
- this.gl.UNSIGNED_BYTE,
383
- bitmapData
384
- )
385
- } else {
386
- this.gl.texSubImage3D(
387
- this.gl.TEXTURE_2D_ARRAY,
388
- 0,
389
- 0, 0, layer, // x, y, z offset
390
- img.w,
391
- img.h,
392
- 1, // depth (1 layer)
393
- this.gl.RED,
394
- this.gl.UNSIGNED_BYTE,
395
- heap,
396
- img.bitmap
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
- // Set uniforms
403
- this.gl.uniform4f(this.u_destRect, img.dst_x, img.dst_y, img.w, img.h)
404
- this.gl.uniform1f(this.u_texLayer, layer)
405
-
406
- // color (RGBA from 0xRRGGBBAA)
407
- this.gl.uniform4f(
408
- this.u_color,
409
- ((img.color >>> 24) & 0xFF) / 255,
410
- ((img.color >>> 16) & 0xFF) / 255,
411
- ((img.color >>> 8) & 0xFF) / 255,
412
- (img.color & 0xFF) / 255
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