akarisub 0.2.0 → 0.2.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.
Files changed (41) hide show
  1. package/README.md +3 -3
  2. package/dist/akarisub-worker.js +2 -2
  3. package/dist/akarisub-worker.wasm +0 -0
  4. package/dist/akarisub.umd.js +3 -3
  5. package/dist/index.js +3 -3
  6. package/dist/ts/index.d.ts +14 -0
  7. package/dist/ts/index.d.ts.map +1 -0
  8. package/dist/ts/index.js +17 -0
  9. package/dist/ts/index.js.map +1 -0
  10. package/dist/ts/ts/akarisub.d.ts +229 -0
  11. package/dist/ts/ts/akarisub.d.ts.map +1 -0
  12. package/dist/ts/ts/akarisub.js +1079 -0
  13. package/dist/ts/ts/akarisub.js.map +1 -0
  14. package/dist/ts/ts/types.d.ts +424 -0
  15. package/dist/ts/ts/types.d.ts.map +1 -0
  16. package/dist/ts/ts/types.js +5 -0
  17. package/dist/ts/ts/types.js.map +1 -0
  18. package/dist/ts/ts/utils.d.ts +78 -0
  19. package/dist/ts/ts/utils.d.ts.map +1 -0
  20. package/dist/ts/ts/utils.js +395 -0
  21. package/dist/ts/ts/utils.js.map +1 -0
  22. package/dist/ts/ts/webgl2-renderer.d.ts +51 -0
  23. package/dist/ts/ts/webgl2-renderer.d.ts.map +1 -0
  24. package/dist/ts/ts/webgl2-renderer.js +388 -0
  25. package/dist/ts/ts/webgl2-renderer.js.map +1 -0
  26. package/dist/ts/ts/webgpu-renderer.d.ts +64 -0
  27. package/dist/ts/ts/webgpu-renderer.d.ts.map +1 -0
  28. package/dist/ts/ts/webgpu-renderer.js +610 -0
  29. package/dist/ts/ts/webgpu-renderer.js.map +1 -0
  30. package/dist/ts/ts/worker.d.ts +6 -0
  31. package/dist/ts/ts/worker.d.ts.map +1 -0
  32. package/dist/ts/ts/worker.js +1695 -0
  33. package/dist/ts/ts/worker.js.map +1 -0
  34. package/dist/ts/wrapper.d.ts +8 -0
  35. package/dist/ts/wrapper.d.ts.map +1 -0
  36. package/dist/ts/wrapper.js +9 -0
  37. package/dist/ts/wrapper.js.map +1 -0
  38. package/package.json +7 -6
  39. package/src/ts/akarisub.ts +46 -4
  40. package/src/ts/types.ts +18 -4
  41. package/src/ts/worker.ts +177 -23
@@ -0,0 +1,610 @@
1
+ /// <reference types="@webgpu/types" />
2
+ // Maximum images per batch
3
+ const MAX_IMAGES_PER_BATCH = 256;
4
+ // WebGPU max texture array layers
5
+ const MAX_TEXTURE_ARRAY_LAYERS = 256;
6
+ // WGSL Vertex Shader
7
+ const VERTEX_SHADER = /* wgsl */ `
8
+ struct VertexOutput {
9
+ @builtin(position) position: vec4f,
10
+ @location(0) @interpolate(flat) instanceIndex: u32,
11
+ @location(1) @interpolate(flat) destXY: vec2f,
12
+ @location(2) @interpolate(flat) texSize: vec2f,
13
+ }
14
+
15
+ struct Uniforms {
16
+ resolution: vec2f,
17
+ }
18
+
19
+ struct ImageData {
20
+ destRect: vec4f, // x, y, w, h
21
+ texInfo: vec4f, // texW, texH, texIndex, 0
22
+ }
23
+
24
+ @group(0) @binding(0) var<uniform> uniforms: Uniforms;
25
+ @group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
26
+
27
+ // Quad vertices (two triangles)
28
+ const QUAD_POSITIONS = array<vec2f, 6>(
29
+ vec2f(0.0, 0.0),
30
+ vec2f(1.0, 0.0),
31
+ vec2f(0.0, 1.0),
32
+ vec2f(1.0, 0.0),
33
+ vec2f(1.0, 1.0),
34
+ vec2f(0.0, 1.0)
35
+ );
36
+
37
+ @vertex
38
+ fn vertexMain(
39
+ @builtin(vertex_index) vertexIndex: u32,
40
+ @builtin(instance_index) instanceIndex: u32
41
+ ) -> VertexOutput {
42
+ var output: VertexOutput;
43
+
44
+ let data = imageData[instanceIndex];
45
+ let quadPos = QUAD_POSITIONS[vertexIndex];
46
+ let wh = data.destRect.zw;
47
+
48
+ // Calculate pixel position
49
+ let pixelPos = data.destRect.xy + quadPos * wh;
50
+
51
+ // Convert to clip space (-1 to 1)
52
+ var clipPos = (pixelPos / uniforms.resolution) * 2.0 - 1.0;
53
+ clipPos.y = -clipPos.y;
54
+
55
+ output.position = vec4f(clipPos, 0.0, 1.0);
56
+ output.instanceIndex = instanceIndex;
57
+ output.destXY = data.destRect.xy;
58
+ output.texSize = data.texInfo.xy;
59
+
60
+ return output;
61
+ }
62
+ `;
63
+ // WGSL Fragment Shader
64
+ const FRAGMENT_SHADER = /* wgsl */ `
65
+ @group(0) @binding(2) var texArray: texture_2d_array<f32>;
66
+
67
+ struct ImageData {
68
+ destRect: vec4f,
69
+ texInfo: vec4f,
70
+ }
71
+
72
+ @group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
73
+
74
+ struct FragmentInput {
75
+ @builtin(position) fragCoord: vec4f,
76
+ @location(0) @interpolate(flat) instanceIndex: u32,
77
+ @location(1) @interpolate(flat) destXY: vec2f,
78
+ @location(2) @interpolate(flat) texSize: vec2f,
79
+ }
80
+
81
+ @fragment
82
+ fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
83
+ let data = imageData[input.instanceIndex];
84
+ let texIndex = u32(data.texInfo.z);
85
+
86
+ // Calculate texel coordinates
87
+ let texCoordF = floor(input.fragCoord.xy - input.destXY);
88
+ let texCoord = vec2i(texCoordF);
89
+
90
+ // Bounds check
91
+ let texSizeI = vec2i(input.texSize);
92
+ if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
93
+ discard;
94
+ }
95
+
96
+ // Load from texture array
97
+ let color = textureLoad(texArray, texCoord, texIndex, 0);
98
+
99
+ // Premultiplied alpha output
100
+ return vec4f(color.rgb * color.a, color.a);
101
+ }
102
+ `;
103
+ /**
104
+ * Check if WebGPU is supported in the current browser.
105
+ */
106
+ export function isWebGPUSupported() {
107
+ return typeof navigator !== 'undefined' && 'gpu' in navigator;
108
+ }
109
+ function toUint8View(data) {
110
+ if (data instanceof ArrayBuffer) {
111
+ return new Uint8Array(data);
112
+ }
113
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
114
+ }
115
+ /**
116
+ * High-performance WebGPU subtitle renderer for AkariSub.
117
+ */
118
+ export class WebGPURenderer {
119
+ device = null;
120
+ context = null;
121
+ pipeline = null;
122
+ bindGroupLayout = null;
123
+ uniformBuffer = null;
124
+ imageDataBuffer = null;
125
+ // Texture array for batched rendering
126
+ textureArray = null;
127
+ textureArrayView = null;
128
+ textureArraySize = 0;
129
+ textureArrayWidth = 0;
130
+ textureArrayHeight = 0;
131
+ pendingDestroyTextures = [];
132
+ // Pre-allocated typed arrays (reused every frame - ZERO allocations in hot path)
133
+ imageDataArray;
134
+ resolutionArray = new Float32Array(2);
135
+ // Reusable conversion buffer for RGBA->BGRA (grows as needed, never shrinks)
136
+ conversionBuffer = null;
137
+ conversionBufferSize = 0;
138
+ // Bind group (recreated only when texture array changes)
139
+ bindGroup = null;
140
+ bindGroupDirty = true;
141
+ // Track canvas size to avoid redundant updates
142
+ lastCanvasWidth = 0;
143
+ lastCanvasHeight = 0;
144
+ format = 'bgra8unorm';
145
+ _canvas = null;
146
+ _initPromise = null;
147
+ _initialized = false;
148
+ constructor() {
149
+ // Pre-allocate buffer for max images (8 floats per image: destRect + texInfo)
150
+ this.imageDataArray = new Float32Array(MAX_IMAGES_PER_BATCH * 8);
151
+ }
152
+ async init() {
153
+ if (this._initPromise)
154
+ return this._initPromise;
155
+ this._initPromise = this._initDevice();
156
+ return this._initPromise;
157
+ }
158
+ async _initDevice() {
159
+ if (!navigator.gpu) {
160
+ throw new Error('WebGPU not supported');
161
+ }
162
+ const adapter = await navigator.gpu.requestAdapter({
163
+ powerPreference: 'high-performance'
164
+ });
165
+ if (!adapter) {
166
+ throw new Error('No WebGPU adapter found');
167
+ }
168
+ this.device = await adapter.requestDevice();
169
+ this.format = navigator.gpu.getPreferredCanvasFormat();
170
+ const vertexModule = this.device.createShaderModule({ code: VERTEX_SHADER });
171
+ const fragmentModule = this.device.createShaderModule({ code: FRAGMENT_SHADER });
172
+ this.uniformBuffer = this.device.createBuffer({
173
+ size: 16,
174
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
175
+ });
176
+ // Large storage buffer for all image data
177
+ this.imageDataBuffer = this.device.createBuffer({
178
+ size: MAX_IMAGES_PER_BATCH * 8 * 4,
179
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
180
+ });
181
+ // Create initial texture array with reasonable defaults
182
+ this.createTextureArray(256, 256, 32);
183
+ this.bindGroupLayout = this.device.createBindGroupLayout({
184
+ entries: [
185
+ { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },
186
+ {
187
+ binding: 1,
188
+ visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
189
+ buffer: { type: 'read-only-storage' }
190
+ },
191
+ {
192
+ binding: 2,
193
+ visibility: GPUShaderStage.FRAGMENT,
194
+ texture: { sampleType: 'unfilterable-float', viewDimension: '2d-array' }
195
+ }
196
+ ]
197
+ });
198
+ const pipelineLayout = this.device.createPipelineLayout({
199
+ bindGroupLayouts: [this.bindGroupLayout]
200
+ });
201
+ this.pipeline = this.device.createRenderPipeline({
202
+ layout: pipelineLayout,
203
+ vertex: { module: vertexModule, entryPoint: 'vertexMain' },
204
+ fragment: {
205
+ module: fragmentModule,
206
+ entryPoint: 'fragmentMain',
207
+ targets: [
208
+ {
209
+ format: this.format,
210
+ blend: {
211
+ color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
212
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' }
213
+ }
214
+ }
215
+ ]
216
+ },
217
+ primitive: { topology: 'triangle-list' }
218
+ });
219
+ this._initialized = true;
220
+ }
221
+ // Round up to next power of 2 for GPU-friendly sizes
222
+ nextPowerOf2(n) {
223
+ n--;
224
+ n |= n >> 1;
225
+ n |= n >> 2;
226
+ n |= n >> 4;
227
+ n |= n >> 8;
228
+ n |= n >> 16;
229
+ return n + 1;
230
+ }
231
+ createTextureArray(width, height, layers) {
232
+ if (this.textureArray) {
233
+ this.pendingDestroyTextures.push(this.textureArray);
234
+ }
235
+ // Use power-of-2 dimensions for better GPU performance
236
+ const w = this.nextPowerOf2(Math.max(width, 64));
237
+ const h = this.nextPowerOf2(Math.max(height, 64));
238
+ // Clamp layers to WebGPU max (256)
239
+ const l = Math.min(this.nextPowerOf2(Math.max(layers, 16)), MAX_TEXTURE_ARRAY_LAYERS);
240
+ this.textureArray = this.device.createTexture({
241
+ size: [w, h, l],
242
+ format: this.format,
243
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
244
+ });
245
+ this.textureArrayView = this.textureArray.createView({ dimension: '2d-array' });
246
+ this.textureArrayWidth = w;
247
+ this.textureArrayHeight = h;
248
+ this.textureArraySize = l;
249
+ this.bindGroupDirty = true;
250
+ // Clear all texture layers to transparent to prevent garbage border artifacts
251
+ const commandEncoder = this.device.createCommandEncoder();
252
+ for (let layer = 0; layer < l; layer++) {
253
+ const layerView = this.textureArray.createView({
254
+ dimension: '2d',
255
+ baseArrayLayer: layer,
256
+ arrayLayerCount: 1
257
+ });
258
+ const renderPass = commandEncoder.beginRenderPass({
259
+ colorAttachments: [
260
+ {
261
+ view: layerView,
262
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
263
+ loadOp: 'clear',
264
+ storeOp: 'store'
265
+ }
266
+ ]
267
+ });
268
+ renderPass.end();
269
+ }
270
+ this.device.queue.submit([commandEncoder.finish()]);
271
+ }
272
+ ensureTextureArray(maxWidth, maxHeight, count) {
273
+ // Clamp count to max layers
274
+ const clampedCount = Math.min(count, MAX_TEXTURE_ARRAY_LAYERS);
275
+ if (maxWidth <= this.textureArrayWidth &&
276
+ maxHeight <= this.textureArrayHeight &&
277
+ clampedCount <= this.textureArraySize) {
278
+ return false;
279
+ }
280
+ // Grow with some headroom to avoid frequent resizes, but cap at max layers
281
+ const newWidth = this.nextPowerOf2(Math.max(this.textureArrayWidth, maxWidth));
282
+ const newHeight = this.nextPowerOf2(Math.max(this.textureArrayHeight, maxHeight));
283
+ const newLayers = Math.min(this.nextPowerOf2(Math.max(this.textureArraySize, clampedCount, clampedCount + 16)), MAX_TEXTURE_ARRAY_LAYERS);
284
+ this.createTextureArray(newWidth, newHeight, newLayers);
285
+ return true;
286
+ }
287
+ updateBindGroup() {
288
+ if (!this.bindGroupDirty || !this.device || !this.bindGroupLayout)
289
+ return;
290
+ this.bindGroup = this.device.createBindGroup({
291
+ layout: this.bindGroupLayout,
292
+ entries: [
293
+ { binding: 0, resource: { buffer: this.uniformBuffer } },
294
+ { binding: 1, resource: { buffer: this.imageDataBuffer } },
295
+ { binding: 2, resource: this.textureArrayView }
296
+ ]
297
+ });
298
+ this.bindGroupDirty = false;
299
+ }
300
+ ensureConversionBuffer(size) {
301
+ if (this.conversionBufferSize < size) {
302
+ // Grow with 50% headroom to reduce reallocations
303
+ this.conversionBufferSize = Math.max(size, (this.conversionBufferSize * 1.5) | 0, 65536);
304
+ this.conversionBuffer = new Uint8Array(this.conversionBufferSize);
305
+ }
306
+ return this.conversionBuffer;
307
+ }
308
+ async setCanvas(canvas, width, height) {
309
+ await this.init();
310
+ if (!this.device)
311
+ throw new Error('WebGPU device not initialized');
312
+ if (width <= 0 || height <= 0)
313
+ return;
314
+ this._canvas = canvas;
315
+ canvas.width = width;
316
+ canvas.height = height;
317
+ if (!this.context) {
318
+ this.context = canvas.getContext('webgpu');
319
+ if (!this.context)
320
+ throw new Error('Could not get WebGPU context');
321
+ this.context.configure({
322
+ device: this.device,
323
+ format: this.format,
324
+ alphaMode: 'premultiplied'
325
+ });
326
+ }
327
+ this.resolutionArray[0] = width;
328
+ this.resolutionArray[1] = height;
329
+ this.device.queue.writeBuffer(this.uniformBuffer, 0, this.resolutionArray);
330
+ this.lastCanvasWidth = width;
331
+ this.lastCanvasHeight = height;
332
+ }
333
+ updateSize(width, height) {
334
+ if (!this.device || !this._canvas || width <= 0 || height <= 0)
335
+ return;
336
+ if (width === this.lastCanvasWidth && height === this.lastCanvasHeight)
337
+ return;
338
+ this._canvas.width = width;
339
+ this._canvas.height = height;
340
+ this.resolutionArray[0] = width;
341
+ this.resolutionArray[1] = height;
342
+ this.device.queue.writeBuffer(this.uniformBuffer, 0, this.resolutionArray);
343
+ this.lastCanvasWidth = width;
344
+ this.lastCanvasHeight = height;
345
+ }
346
+ /**
347
+ * Render ImageBitmaps (async render mode)
348
+ * Handles batching when image count exceeds MAX_TEXTURE_ARRAY_LAYERS
349
+ */
350
+ renderBitmaps(images, _canvasWidth, _canvasHeight) {
351
+ if (!this.device || !this.context || !this.pipeline)
352
+ return;
353
+ const len = images.length;
354
+ if (len === 0) {
355
+ this.clear();
356
+ return;
357
+ }
358
+ const currentTexture = this.context.getCurrentTexture();
359
+ if (currentTexture.width === 0 || currentTexture.height === 0)
360
+ return;
361
+ // Single pass: find max dimensions and count valid images
362
+ let maxW = 0, maxH = 0, validCount = 0;
363
+ for (let i = 0; i < len; i++) {
364
+ const { image } = images[i];
365
+ const w = image.width, h = image.height;
366
+ if (w > 0 && h > 0) {
367
+ if (w > maxW)
368
+ maxW = w;
369
+ if (h > maxH)
370
+ maxH = h;
371
+ validCount++;
372
+ }
373
+ }
374
+ if (validCount === 0) {
375
+ this.clear();
376
+ return;
377
+ }
378
+ // Ensure texture array is large enough (capped at MAX_TEXTURE_ARRAY_LAYERS)
379
+ const batchSize = Math.min(validCount, MAX_TEXTURE_ARRAY_LAYERS);
380
+ this.ensureTextureArray(maxW, maxH, batchSize);
381
+ this.updateBindGroup();
382
+ const device = this.device;
383
+ const queue = device.queue;
384
+ const textureArray = this.textureArray;
385
+ const imageDataArray = this.imageDataArray;
386
+ const textureView = currentTexture.createView();
387
+ // Process images in batches if needed
388
+ let imageIndex = 0;
389
+ let isFirstBatch = true;
390
+ while (imageIndex < len) {
391
+ let texIndex = 0;
392
+ // Upload batch of textures
393
+ while (imageIndex < len && texIndex < MAX_TEXTURE_ARRAY_LAYERS) {
394
+ const img = images[imageIndex++];
395
+ const bitmap = img.image;
396
+ const w = bitmap.width, h = bitmap.height;
397
+ if (w <= 0 || h <= 0)
398
+ continue;
399
+ // Copy to texture array layer
400
+ queue.copyExternalImageToTexture({ source: bitmap, flipY: false }, { texture: textureArray, origin: [0, 0, texIndex], premultipliedAlpha: false }, { width: w, height: h });
401
+ // Fill pre-allocated array
402
+ const offset = texIndex << 3;
403
+ imageDataArray[offset] = img.x;
404
+ imageDataArray[offset + 1] = img.y;
405
+ imageDataArray[offset + 2] = w;
406
+ imageDataArray[offset + 3] = h;
407
+ imageDataArray[offset + 4] = w;
408
+ imageDataArray[offset + 5] = h;
409
+ imageDataArray[offset + 6] = texIndex;
410
+ imageDataArray[offset + 7] = 0;
411
+ texIndex++;
412
+ }
413
+ if (texIndex === 0)
414
+ continue;
415
+ // Upload buffer and draw batch
416
+ queue.writeBuffer(this.imageDataBuffer, 0, imageDataArray.buffer, 0, texIndex << 5);
417
+ const commandEncoder = device.createCommandEncoder();
418
+ const renderPass = commandEncoder.beginRenderPass({
419
+ colorAttachments: [
420
+ {
421
+ view: textureView,
422
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
423
+ loadOp: isFirstBatch ? 'clear' : 'load',
424
+ storeOp: 'store'
425
+ }
426
+ ]
427
+ });
428
+ renderPass.setPipeline(this.pipeline);
429
+ renderPass.setBindGroup(0, this.bindGroup);
430
+ renderPass.draw(6, texIndex);
431
+ renderPass.end();
432
+ queue.submit([commandEncoder.finish()]);
433
+ isFirstBatch = false;
434
+ }
435
+ this.cleanupPendingTextures();
436
+ }
437
+ /**
438
+ * Render from raw ArrayBuffer data (non-async render mode)
439
+ * Handles batching when image count exceeds MAX_TEXTURE_ARRAY_LAYERS
440
+ */
441
+ render(images, _canvasWidth, _canvasHeight) {
442
+ if (!this.device || !this.context || !this.pipeline)
443
+ return;
444
+ const len = images.length;
445
+ if (len === 0) {
446
+ this.clear();
447
+ return;
448
+ }
449
+ const currentTexture = this.context.getCurrentTexture();
450
+ if (currentTexture.width === 0 || currentTexture.height === 0)
451
+ return;
452
+ // Single pass: find max dimensions and count valid images
453
+ let maxW = 0, maxH = 0, validCount = 0;
454
+ for (let i = 0; i < len; i++) {
455
+ const { w, h } = images[i];
456
+ if (w > 0 && h > 0) {
457
+ if (w > maxW)
458
+ maxW = w;
459
+ if (h > maxH)
460
+ maxH = h;
461
+ validCount++;
462
+ }
463
+ }
464
+ if (validCount === 0) {
465
+ this.clear();
466
+ return;
467
+ }
468
+ // Ensure texture array is large enough (capped at MAX_TEXTURE_ARRAY_LAYERS)
469
+ const batchSize = Math.min(validCount, MAX_TEXTURE_ARRAY_LAYERS);
470
+ this.ensureTextureArray(maxW, maxH, batchSize);
471
+ this.updateBindGroup();
472
+ const device = this.device;
473
+ const queue = device.queue;
474
+ const textureArray = this.textureArray;
475
+ const imageDataArray = this.imageDataArray;
476
+ const isBGRA = this.format === 'bgra8unorm';
477
+ const textureView = currentTexture.createView();
478
+ // Process images in batches if needed
479
+ let imageIndex = 0;
480
+ let isFirstBatch = true;
481
+ while (imageIndex < len) {
482
+ let texIndex = 0;
483
+ // Upload batch of textures
484
+ while (imageIndex < len && texIndex < MAX_TEXTURE_ARRAY_LAYERS) {
485
+ const img = images[imageIndex++];
486
+ const w = img.w, h = img.h;
487
+ if (w <= 0 || h <= 0)
488
+ continue;
489
+ // Upload texture data
490
+ const imgData = img.image;
491
+ if (imgData instanceof ImageBitmap) {
492
+ queue.copyExternalImageToTexture({ source: imgData, flipY: false }, { texture: textureArray, origin: [0, 0, texIndex], premultipliedAlpha: false }, { width: w, height: h });
493
+ }
494
+ else if (imgData instanceof ArrayBuffer || imgData instanceof Uint8Array || imgData instanceof Uint8ClampedArray) {
495
+ this.uploadTextureData(texIndex, imgData, w, h, isBGRA);
496
+ }
497
+ // Fill pre-allocated array
498
+ const offset = texIndex << 3;
499
+ imageDataArray[offset] = img.x;
500
+ imageDataArray[offset + 1] = img.y;
501
+ imageDataArray[offset + 2] = w;
502
+ imageDataArray[offset + 3] = h;
503
+ imageDataArray[offset + 4] = w;
504
+ imageDataArray[offset + 5] = h;
505
+ imageDataArray[offset + 6] = texIndex;
506
+ imageDataArray[offset + 7] = 0;
507
+ texIndex++;
508
+ }
509
+ if (texIndex === 0)
510
+ continue;
511
+ // Upload buffer and draw batch
512
+ queue.writeBuffer(this.imageDataBuffer, 0, imageDataArray.buffer, 0, texIndex << 5);
513
+ const commandEncoder = device.createCommandEncoder();
514
+ const renderPass = commandEncoder.beginRenderPass({
515
+ colorAttachments: [
516
+ {
517
+ view: textureView,
518
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
519
+ loadOp: isFirstBatch ? 'clear' : 'load',
520
+ storeOp: 'store'
521
+ }
522
+ ]
523
+ });
524
+ renderPass.setPipeline(this.pipeline);
525
+ renderPass.setBindGroup(0, this.bindGroup);
526
+ renderPass.draw(6, texIndex);
527
+ renderPass.end();
528
+ queue.submit([commandEncoder.finish()]);
529
+ isFirstBatch = false;
530
+ }
531
+ this.cleanupPendingTextures();
532
+ }
533
+ uploadTextureData(layerIndex, rgbaBuffer, width, height, swapRB) {
534
+ const size = width * height * 4;
535
+ const src = toUint8View(rgbaBuffer);
536
+ if (swapRB) {
537
+ // Use reusable conversion buffer
538
+ const uploadData = this.ensureConversionBuffer(size);
539
+ // Unrolled loop for better performance
540
+ for (let j = 0; j < size; j += 4) {
541
+ uploadData[j] = src[j + 2]; // B <- R
542
+ uploadData[j + 1] = src[j + 1]; // G
543
+ uploadData[j + 2] = src[j]; // R <- B
544
+ uploadData[j + 3] = src[j + 3]; // A
545
+ }
546
+ this.device.queue.writeTexture({ texture: this.textureArray, origin: [0, 0, layerIndex] }, uploadData.buffer, { bytesPerRow: width * 4 }, { width, height });
547
+ }
548
+ else {
549
+ this.device.queue.writeTexture({ texture: this.textureArray, origin: [0, 0, layerIndex] }, src, { bytesPerRow: width * 4 }, { width, height });
550
+ }
551
+ }
552
+ cleanupPendingTextures() {
553
+ const pending = this.pendingDestroyTextures;
554
+ const len = pending.length;
555
+ if (len === 0)
556
+ return;
557
+ for (let i = 0; i < len; i++) {
558
+ pending[i].destroy();
559
+ }
560
+ pending.length = 0;
561
+ }
562
+ clear() {
563
+ if (!this.device || !this.context)
564
+ return;
565
+ try {
566
+ const currentTexture = this.context.getCurrentTexture();
567
+ if (currentTexture.width === 0 || currentTexture.height === 0)
568
+ return;
569
+ const commandEncoder = this.device.createCommandEncoder();
570
+ const renderPass = commandEncoder.beginRenderPass({
571
+ colorAttachments: [
572
+ {
573
+ view: currentTexture.createView(),
574
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
575
+ loadOp: 'clear',
576
+ storeOp: 'store'
577
+ }
578
+ ]
579
+ });
580
+ renderPass.end();
581
+ this.device.queue.submit([commandEncoder.finish()]);
582
+ }
583
+ catch {
584
+ // Ignore errors
585
+ }
586
+ }
587
+ get initialized() {
588
+ return this._initialized;
589
+ }
590
+ destroy() {
591
+ this.cleanupPendingTextures();
592
+ this.textureArray?.destroy();
593
+ this.textureArray = null;
594
+ this.textureArrayView = null;
595
+ this.uniformBuffer?.destroy();
596
+ this.uniformBuffer = null;
597
+ this.imageDataBuffer?.destroy();
598
+ this.imageDataBuffer = null;
599
+ this.bindGroup = null;
600
+ this.conversionBuffer = null;
601
+ this.conversionBufferSize = 0;
602
+ this.device?.destroy();
603
+ this.device = null;
604
+ this.context = null;
605
+ this._canvas = null;
606
+ this._initialized = false;
607
+ this._initPromise = null;
608
+ }
609
+ }
610
+ //# sourceMappingURL=webgpu-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu-renderer.js","sourceRoot":"","sources":["../../../src/ts/webgpu-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * AkariSub Worker - TypeScript implementation.
3
+ * Runs in a Web Worker to offload subtitle rendering from the main thread.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/ts/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG"}