Skip to content

Commit 7a2767a

Browse files
cmdcolinclaude
andcommitted
Consolidate dual fallback dispatch across all GPU renderers
Replace the dual glFallback/canvas2dFallback fields with a single fallback field in wiggle, hic, canvas, synteny, dotplot, variant, LD, and variant matrix renderers. This matches the pattern established in the alignments renderer refactoring. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3883839 commit 7a2767a

File tree

8 files changed

+100
-236
lines changed

8 files changed

+100
-236
lines changed

plugins/canvas/src/LinearFeatureDisplay/components/CanvasFeatureRenderer.ts

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ export class CanvasFeatureRenderer {
6464
private uniformF32 = new Float32Array(this.uniformData)
6565
private uniformU32 = new Uint32Array(this.uniformData)
6666
private regions = new Map<number, GpuRegionData>()
67-
private glFallback: WebGLFeatureRenderer | null = null
68-
private canvas2dFallback: Canvas2DFeatureRenderer | null = null
67+
private fallback: WebGLFeatureRenderer | Canvas2DFeatureRenderer | null = null
6968

7069
private constructor(canvas: HTMLCanvasElement) {
7170
this.canvas = canvas
@@ -152,7 +151,7 @@ export class CanvasFeatureRenderer {
152151

153152
async init() {
154153
if (getGpuOverride() === 'canvas2d') {
155-
this.canvas2dFallback = new Canvas2DFeatureRenderer(this.canvas)
154+
this.fallback = new Canvas2DFeatureRenderer(this.canvas)
156155
return true
157156
}
158157

@@ -193,11 +192,11 @@ export class CanvasFeatureRenderer {
193192
}
194193
}
195194
try {
196-
this.glFallback = new WebGLFeatureRenderer(this.canvas)
195+
this.fallback = new WebGLFeatureRenderer(this.canvas)
197196
return true
198197
} catch (e) {
199198
console.warn('[CanvasFeatureRenderer] WebGL2 fallback also failed:', e)
200-
this.canvas2dFallback = new Canvas2DFeatureRenderer(this.canvas)
199+
this.fallback = new Canvas2DFeatureRenderer(this.canvas)
201200
return true
202201
}
203202
}
@@ -224,12 +223,8 @@ export class CanvasFeatureRenderer {
224223
numArrows: number
225224
},
226225
) {
227-
if (this.glFallback) {
228-
this.glFallback.uploadForRegion(regionNumber, data)
229-
return
230-
}
231-
if (this.canvas2dFallback) {
232-
this.canvas2dFallback.uploadForRegion(regionNumber, data)
226+
if (this.fallback) {
227+
this.fallback.uploadForRegion(regionNumber, data)
233228
return
234229
}
235230
const device = CanvasFeatureRenderer.device
@@ -303,12 +298,8 @@ export class CanvasFeatureRenderer {
303298
blocks: FeatureRenderBlock[],
304299
state: { scrollY: number; canvasWidth: number; canvasHeight: number },
305300
) {
306-
if (this.glFallback) {
307-
this.glFallback.renderBlocks(blocks, state)
308-
return
309-
}
310-
if (this.canvas2dFallback) {
311-
this.canvas2dFallback.renderBlocks(blocks, state)
301+
if (this.fallback) {
302+
this.fallback.renderBlocks(blocks, state)
312303
return
313304
}
314305
const device = CanvasFeatureRenderer.device
@@ -474,12 +465,8 @@ export class CanvasFeatureRenderer {
474465
}
475466

476467
pruneStaleRegions(activeRegions: number[]) {
477-
if (this.glFallback) {
478-
this.glFallback.pruneStaleRegions(new Set(activeRegions))
479-
return
480-
}
481-
if (this.canvas2dFallback) {
482-
this.canvas2dFallback.pruneStaleRegions(new Set(activeRegions))
468+
if (this.fallback) {
469+
this.fallback.pruneStaleRegions(new Set(activeRegions))
483470
return
484471
}
485472
const active = new Set<number>(activeRegions)
@@ -492,14 +479,9 @@ export class CanvasFeatureRenderer {
492479
}
493480

494481
dispose() {
495-
if (this.glFallback) {
496-
this.glFallback.destroy()
497-
this.glFallback = null
498-
return
499-
}
500-
if (this.canvas2dFallback) {
501-
this.canvas2dFallback.destroy()
502-
this.canvas2dFallback = null
482+
if (this.fallback) {
483+
this.fallback.destroy()
484+
this.fallback = null
503485
return
504486
}
505487
for (const region of this.regions.values()) {

plugins/dotplot-view/src/DotplotDisplay/DotplotRenderer.ts

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ export class DotplotRenderer {
145145
private bindGroup: GPUBindGroup | null = null
146146
private instanceCount = 0
147147

148-
private glFallback: WebGLFallback | null = null
149-
private canvas2dFallback: Canvas2DDotplotRenderer | null = null
148+
private fallback: WebGLFallback | Canvas2DDotplotRenderer | null = null
150149

151150
private constructor(canvas: HTMLCanvasElement) {
152151
this.canvas = canvas
@@ -221,7 +220,7 @@ export class DotplotRenderer {
221220

222221
async init() {
223222
if (getGpuOverride() === 'canvas2d') {
224-
this.canvas2dFallback = new Canvas2DDotplotRenderer(this.canvas)
223+
this.fallback = new Canvas2DDotplotRenderer(this.canvas)
225224
return true
226225
}
227226

@@ -238,22 +237,18 @@ export class DotplotRenderer {
238237
}
239238
}
240239
try {
241-
this.glFallback = new WebGLFallback(this.canvas)
240+
this.fallback = new WebGLFallback(this.canvas)
242241
return true
243242
} catch (e) {
244243
console.warn('[DotplotRenderer] WebGL2 fallback also failed:', e)
245-
this.canvas2dFallback = new Canvas2DDotplotRenderer(this.canvas)
244+
this.fallback = new Canvas2DDotplotRenderer(this.canvas)
246245
return true
247246
}
248247
}
249248

250249
resize(width: number, height: number) {
251-
if (this.glFallback) {
252-
this.glFallback.resize(width, height)
253-
return
254-
}
255-
if (this.canvas2dFallback) {
256-
this.canvas2dFallback.resize(width, height)
250+
if (this.fallback) {
251+
this.fallback.resize(width, height)
257252
return
258253
}
259254
const dpr = typeof window !== 'undefined' ? window.devicePixelRatio : 1
@@ -273,12 +268,8 @@ export class DotplotRenderer {
273268
colors: Float32Array
274269
instanceCount: number
275270
}) {
276-
if (this.glFallback) {
277-
this.glFallback.uploadGeometry(data)
278-
return
279-
}
280-
if (this.canvas2dFallback) {
281-
this.canvas2dFallback.uploadGeometry(data)
271+
if (this.fallback) {
272+
this.fallback.uploadGeometry(data)
282273
return
283274
}
284275

@@ -335,12 +326,8 @@ export class DotplotRenderer {
335326
scaleX: number,
336327
scaleY: number,
337328
) {
338-
if (this.glFallback) {
339-
this.glFallback.render(offsetX, offsetY, lineWidth, scaleX, scaleY)
340-
return
341-
}
342-
if (this.canvas2dFallback) {
343-
this.canvas2dFallback.render(offsetX, offsetY, lineWidth, scaleX, scaleY)
329+
if (this.fallback) {
330+
this.fallback.render(offsetX, offsetY, lineWidth, scaleX, scaleY)
344331
return
345332
}
346333

@@ -389,14 +376,9 @@ export class DotplotRenderer {
389376
}
390377

391378
dispose() {
392-
if (this.glFallback) {
393-
this.glFallback.dispose()
394-
this.glFallback = null
395-
return
396-
}
397-
if (this.canvas2dFallback) {
398-
this.canvas2dFallback.dispose()
399-
this.canvas2dFallback = null
379+
if (this.fallback) {
380+
this.fallback.dispose()
381+
this.fallback = null
400382
return
401383
}
402384
this.instanceBuffer?.destroy()

plugins/hic/src/LinearHicDisplay/components/HicRenderer.ts

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ export class HicRenderer {
3333
private gpuData: GpuData | null = null
3434
private rampTexture: GPUTexture | null = null
3535
private rampSampler: GPUSampler | null = null
36-
private glFallback: WebGLHicRenderer | null = null
37-
private canvas2dFallback: Canvas2DHicRenderer | null = null
36+
private fallback: WebGLHicRenderer | Canvas2DHicRenderer | null = null
3837

3938
private constructor(canvas: HTMLCanvasElement) {
4039
this.canvas = canvas
@@ -119,7 +118,7 @@ export class HicRenderer {
119118

120119
async init() {
121120
if (getGpuOverride() === 'canvas2d') {
122-
this.canvas2dFallback = new Canvas2DHicRenderer(this.canvas)
121+
this.fallback = new Canvas2DHicRenderer(this.canvas)
123122
return true
124123
}
125124

@@ -142,11 +141,11 @@ export class HicRenderer {
142141
}
143142
}
144143
try {
145-
this.glFallback = new WebGLHicRenderer(this.canvas)
144+
this.fallback = new WebGLHicRenderer(this.canvas)
146145
return true
147146
} catch (e) {
148147
console.warn('[HicRenderer] WebGL2 fallback also failed:', e)
149-
this.canvas2dFallback = new Canvas2DHicRenderer(this.canvas)
148+
this.fallback = new Canvas2DHicRenderer(this.canvas)
150149
return true
151150
}
152151
}
@@ -156,12 +155,8 @@ export class HicRenderer {
156155
counts: Float32Array
157156
numContacts: number
158157
}) {
159-
if (this.glFallback) {
160-
this.glFallback.uploadData(data)
161-
return
162-
}
163-
if (this.canvas2dFallback) {
164-
this.canvas2dFallback.uploadData(data)
158+
if (this.fallback) {
159+
this.fallback.uploadData(data)
165160
return
166161
}
167162

@@ -188,12 +183,8 @@ export class HicRenderer {
188183
}
189184

190185
uploadColorRamp(colors: Uint8Array) {
191-
if (this.glFallback) {
192-
this.glFallback.uploadColorRamp(colors)
193-
return
194-
}
195-
if (this.canvas2dFallback) {
196-
this.canvas2dFallback.uploadColorRamp(colors)
186+
if (this.fallback) {
187+
this.fallback.uploadColorRamp(colors)
197188
return
198189
}
199190

@@ -251,12 +242,8 @@ export class HicRenderer {
251242
}
252243

253244
render(state: HicRenderState) {
254-
if (this.glFallback) {
255-
this.glFallback.render(state)
256-
return
257-
}
258-
if (this.canvas2dFallback) {
259-
this.canvas2dFallback.render(state)
245+
if (this.fallback) {
246+
this.fallback.render(state)
260247
return
261248
}
262249

@@ -321,14 +308,9 @@ export class HicRenderer {
321308
}
322309

323310
destroy() {
324-
if (this.glFallback) {
325-
this.glFallback.destroy()
326-
this.glFallback = null
327-
return
328-
}
329-
if (this.canvas2dFallback) {
330-
this.canvas2dFallback.destroy()
331-
this.canvas2dFallback = null
311+
if (this.fallback) {
312+
this.fallback.destroy()
313+
this.fallback = null
332314
return
333315
}
334316
this.gpuData?.instanceBuffer.destroy()

0 commit comments

Comments
 (0)