@jbrowse/render-core 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/esm/OverlayCanvas.d.ts +29 -0
- package/esm/OverlayCanvas.js +43 -0
- package/esm/RenderCanvas.d.ts +76 -0
- package/esm/RenderCanvas.js +38 -0
- package/esm/RenderLifecycleMixin.d.ts +180 -0
- package/esm/RenderLifecycleMixin.js +279 -0
- package/esm/ScrollLockedOverlay.d.ts +28 -0
- package/esm/ScrollLockedOverlay.js +42 -0
- package/esm/blockClipUtils.d.ts +27 -0
- package/esm/blockClipUtils.js +101 -0
- package/esm/canvas2dUtils.d.ts +372 -0
- package/esm/canvas2dUtils.js +564 -0
- package/esm/canvasContext.d.ts +68 -0
- package/esm/canvasContext.js +74 -0
- package/esm/colorRampLut.d.ts +17 -0
- package/esm/colorRampLut.js +25 -0
- package/esm/coverageBand.d.ts +107 -0
- package/esm/coverageBand.js +109 -0
- package/esm/coverageBandBuffers.d.ts +30 -0
- package/esm/coverageBandBuffers.js +13 -0
- package/esm/createRenderingBackend.d.ts +52 -0
- package/esm/createRenderingBackend.js +58 -0
- package/esm/displayPhase.d.ts +155 -0
- package/esm/displayPhase.js +97 -0
- package/esm/globalRenderingBackend.d.ts +90 -0
- package/esm/globalRenderingBackend.js +53 -0
- package/esm/gpuDevice.d.ts +91 -0
- package/esm/gpuDevice.js +277 -0
- package/esm/graphicsCapabilities.d.ts +98 -0
- package/esm/graphicsCapabilities.js +165 -0
- package/esm/hal/createHal.d.ts +22 -0
- package/esm/hal/createHal.js +91 -0
- package/esm/hal/deviceGpuCache.d.ts +36 -0
- package/esm/hal/deviceGpuCache.js +120 -0
- package/esm/hal/gpuHalBase.d.ts +55 -0
- package/esm/hal/gpuHalBase.js +81 -0
- package/esm/hal/index.d.ts +7 -0
- package/esm/hal/index.js +5 -0
- package/esm/hal/mockHal.d.ts +153 -0
- package/esm/hal/mockHal.js +297 -0
- package/esm/hal/oomReporter.d.ts +15 -0
- package/esm/hal/oomReporter.js +22 -0
- package/esm/hal/passIds.d.ts +22 -0
- package/esm/hal/passIds.js +36 -0
- package/esm/hal/regionRegistry.d.ts +11 -0
- package/esm/hal/regionRegistry.js +66 -0
- package/esm/hal/types.d.ts +116 -0
- package/esm/hal/types.js +1 -0
- package/esm/hal/webgl2Hal.d.ts +47 -0
- package/esm/hal/webgl2Hal.js +490 -0
- package/esm/hal/webgpuHal.d.ts +169 -0
- package/esm/hal/webgpuHal.js +722 -0
- package/esm/installUpload.d.ts +91 -0
- package/esm/installUpload.js +94 -0
- package/esm/instanceCache.d.ts +43 -0
- package/esm/instanceCache.js +53 -0
- package/esm/instancePass.d.ts +50 -0
- package/esm/instancePass.js +34 -0
- package/esm/keyedRenderingBackend.d.ts +41 -0
- package/esm/keyedRenderingBackend.js +19 -0
- package/esm/mapUploadSync.d.ts +31 -0
- package/esm/mapUploadSync.js +45 -0
- package/esm/namedReactions.d.ts +29 -0
- package/esm/namedReactions.js +62 -0
- package/esm/perRegionRenderingBackend.d.ts +114 -0
- package/esm/perRegionRenderingBackend.js +93 -0
- package/esm/recoveryBudget.d.ts +40 -0
- package/esm/recoveryBudget.js +56 -0
- package/esm/regionDataMap.d.ts +60 -0
- package/esm/regionDataMap.js +98 -0
- package/esm/renderBlock.d.ts +25 -0
- package/esm/renderBlock.js +10 -0
- package/esm/renderingBackendBase.d.ts +71 -0
- package/esm/renderingBackendBase.js +50 -0
- package/esm/shaders/antialias.js.generated.d.ts +4 -0
- package/esm/shaders/antialias.js.generated.js +25 -0
- package/esm/shaders/capsule.generated.d.ts +1 -0
- package/esm/shaders/capsule.generated.js +3 -0
- package/esm/shaders/colorRampLut.generated.d.ts +1 -0
- package/esm/shaders/colorRampLut.generated.js +3 -0
- package/esm/shaders/coverageBand.generated.d.ts +2 -0
- package/esm/shaders/coverageBand.generated.js +4 -0
- package/esm/shaders/coverageBar.generated.d.ts +4 -0
- package/esm/shaders/coverageBar.generated.js +6 -0
- package/esm/shaders/coverageBar.iface.generated.d.ts +85 -0
- package/esm/shaders/coverageBar.iface.generated.js +114 -0
- package/esm/shaders/coverageIndicator.generated.d.ts +4 -0
- package/esm/shaders/coverageIndicator.generated.js +6 -0
- package/esm/shaders/coverageIndicator.iface.generated.d.ts +85 -0
- package/esm/shaders/coverageIndicator.iface.generated.js +114 -0
- package/esm/shaders/coverageInterbase.generated.d.ts +4 -0
- package/esm/shaders/coverageInterbase.generated.js +6 -0
- package/esm/shaders/coverageInterbase.iface.generated.d.ts +93 -0
- package/esm/shaders/coverageInterbase.iface.generated.js +134 -0
- package/esm/shaders/coverageMod.generated.d.ts +4 -0
- package/esm/shaders/coverageMod.generated.js +6 -0
- package/esm/shaders/coverageMod.iface.generated.d.ts +97 -0
- package/esm/shaders/coverageMod.iface.generated.js +144 -0
- package/esm/shaders/coverageSnp.generated.d.ts +4 -0
- package/esm/shaders/coverageSnp.generated.js +6 -0
- package/esm/shaders/coverageSnp.iface.generated.d.ts +97 -0
- package/esm/shaders/coverageSnp.iface.generated.js +144 -0
- package/esm/shaders/hpmath.js.generated.d.ts +3 -0
- package/esm/shaders/hpmath.js.generated.js +48 -0
- package/esm/shaders/pointGlyph.generated.d.ts +1 -0
- package/esm/shaders/pointGlyph.generated.js +3 -0
- package/esm/shaders/pointGlyph.js.generated.d.ts +1 -0
- package/esm/shaders/pointGlyph.js.generated.js +7 -0
- package/esm/shaders/rowRect.generated.d.ts +3 -0
- package/esm/shaders/rowRect.generated.js +5 -0
- package/esm/shaders/rowRect.js.generated.d.ts +2 -0
- package/esm/shaders/rowRect.js.generated.js +13 -0
- package/esm/shaders/scoreScale.js.generated.d.ts +1 -0
- package/esm/shaders/scoreScale.js.generated.js +46 -0
- package/esm/slangPass.d.ts +49 -0
- package/esm/slangPass.js +22 -0
- package/esm/useEventCallback.d.ts +1 -0
- package/esm/useEventCallback.js +19 -0
- package/esm/useGraphicsCapabilities.d.ts +17 -0
- package/esm/useGraphicsCapabilities.js +38 -0
- package/esm/useRenderingBackend.d.ts +83 -0
- package/esm/useRenderingBackend.js +422 -0
- package/esm/useTabVisibilityRerender.d.ts +13 -0
- package/esm/useTabVisibilityRerender.js +39 -0
- package/esm/webgpuUtils.d.ts +23 -0
- package/esm/webgpuUtils.js +76 -0
- package/package.json +91 -0
- package/src/shaders/antialias.js.generated.ts +33 -0
- package/src/shaders/antialias.slang +112 -0
- package/src/shaders/capsule.generated.ts +4 -0
- package/src/shaders/capsule.slang +62 -0
- package/src/shaders/colorPack.slang +26 -0
- package/src/shaders/colorRampLut.generated.ts +4 -0
- package/src/shaders/colorRampLut.slang +51 -0
- package/src/shaders/coverageBand.generated.ts +6 -0
- package/src/shaders/coverageBand.slang +276 -0
- package/src/shaders/coverageBar.generated.ts +10 -0
- package/src/shaders/coverageBar.iface.generated.ts +172 -0
- package/src/shaders/coverageBar.slang +37 -0
- package/src/shaders/coverageIndicator.generated.ts +10 -0
- package/src/shaders/coverageIndicator.iface.generated.ts +172 -0
- package/src/shaders/coverageIndicator.slang +61 -0
- package/src/shaders/coverageInterbase.generated.ts +10 -0
- package/src/shaders/coverageInterbase.iface.generated.ts +198 -0
- package/src/shaders/coverageInterbase.slang +63 -0
- package/src/shaders/coverageMod.generated.ts +10 -0
- package/src/shaders/coverageMod.iface.generated.ts +211 -0
- package/src/shaders/coverageMod.slang +36 -0
- package/src/shaders/coverageSnp.generated.ts +10 -0
- package/src/shaders/coverageSnp.iface.generated.ts +211 -0
- package/src/shaders/coverageSnp.slang +52 -0
- package/src/shaders/diagonalGrid.slang +25 -0
- package/src/shaders/glyphEdgeAlpha.test.ts +241 -0
- package/src/shaders/hpmath.js.generated.ts +47 -0
- package/src/shaders/hpmath.slang +226 -0
- package/src/shaders/pointGlyph.generated.ts +4 -0
- package/src/shaders/pointGlyph.js.generated.ts +9 -0
- package/src/shaders/pointGlyph.slang +93 -0
- package/src/shaders/rowRect.generated.ts +8 -0
- package/src/shaders/rowRect.js.generated.ts +17 -0
- package/src/shaders/rowRect.slang +160 -0
- package/src/shaders/scoreScale.js.generated.ts +51 -0
- package/src/shaders/scoreScale.slang +68 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageMod.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal'
|
|
5
|
+
|
|
6
|
+
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u' },
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
export const VERTS_PER_INSTANCE = 6
|
|
11
|
+
|
|
12
|
+
export const UNIFORMS_SIZE_BYTES = 112
|
|
13
|
+
|
|
14
|
+
// Word indices into a Float32Array view over the uniform buffer.
|
|
15
|
+
export const UNIFORM_OFFSET_F32 = {
|
|
16
|
+
bpHi: 0,
|
|
17
|
+
bpLo: 1,
|
|
18
|
+
bpLen: 2,
|
|
19
|
+
hpZero: 3,
|
|
20
|
+
canvasW: 4,
|
|
21
|
+
canvasH: 5,
|
|
22
|
+
covHeight: 6,
|
|
23
|
+
covYOffset: 7,
|
|
24
|
+
covTop: 8,
|
|
25
|
+
regionMaxDepth: 9,
|
|
26
|
+
depthDomainMax: 10,
|
|
27
|
+
depthDomainMin: 11,
|
|
28
|
+
coverageSymlogConstant: 12,
|
|
29
|
+
binSize: 13,
|
|
30
|
+
interbaseHeight: 14,
|
|
31
|
+
snpMinFreq: 15,
|
|
32
|
+
reversed: 16,
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
// Word indices into a Uint32Array view over the uniform buffer.
|
|
36
|
+
export const UNIFORM_OFFSET_U32 = {
|
|
37
|
+
colorCoverage: 18,
|
|
38
|
+
colorBaseA: 19,
|
|
39
|
+
colorBaseC: 20,
|
|
40
|
+
colorBaseG: 21,
|
|
41
|
+
colorBaseT: 22,
|
|
42
|
+
colorBaseN: 23,
|
|
43
|
+
colorInsertionIndicator: 24,
|
|
44
|
+
colorSoftclipIndicator: 25,
|
|
45
|
+
colorHardclipIndicator: 26,
|
|
46
|
+
} as const
|
|
47
|
+
|
|
48
|
+
// Word indices into a Int32Array view over the uniform buffer.
|
|
49
|
+
export const UNIFORM_OFFSET_I32 = {
|
|
50
|
+
coverageScaleType: 17,
|
|
51
|
+
} as const
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export interface Uniforms {
|
|
55
|
+
bpHi: number
|
|
56
|
+
bpLo: number
|
|
57
|
+
bpLen: number
|
|
58
|
+
hpZero: number
|
|
59
|
+
canvasW: number
|
|
60
|
+
canvasH: number
|
|
61
|
+
covHeight: number
|
|
62
|
+
covYOffset: number
|
|
63
|
+
covTop: number
|
|
64
|
+
regionMaxDepth: number
|
|
65
|
+
depthDomainMax: number
|
|
66
|
+
depthDomainMin: number
|
|
67
|
+
coverageSymlogConstant: number
|
|
68
|
+
binSize: number
|
|
69
|
+
interbaseHeight: number
|
|
70
|
+
snpMinFreq: number
|
|
71
|
+
reversed: number
|
|
72
|
+
coverageScaleType: number
|
|
73
|
+
colorCoverage: number
|
|
74
|
+
colorBaseA: number
|
|
75
|
+
colorBaseC: number
|
|
76
|
+
colorBaseG: number
|
|
77
|
+
colorBaseT: number
|
|
78
|
+
colorBaseN: number
|
|
79
|
+
colorInsertionIndicator: number
|
|
80
|
+
colorSoftclipIndicator: number
|
|
81
|
+
colorHardclipIndicator: number
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
|
|
85
|
+
const f32 = new Float32Array(buf)
|
|
86
|
+
const u32 = new Uint32Array(buf)
|
|
87
|
+
const i32 = new Int32Array(buf)
|
|
88
|
+
f32[0] = uniforms.bpHi
|
|
89
|
+
f32[1] = uniforms.bpLo
|
|
90
|
+
f32[2] = uniforms.bpLen
|
|
91
|
+
f32[3] = uniforms.hpZero
|
|
92
|
+
f32[4] = uniforms.canvasW
|
|
93
|
+
f32[5] = uniforms.canvasH
|
|
94
|
+
f32[6] = uniforms.covHeight
|
|
95
|
+
f32[7] = uniforms.covYOffset
|
|
96
|
+
f32[8] = uniforms.covTop
|
|
97
|
+
f32[9] = uniforms.regionMaxDepth
|
|
98
|
+
f32[10] = uniforms.depthDomainMax
|
|
99
|
+
f32[11] = uniforms.depthDomainMin
|
|
100
|
+
f32[12] = uniforms.coverageSymlogConstant
|
|
101
|
+
f32[13] = uniforms.binSize
|
|
102
|
+
f32[14] = uniforms.interbaseHeight
|
|
103
|
+
f32[15] = uniforms.snpMinFreq
|
|
104
|
+
f32[16] = uniforms.reversed
|
|
105
|
+
i32[17] = uniforms.coverageScaleType
|
|
106
|
+
u32[18] = uniforms.colorCoverage
|
|
107
|
+
u32[19] = uniforms.colorBaseA
|
|
108
|
+
u32[20] = uniforms.colorBaseC
|
|
109
|
+
u32[21] = uniforms.colorBaseG
|
|
110
|
+
u32[22] = uniforms.colorBaseT
|
|
111
|
+
u32[23] = uniforms.colorBaseN
|
|
112
|
+
u32[24] = uniforms.colorInsertionIndicator
|
|
113
|
+
u32[25] = uniforms.colorSoftclipIndicator
|
|
114
|
+
u32[26] = uniforms.colorHardclipIndicator
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export const INSTANCE_STRIDE_BYTES = 20
|
|
118
|
+
export const INSTANCE_STRIDE_WORDS = 5
|
|
119
|
+
|
|
120
|
+
// Word indices into a Float32Array view over the instance buffer.
|
|
121
|
+
export const INSTANCE_OFFSET_F32 = {
|
|
122
|
+
yOffset: 1,
|
|
123
|
+
segHeight: 2,
|
|
124
|
+
relDepth: 4,
|
|
125
|
+
} as const
|
|
126
|
+
|
|
127
|
+
// Word indices into a Uint32Array view over the instance buffer.
|
|
128
|
+
export const INSTANCE_OFFSET_U32 = {
|
|
129
|
+
position: 0,
|
|
130
|
+
packedColor: 3,
|
|
131
|
+
} as const
|
|
132
|
+
|
|
133
|
+
export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
|
|
134
|
+
{ name: 'a_position', components: 1, type: 'uint', offsetBytes: 0, integer: true },
|
|
135
|
+
{ name: 'a_yOffset', components: 1, type: 'float', offsetBytes: 4, integer: false },
|
|
136
|
+
{ name: 'a_segHeight', components: 1, type: 'float', offsetBytes: 8, integer: false },
|
|
137
|
+
{ name: 'a_packedColor', components: 1, type: 'uint', offsetBytes: 12, integer: true },
|
|
138
|
+
{ name: 'a_relDepth', components: 1, type: 'float', offsetBytes: 16, integer: false },
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
export interface InstanceArrays {
|
|
142
|
+
position: ArrayLike<number>
|
|
143
|
+
yOffset: ArrayLike<number>
|
|
144
|
+
segHeight: ArrayLike<number>
|
|
145
|
+
packedColor: ArrayLike<number>
|
|
146
|
+
relDepth: ArrayLike<number>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function packInstances(
|
|
150
|
+
arrays: InstanceArrays,
|
|
151
|
+
numInstances: number,
|
|
152
|
+
buf: ArrayBuffer = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES),
|
|
153
|
+
) {
|
|
154
|
+
const f32 = new Float32Array(buf)
|
|
155
|
+
const u32 = new Uint32Array(buf)
|
|
156
|
+
const { position, yOffset, segHeight, packedColor, relDepth } = arrays
|
|
157
|
+
for (let i = 0; i < numInstances; i++) {
|
|
158
|
+
const o = i * INSTANCE_STRIDE_WORDS
|
|
159
|
+
u32[o + 0] = position[i]!
|
|
160
|
+
f32[o + 1] = yOffset[i]!
|
|
161
|
+
f32[o + 2] = segHeight[i]!
|
|
162
|
+
u32[o + 3] = packedColor[i]!
|
|
163
|
+
f32[o + 4] = relDepth[i]!
|
|
164
|
+
}
|
|
165
|
+
return buf
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Instance `i`'s `position`.
|
|
169
|
+
export function getInstancePosition(u32: Uint32Array, i: number) {
|
|
170
|
+
return u32[i * INSTANCE_STRIDE_WORDS]!
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function setInstancePosition(u32: Uint32Array, i: number, v: number) {
|
|
174
|
+
u32[i * INSTANCE_STRIDE_WORDS] = v
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Instance `i`'s `yOffset`.
|
|
178
|
+
export function getInstanceYOffset(f32: Float32Array, i: number) {
|
|
179
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 1]!
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function setInstanceYOffset(f32: Float32Array, i: number, v: number) {
|
|
183
|
+
f32[i * INSTANCE_STRIDE_WORDS + 1] = v
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Instance `i`'s `segHeight`.
|
|
187
|
+
export function getInstanceSegHeight(f32: Float32Array, i: number) {
|
|
188
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 2]!
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function setInstanceSegHeight(f32: Float32Array, i: number, v: number) {
|
|
192
|
+
f32[i * INSTANCE_STRIDE_WORDS + 2] = v
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Instance `i`'s `packedColor`.
|
|
196
|
+
export function getInstancePackedColor(u32: Uint32Array, i: number) {
|
|
197
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 3]!
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function setInstancePackedColor(u32: Uint32Array, i: number, v: number) {
|
|
201
|
+
u32[i * INSTANCE_STRIDE_WORDS + 3] = v
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Instance `i`'s `relDepth`.
|
|
205
|
+
export function getInstanceRelDepth(f32: Float32Array, i: number) {
|
|
206
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 4]!
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function setInstanceRelDepth(f32: Float32Array, i: number, v: number) {
|
|
210
|
+
f32[i * INSTANCE_STRIDE_WORDS + 4] = v
|
|
211
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Base-modification segments stacked on the coverage bars. Carries a
|
|
2
|
+
// per-instance packed ABGR color because modifications have many possible types
|
|
3
|
+
// + strengths that don't fit in palette slots — otherwise identical to
|
|
4
|
+
// coverageSnp.slang. See coverageBand.slang.
|
|
5
|
+
//! targets: wgsl, glsl
|
|
6
|
+
//! layout-out: packages/alignments-core/src/modCoverageLayout.generated.ts
|
|
7
|
+
|
|
8
|
+
import coverageBand;
|
|
9
|
+
import colorPack;
|
|
10
|
+
import hpmath;
|
|
11
|
+
|
|
12
|
+
public static const uint VERTS_PER_INSTANCE = 6u;
|
|
13
|
+
[[vk::binding(1, 0)]] ConstantBuffer<CoverageBandUniforms> u;
|
|
14
|
+
|
|
15
|
+
// See coverageSnp.slang for the per-position fraction contract.
|
|
16
|
+
struct Instance {
|
|
17
|
+
uint position : ATTR0;
|
|
18
|
+
float yOffset : ATTR1;
|
|
19
|
+
float segHeight : ATTR2;
|
|
20
|
+
uint packedColor : ATTR3;
|
|
21
|
+
float relDepth : ATTR4;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
[shader("vertex")]
|
|
25
|
+
CoverageVsOut vs_main(Instance inst, uint vid : SV_VertexID) {
|
|
26
|
+
CoverageVsOut o;
|
|
27
|
+
o.position = covSegQuad(inst.position, 1u, inst.yOffset, inst.segHeight,
|
|
28
|
+
inst.relDepth, quadLocal(vid), u);
|
|
29
|
+
o.color = unpackRGBA(inst.packedColor);
|
|
30
|
+
return o;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
[shader("fragment")]
|
|
34
|
+
float4 fs_main(CoverageVsOut fragIn) : SV_Target {
|
|
35
|
+
return fragIn.color;
|
|
36
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageSnp.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nstruct CoverageVsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nfn covDiscardVertex_0() -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S1 : vec4<f32> = vec4<f32>(0.0f);\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S2 : bool = v_0 == u32(0);\n var _S3 : bool;\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(2);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(3);\n }\n var _S4 : f32;\n if(_S3)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(1);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(4);\n }\n var _S5 : f32;\n if(_S3)\n {\n _S5 = 0.0f;\n }\n else\n {\n _S5 = 1.0f;\n }\n return vec2<f32>(_S4, _S5);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S6 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S7 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S7, mid_0 + _S7);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covAreaTop_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return yPxToClipY_0((*u_2).covTop_0, (*u_2).canvasH_0);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBottom_0( u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S8 : f32 = covAreaTop_0(&((*u_3)));\n return _S8 - covBottomOffsetPx_0((*u_3).covHeight_0, (*u_3).covYOffset_0) / (*u_3).canvasH_0 * 2.0f;\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_4).regionMaxDepth_0, (*u_4).depthDomainMin_0, (*u_4).depthDomainMax_0, (*u_4).coverageScaleType_0, (*u_4).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_5).covHeight_0, (*u_5).covYOffset_0);\n}\n\nfn covBarScale_0( relDepth_1 : f32, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S9 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_6)));\n var _S10 : f32 = covEffHeight_0(&((*u_6)));\n return _S9 * _S10 / (*u_6).canvasH_0 * 2.0f;\n}\n\nfn covFlipX_0( x_1 : f32, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_7).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S11 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_8)));\n return vec4<f32>(_S11, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_1 : u32, widthBp_0 : u32, yOffset_0 : f32, segHeight_0 : f32, relDepth_2 : f32, local_1 : vec2<f32>, u_9 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S12 : f32 = covBpToClipX_0(position_1, &((*u_9)));\n var _S13 : f32 = covBpToClipX_0(position_1 + widthBp_0, &((*u_9)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S12, _S13, (*u_9).canvasW_0);\n var _S14 : f32 = covBottom_0(&((*u_9)));\n var _S15 : f32 = covBarScale_0(relDepth_2, &((*u_9)));\n var segBot_0 : f32 = _S14 + yOffset_0 * _S15;\n var _S16 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * _S15, local_1, &((*u_9)));\n return _S16;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn covSnpColor_0( ct_0 : f32, u_10 : ptr<function, CoverageBandUniforms_std140_0>) -> vec3<f32>\n{\n switch(i32(ct_0))\n {\n case i32(1):\n {\n return unpackRGBA_0((*u_10).colorBaseA_0).xyz;\n }\n case i32(2):\n {\n return unpackRGBA_0((*u_10).colorBaseC_0).xyz;\n }\n case i32(3):\n {\n return unpackRGBA_0((*u_10).colorBaseG_0).xyz;\n }\n case i32(4):\n {\n return unpackRGBA_0((*u_10).colorBaseT_0).xyz;\n }\n default :\n {\n return unpackRGBA_0((*u_10).colorBaseN_0).xyz;\n }\n }\n}\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_1 : f32,\n @location(2) segHeight_1 : f32,\n @location(3) colorType_0 : f32,\n @location(4) relDepth_3 : f32,\n};\n\n@vertex\nfn vs_main( _S17 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n if((_S17.segHeight_1) < (u_0.snpMinFreq_0))\n {\n return covDiscardVertex_0();\n }\n var o_1 : CoverageVsOut_0;\n var _S18 : vec2<f32> = quadLocal_0(vid_1);\n var _S19 : CoverageBandUniforms_std140_0 = u_0;\n var _S20 : vec4<f32> = covSegQuad_0(_S17.position_2, u32(1), _S17.yOffset_1, _S17.segHeight_1, _S17.relDepth_3, _S18, &(_S19));\n o_1.position_0 = _S20;\n var _S21 : vec3<f32> = covSnpColor_0(_S17.colorType_0, &(_S19));\n o_1.color_0 = vec4<f32>(_S21, 1.0f);\n return o_1;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S22 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S23 : pixelOutput_0 = pixelOutput_0( _S22.color_1 );\n return _S23;\n}\n\n"
|
|
5
|
+
|
|
6
|
+
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nstruct CoverageVsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n};\n\n\n\nCoverageVsOut_0 covDiscardVertex_0()\n{\n\n CoverageVsOut_0 o_0;\n const vec4 _S1 = vec4(0.0);\n\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S2 = v_0 == 0U;\n\n bool _S3;\n\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 2U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 3U;\n\n }\n\n float _S4;\n\n if(_S3)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 1U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 4U;\n\n }\n\n float _S5;\n\n if(_S3)\n {\n\n _S5 = 0.0;\n\n }\n else\n {\n\n _S5 = 1.0;\n\n }\n\n return vec2(_S4, _S5);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S6 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S7 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S7, mid_0 + _S7);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covAreaTop_0(CoverageBandUniforms_0 u_2)\n{\n\n return yPxToClipY_0(u_2.covTop_0, u_2.canvasH_0);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBottom_0(CoverageBandUniforms_0 u_3)\n{\n\n return covAreaTop_0(u_3) - covBottomOffsetPx_0(u_3.covHeight_0, u_3.covYOffset_0) / u_3.canvasH_0 * 2.0;\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_4)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_4.regionMaxDepth_0, u_4.depthDomainMin_0, u_4.depthDomainMax_0, u_4.coverageScaleType_0, u_4.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_5)\n{\n\n return covEffectiveHeightPx_0(u_5.covHeight_0, u_5.covYOffset_0);\n}\n\n\nfloat covBarScale_0(float relDepth_1, CoverageBandUniforms_0 u_6)\n{\n\n return covNormalizeDepth_0(relDepth_1, u_6) * covEffHeight_0(u_6) / u_6.canvasH_0 * 2.0;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_7)\n{\n\n return mix(x_1, - x_1, u_7.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_8)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_8), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_1, uint widthBp_0, float yOffset_0, float segHeight_0, float relDepth_2, vec2 local_1, CoverageBandUniforms_0 u_9)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_1, u_9), covBpToClipX_0(position_1 + widthBp_0, u_9), u_9.canvasW_0);\n\n\n float k_0 = covBarScale_0(relDepth_2, u_9);\n float segBot_0 = covBottom_0(u_9) + yOffset_0 * k_0;\n\n return covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * k_0, local_1, u_9);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nvec3 covSnpColor_0(float ct_0, CoverageBandUniforms_0 u_10)\n{\n\n switch(int(ct_0))\n {\n case 1:\n {\n\n return unpackRGBA_0(u_10.colorBaseA_0).xyz;\n }\n case 2:\n {\n\n return unpackRGBA_0(u_10.colorBaseC_0).xyz;\n }\n case 3:\n {\n\n return unpackRGBA_0(u_10.colorBaseG_0).xyz;\n }\n case 4:\n {\n\n return unpackRGBA_0(u_10.colorBaseT_0).xyz;\n }\n default:\n {\n\n return unpackRGBA_0(u_10.colorBaseN_0).xyz;\n }\n }\n\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin float a_colorType;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nvoid main()\n{\n\n if(a_segHeight < (u_0.snpMinFreq_0))\n {\n\n CoverageVsOut_0 _S8 = covDiscardVertex_0();\n\n gl_Position = _S8.position_0;\n\n v_color = _S8.color_0;\n\n return;\n }\n CoverageVsOut_0 o_1;\n\n CoverageBandUniforms_0 _S9 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_1.position_0 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S9);\n\n o_1.color_0 = vec4(covSnpColor_0(a_colorType, _S9), 1.0);\n CoverageVsOut_0 _S10 = o_1;\n\n gl_Position = o_1.position_0;\n\n v_color = _S10.color_0;\n\n return;\n}\n\n"
|
|
7
|
+
|
|
8
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
|
|
9
|
+
|
|
10
|
+
export * from './coverageSnp.iface.generated.ts'
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageSnp.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal'
|
|
5
|
+
|
|
6
|
+
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u' },
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
export const VERTS_PER_INSTANCE = 6
|
|
11
|
+
|
|
12
|
+
export const UNIFORMS_SIZE_BYTES = 112
|
|
13
|
+
|
|
14
|
+
// Word indices into a Float32Array view over the uniform buffer.
|
|
15
|
+
export const UNIFORM_OFFSET_F32 = {
|
|
16
|
+
bpHi: 0,
|
|
17
|
+
bpLo: 1,
|
|
18
|
+
bpLen: 2,
|
|
19
|
+
hpZero: 3,
|
|
20
|
+
canvasW: 4,
|
|
21
|
+
canvasH: 5,
|
|
22
|
+
covHeight: 6,
|
|
23
|
+
covYOffset: 7,
|
|
24
|
+
covTop: 8,
|
|
25
|
+
regionMaxDepth: 9,
|
|
26
|
+
depthDomainMax: 10,
|
|
27
|
+
depthDomainMin: 11,
|
|
28
|
+
coverageSymlogConstant: 12,
|
|
29
|
+
binSize: 13,
|
|
30
|
+
interbaseHeight: 14,
|
|
31
|
+
snpMinFreq: 15,
|
|
32
|
+
reversed: 16,
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
// Word indices into a Uint32Array view over the uniform buffer.
|
|
36
|
+
export const UNIFORM_OFFSET_U32 = {
|
|
37
|
+
colorCoverage: 18,
|
|
38
|
+
colorBaseA: 19,
|
|
39
|
+
colorBaseC: 20,
|
|
40
|
+
colorBaseG: 21,
|
|
41
|
+
colorBaseT: 22,
|
|
42
|
+
colorBaseN: 23,
|
|
43
|
+
colorInsertionIndicator: 24,
|
|
44
|
+
colorSoftclipIndicator: 25,
|
|
45
|
+
colorHardclipIndicator: 26,
|
|
46
|
+
} as const
|
|
47
|
+
|
|
48
|
+
// Word indices into a Int32Array view over the uniform buffer.
|
|
49
|
+
export const UNIFORM_OFFSET_I32 = {
|
|
50
|
+
coverageScaleType: 17,
|
|
51
|
+
} as const
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export interface Uniforms {
|
|
55
|
+
bpHi: number
|
|
56
|
+
bpLo: number
|
|
57
|
+
bpLen: number
|
|
58
|
+
hpZero: number
|
|
59
|
+
canvasW: number
|
|
60
|
+
canvasH: number
|
|
61
|
+
covHeight: number
|
|
62
|
+
covYOffset: number
|
|
63
|
+
covTop: number
|
|
64
|
+
regionMaxDepth: number
|
|
65
|
+
depthDomainMax: number
|
|
66
|
+
depthDomainMin: number
|
|
67
|
+
coverageSymlogConstant: number
|
|
68
|
+
binSize: number
|
|
69
|
+
interbaseHeight: number
|
|
70
|
+
snpMinFreq: number
|
|
71
|
+
reversed: number
|
|
72
|
+
coverageScaleType: number
|
|
73
|
+
colorCoverage: number
|
|
74
|
+
colorBaseA: number
|
|
75
|
+
colorBaseC: number
|
|
76
|
+
colorBaseG: number
|
|
77
|
+
colorBaseT: number
|
|
78
|
+
colorBaseN: number
|
|
79
|
+
colorInsertionIndicator: number
|
|
80
|
+
colorSoftclipIndicator: number
|
|
81
|
+
colorHardclipIndicator: number
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
|
|
85
|
+
const f32 = new Float32Array(buf)
|
|
86
|
+
const u32 = new Uint32Array(buf)
|
|
87
|
+
const i32 = new Int32Array(buf)
|
|
88
|
+
f32[0] = uniforms.bpHi
|
|
89
|
+
f32[1] = uniforms.bpLo
|
|
90
|
+
f32[2] = uniforms.bpLen
|
|
91
|
+
f32[3] = uniforms.hpZero
|
|
92
|
+
f32[4] = uniforms.canvasW
|
|
93
|
+
f32[5] = uniforms.canvasH
|
|
94
|
+
f32[6] = uniforms.covHeight
|
|
95
|
+
f32[7] = uniforms.covYOffset
|
|
96
|
+
f32[8] = uniforms.covTop
|
|
97
|
+
f32[9] = uniforms.regionMaxDepth
|
|
98
|
+
f32[10] = uniforms.depthDomainMax
|
|
99
|
+
f32[11] = uniforms.depthDomainMin
|
|
100
|
+
f32[12] = uniforms.coverageSymlogConstant
|
|
101
|
+
f32[13] = uniforms.binSize
|
|
102
|
+
f32[14] = uniforms.interbaseHeight
|
|
103
|
+
f32[15] = uniforms.snpMinFreq
|
|
104
|
+
f32[16] = uniforms.reversed
|
|
105
|
+
i32[17] = uniforms.coverageScaleType
|
|
106
|
+
u32[18] = uniforms.colorCoverage
|
|
107
|
+
u32[19] = uniforms.colorBaseA
|
|
108
|
+
u32[20] = uniforms.colorBaseC
|
|
109
|
+
u32[21] = uniforms.colorBaseG
|
|
110
|
+
u32[22] = uniforms.colorBaseT
|
|
111
|
+
u32[23] = uniforms.colorBaseN
|
|
112
|
+
u32[24] = uniforms.colorInsertionIndicator
|
|
113
|
+
u32[25] = uniforms.colorSoftclipIndicator
|
|
114
|
+
u32[26] = uniforms.colorHardclipIndicator
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export const INSTANCE_STRIDE_BYTES = 20
|
|
118
|
+
export const INSTANCE_STRIDE_WORDS = 5
|
|
119
|
+
|
|
120
|
+
// Word indices into a Float32Array view over the instance buffer.
|
|
121
|
+
export const INSTANCE_OFFSET_F32 = {
|
|
122
|
+
yOffset: 1,
|
|
123
|
+
segHeight: 2,
|
|
124
|
+
colorType: 3,
|
|
125
|
+
relDepth: 4,
|
|
126
|
+
} as const
|
|
127
|
+
|
|
128
|
+
// Word indices into a Uint32Array view over the instance buffer.
|
|
129
|
+
export const INSTANCE_OFFSET_U32 = {
|
|
130
|
+
position: 0,
|
|
131
|
+
} as const
|
|
132
|
+
|
|
133
|
+
export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
|
|
134
|
+
{ name: 'a_position', components: 1, type: 'uint', offsetBytes: 0, integer: true },
|
|
135
|
+
{ name: 'a_yOffset', components: 1, type: 'float', offsetBytes: 4, integer: false },
|
|
136
|
+
{ name: 'a_segHeight', components: 1, type: 'float', offsetBytes: 8, integer: false },
|
|
137
|
+
{ name: 'a_colorType', components: 1, type: 'float', offsetBytes: 12, integer: false },
|
|
138
|
+
{ name: 'a_relDepth', components: 1, type: 'float', offsetBytes: 16, integer: false },
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
export interface InstanceArrays {
|
|
142
|
+
position: ArrayLike<number>
|
|
143
|
+
yOffset: ArrayLike<number>
|
|
144
|
+
segHeight: ArrayLike<number>
|
|
145
|
+
colorType: ArrayLike<number>
|
|
146
|
+
relDepth: ArrayLike<number>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function packInstances(
|
|
150
|
+
arrays: InstanceArrays,
|
|
151
|
+
numInstances: number,
|
|
152
|
+
buf: ArrayBuffer = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES),
|
|
153
|
+
) {
|
|
154
|
+
const f32 = new Float32Array(buf)
|
|
155
|
+
const u32 = new Uint32Array(buf)
|
|
156
|
+
const { position, yOffset, segHeight, colorType, relDepth } = arrays
|
|
157
|
+
for (let i = 0; i < numInstances; i++) {
|
|
158
|
+
const o = i * INSTANCE_STRIDE_WORDS
|
|
159
|
+
u32[o + 0] = position[i]!
|
|
160
|
+
f32[o + 1] = yOffset[i]!
|
|
161
|
+
f32[o + 2] = segHeight[i]!
|
|
162
|
+
f32[o + 3] = colorType[i]!
|
|
163
|
+
f32[o + 4] = relDepth[i]!
|
|
164
|
+
}
|
|
165
|
+
return buf
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Instance `i`'s `position`.
|
|
169
|
+
export function getInstancePosition(u32: Uint32Array, i: number) {
|
|
170
|
+
return u32[i * INSTANCE_STRIDE_WORDS]!
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function setInstancePosition(u32: Uint32Array, i: number, v: number) {
|
|
174
|
+
u32[i * INSTANCE_STRIDE_WORDS] = v
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Instance `i`'s `yOffset`.
|
|
178
|
+
export function getInstanceYOffset(f32: Float32Array, i: number) {
|
|
179
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 1]!
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function setInstanceYOffset(f32: Float32Array, i: number, v: number) {
|
|
183
|
+
f32[i * INSTANCE_STRIDE_WORDS + 1] = v
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Instance `i`'s `segHeight`.
|
|
187
|
+
export function getInstanceSegHeight(f32: Float32Array, i: number) {
|
|
188
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 2]!
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function setInstanceSegHeight(f32: Float32Array, i: number, v: number) {
|
|
192
|
+
f32[i * INSTANCE_STRIDE_WORDS + 2] = v
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Instance `i`'s `colorType`.
|
|
196
|
+
export function getInstanceColorType(f32: Float32Array, i: number) {
|
|
197
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 3]!
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function setInstanceColorType(f32: Float32Array, i: number, v: number) {
|
|
201
|
+
f32[i * INSTANCE_STRIDE_WORDS + 3] = v
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Instance `i`'s `relDepth`.
|
|
205
|
+
export function getInstanceRelDepth(f32: Float32Array, i: number) {
|
|
206
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 4]!
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function setInstanceRelDepth(f32: Float32Array, i: number, v: number) {
|
|
210
|
+
f32[i * INSTANCE_STRIDE_WORDS + 4] = v
|
|
211
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SNP segments stacked on the coverage bars, showing the A/C/G/T/N fraction per
|
|
2
|
+
// position. colorType encodes 1=A 2=C 3=G 4=T 5=N. Shared by the alignments
|
|
3
|
+
// pileup band and the MAF band — see coverageBand.slang.
|
|
4
|
+
//! targets: wgsl, glsl
|
|
5
|
+
//! layout-out: packages/alignments-core/src/snpCoverageLayout.generated.ts
|
|
6
|
+
|
|
7
|
+
import coverageBand;
|
|
8
|
+
import hpmath;
|
|
9
|
+
|
|
10
|
+
public static const uint VERTS_PER_INSTANCE = 6u;
|
|
11
|
+
[[vk::binding(1, 0)]] ConstantBuffer<CoverageBandUniforms> u;
|
|
12
|
+
|
|
13
|
+
// yOffset/segHeight are fractions of THIS position's coverage bar (not regional).
|
|
14
|
+
// relDepth = totalDepthAtPos / regionMaxDepth feeds the bar-height calculation
|
|
15
|
+
// via covNormalizeDepth, so each segment is a linear slice of a possibly
|
|
16
|
+
// log-scaled bar without any per-position un-mixing at draw time.
|
|
17
|
+
//
|
|
18
|
+
// Which means that on a LOG axis the coloured fraction reads as the allele
|
|
19
|
+
// proportion and not as a count off the y-axis: a 50% allele is half the bar
|
|
20
|
+
// whatever the scale, so its top edge does not land on the depth the axis would
|
|
21
|
+
// read there. Deliberate — the alternative bakes the axis into the buffer and
|
|
22
|
+
// needs a repack on every autoscale change — and written down in
|
|
23
|
+
// reference/DEEP_COVERAGE.md, because the two readings differ.
|
|
24
|
+
struct Instance {
|
|
25
|
+
uint position : ATTR0;
|
|
26
|
+
float yOffset : ATTR1;
|
|
27
|
+
float segHeight : ATTR2;
|
|
28
|
+
float colorType : ATTR3;
|
|
29
|
+
float relDepth : ATTR4;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
[shader("vertex")]
|
|
33
|
+
CoverageVsOut vs_main(Instance inst, uint vid : SV_VertexID) {
|
|
34
|
+
// The allele-fraction floor. `segHeight` IS this allele's share of the
|
|
35
|
+
// position's depth, so the test is the setting with no conversion. Folding
|
|
36
|
+
// the vertex rather than shrinking the segment is what leaves the stack above
|
|
37
|
+
// it where it was: the grey depth bar underneath is ungated, so the hidden
|
|
38
|
+
// slice reads as reference. Canvas2D's `drawSnpSegments` runs the same test.
|
|
39
|
+
if (inst.segHeight < u.snpMinFreq) {
|
|
40
|
+
return covDiscardVertex();
|
|
41
|
+
}
|
|
42
|
+
CoverageVsOut o;
|
|
43
|
+
o.position = covSegQuad(inst.position, 1u, inst.yOffset, inst.segHeight,
|
|
44
|
+
inst.relDepth, quadLocal(vid), u);
|
|
45
|
+
o.color = float4(covSnpColor(inst.colorType, u), 1.0);
|
|
46
|
+
return o;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
[shader("fragment")]
|
|
50
|
+
float4 fs_main(CoverageVsOut fragIn) : SV_Target {
|
|
51
|
+
return fragIn.color;
|
|
52
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Shared 45°-rotated contact-grid transform. The Hi-C contact map and the LD
|
|
2
|
+
// heatmap both lay cells out as squares rotated 45° above the x-axis and then
|
|
3
|
+
// place them with the same (viewScale, viewOffsetX, yScalar) triple, so the
|
|
4
|
+
// rotation factor and the transform live here instead of being re-spelled — and
|
|
5
|
+
// eventually drifting — in two plugins.
|
|
6
|
+
//
|
|
7
|
+
// Imported via `import diagonalGrid;`.
|
|
8
|
+
module diagonalGrid;
|
|
9
|
+
|
|
10
|
+
import hpmath;
|
|
11
|
+
|
|
12
|
+
// cos(45°) = sin(45°).
|
|
13
|
+
static const float ROT_45 = 0.7071067811865476;
|
|
14
|
+
|
|
15
|
+
// Grid-space cell corner → clip space. `pos` is in the caller's grid units,
|
|
16
|
+
// pre-rotation: bp/√2 off the payload origin for Hi-C and genomic-mode LD, cell
|
|
17
|
+
// pitch for the LD uniform grid. ROT_45 collapses the √2 back out.
|
|
18
|
+
public float4 diagonalCellToClip(
|
|
19
|
+
float2 pos, float2 canvasSize, float viewScale, float viewOffsetX, float yScalar
|
|
20
|
+
) {
|
|
21
|
+
float rx = (pos.x + pos.y) * ROT_45;
|
|
22
|
+
float ry = (-pos.x + pos.y) * ROT_45;
|
|
23
|
+
float2 screen = float2(rx * viewScale + viewOffsetX, ry * viewScale * yScalar);
|
|
24
|
+
return screenToClip(screen, canvasSize);
|
|
25
|
+
}
|