@zenfg/inspector 0.1.0-beta.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.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/FrameGraphInspector.d.ts +153 -0
- package/dist/FrameGraphInspector.d.ts.map +1 -0
- package/dist/FrameGraphInspector.js +580 -0
- package/dist/FrameGraphInspector.js.map +1 -0
- package/dist/debugCaptureModel.d.ts +166 -0
- package/dist/debugCaptureModel.d.ts.map +1 -0
- package/dist/debugCaptureModel.js +364 -0
- package/dist/debugCaptureModel.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/panelAliasAnalysis.d.ts +20 -0
- package/dist/panelAliasAnalysis.d.ts.map +1 -0
- package/dist/panelAliasAnalysis.js +113 -0
- package/dist/panelAliasAnalysis.js.map +1 -0
- package/dist/panelCytoscapeGraphRenderer.d.ts +71 -0
- package/dist/panelCytoscapeGraphRenderer.d.ts.map +1 -0
- package/dist/panelCytoscapeGraphRenderer.js +559 -0
- package/dist/panelCytoscapeGraphRenderer.js.map +1 -0
- package/dist/panelDiagnosticsView.d.ts +22 -0
- package/dist/panelDiagnosticsView.d.ts.map +1 -0
- package/dist/panelDiagnosticsView.js +123 -0
- package/dist/panelDiagnosticsView.js.map +1 -0
- package/dist/panelDomHelpers.d.ts +26 -0
- package/dist/panelDomHelpers.d.ts.map +1 -0
- package/dist/panelDomHelpers.js +129 -0
- package/dist/panelDomHelpers.js.map +1 -0
- package/dist/panelGraphLayout.d.ts +28 -0
- package/dist/panelGraphLayout.d.ts.map +1 -0
- package/dist/panelGraphLayout.js +223 -0
- package/dist/panelGraphLayout.js.map +1 -0
- package/dist/panelGraphRenderer.d.ts +20 -0
- package/dist/panelGraphRenderer.d.ts.map +1 -0
- package/dist/panelGraphRenderer.js +2 -0
- package/dist/panelGraphRenderer.js.map +1 -0
- package/dist/panelGraphScene.d.ts +98 -0
- package/dist/panelGraphScene.d.ts.map +1 -0
- package/dist/panelGraphScene.js +559 -0
- package/dist/panelGraphScene.js.map +1 -0
- package/dist/panelGraphView.d.ts +9 -0
- package/dist/panelGraphView.d.ts.map +1 -0
- package/dist/panelGraphView.js +88 -0
- package/dist/panelGraphView.js.map +1 -0
- package/dist/panelGraphVisuals.d.ts +38 -0
- package/dist/panelGraphVisuals.d.ts.map +1 -0
- package/dist/panelGraphVisuals.js +330 -0
- package/dist/panelGraphVisuals.js.map +1 -0
- package/dist/panelIcons.d.ts +4 -0
- package/dist/panelIcons.d.ts.map +1 -0
- package/dist/panelIcons.js +43 -0
- package/dist/panelIcons.js.map +1 -0
- package/dist/panelInspectorView.d.ts +33 -0
- package/dist/panelInspectorView.d.ts.map +1 -0
- package/dist/panelInspectorView.js +357 -0
- package/dist/panelInspectorView.js.map +1 -0
- package/dist/panelMemoryView.d.ts +21 -0
- package/dist/panelMemoryView.d.ts.map +1 -0
- package/dist/panelMemoryView.js +134 -0
- package/dist/panelMemoryView.js.map +1 -0
- package/dist/panelPassesView.d.ts +31 -0
- package/dist/panelPassesView.d.ts.map +1 -0
- package/dist/panelPassesView.js +183 -0
- package/dist/panelPassesView.js.map +1 -0
- package/dist/panelResourcesView.d.ts +19 -0
- package/dist/panelResourcesView.d.ts.map +1 -0
- package/dist/panelResourcesView.js +89 -0
- package/dist/panelResourcesView.js.map +1 -0
- package/dist/panelSelection.d.ts +5 -0
- package/dist/panelSelection.d.ts.map +1 -0
- package/dist/panelSelection.js +88 -0
- package/dist/panelSelection.js.map +1 -0
- package/dist/panelTypes.d.ts +40 -0
- package/dist/panelTypes.d.ts.map +1 -0
- package/dist/panelTypes.js +2 -0
- package/dist/panelTypes.js.map +1 -0
- package/dist/panelVisualTheme.d.ts +76 -0
- package/dist/panelVisualTheme.d.ts.map +1 -0
- package/dist/panelVisualTheme.js +39 -0
- package/dist/panelVisualTheme.js.map +1 -0
- package/dist/panelWorkbenchHelpers.d.ts +34 -0
- package/dist/panelWorkbenchHelpers.d.ts.map +1 -0
- package/dist/panelWorkbenchHelpers.js +162 -0
- package/dist/panelWorkbenchHelpers.js.map +1 -0
- package/dist/panelWorkbenchView.d.ts +77 -0
- package/dist/panelWorkbenchView.d.ts.map +1 -0
- package/dist/panelWorkbenchView.js +409 -0
- package/dist/panelWorkbenchView.js.map +1 -0
- package/dist/query.d.ts +11 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +21 -0
- package/dist/query.js.map +1 -0
- package/dist/styles.d.ts +8 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +1073 -0
- package/dist/styles.js.map +1 -0
- package/package.json +29 -0
- package/src/FrameGraphInspector.ts +632 -0
- package/src/debugCaptureModel.ts +583 -0
- package/src/index.ts +21 -0
- package/src/panelAliasAnalysis.ts +164 -0
- package/src/panelCytoscapeGraphRenderer.ts +617 -0
- package/src/panelDiagnosticsView.ts +160 -0
- package/src/panelDomHelpers.ts +151 -0
- package/src/panelGraphLayout.ts +281 -0
- package/src/panelGraphRenderer.ts +21 -0
- package/src/panelGraphScene.ts +787 -0
- package/src/panelGraphView.ts +108 -0
- package/src/panelGraphVisuals.ts +364 -0
- package/src/panelIcons.ts +56 -0
- package/src/panelInspectorView.ts +377 -0
- package/src/panelMemoryView.ts +154 -0
- package/src/panelPassesView.ts +222 -0
- package/src/panelResourcesView.ts +115 -0
- package/src/panelSelection.ts +99 -0
- package/src/panelTypes.ts +28 -0
- package/src/panelVisualTheme.ts +39 -0
- package/src/panelWorkbenchHelpers.ts +216 -0
- package/src/panelWorkbenchView.ts +465 -0
- package/src/query.ts +22 -0
- package/src/styles.ts +1076 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function resolveSelectedDetail(snapshot, selected) {
|
|
2
|
+
if (!selected)
|
|
3
|
+
return snapshot;
|
|
4
|
+
switch (selected.kind) {
|
|
5
|
+
case 'node': {
|
|
6
|
+
const node = snapshot.nodeById.get(selected.id);
|
|
7
|
+
const executionSegment = snapshot.segmentByNodeId.get(selected.id);
|
|
8
|
+
return node
|
|
9
|
+
? {
|
|
10
|
+
...node,
|
|
11
|
+
debugGroupPath: debugGroupPath(snapshot, node.debugGroupId),
|
|
12
|
+
executionSegment,
|
|
13
|
+
reads: node.reads.map((access) => resolveAccessDetail(snapshot, access)),
|
|
14
|
+
writes: node.writes.map((access) => resolveAccessDetail(snapshot, access)),
|
|
15
|
+
}
|
|
16
|
+
: undefined;
|
|
17
|
+
}
|
|
18
|
+
case 'resource':
|
|
19
|
+
return resolveResourceDetail(snapshot, selected.id);
|
|
20
|
+
case 'group':
|
|
21
|
+
return snapshot.groupByPathKey.get(selected.pathKey);
|
|
22
|
+
case 'root':
|
|
23
|
+
return snapshot.roots[selected.index];
|
|
24
|
+
case 'culled': {
|
|
25
|
+
const culled = snapshot.culledNodes[selected.index];
|
|
26
|
+
return culled ? {
|
|
27
|
+
...culled,
|
|
28
|
+
node: {
|
|
29
|
+
...culled.node,
|
|
30
|
+
reads: culled.node.reads.map((access) => resolveAccessDetail(snapshot, access)),
|
|
31
|
+
writes: culled.node.writes.map((access) => resolveAccessDetail(snapshot, access)),
|
|
32
|
+
},
|
|
33
|
+
} : undefined;
|
|
34
|
+
}
|
|
35
|
+
case 'allocation':
|
|
36
|
+
return snapshot.allocationById.get(selected.id);
|
|
37
|
+
case 'segment':
|
|
38
|
+
return snapshot.segmentByIndex.get(selected.index);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function selectionExists(snapshot, selected) {
|
|
42
|
+
switch (selected.kind) {
|
|
43
|
+
case 'node':
|
|
44
|
+
return snapshot.nodeById.has(selected.id);
|
|
45
|
+
case 'group':
|
|
46
|
+
return snapshot.groupByPathKey.has(selected.pathKey);
|
|
47
|
+
case 'resource':
|
|
48
|
+
return snapshot.resourceById.has(selected.id);
|
|
49
|
+
case 'root':
|
|
50
|
+
return isValidIndex(selected.index, snapshot.roots.length);
|
|
51
|
+
case 'culled':
|
|
52
|
+
return isValidIndex(selected.index, snapshot.culledNodes.length);
|
|
53
|
+
case 'allocation':
|
|
54
|
+
return snapshot.allocationById.has(selected.id);
|
|
55
|
+
case 'segment':
|
|
56
|
+
return snapshot.segmentByIndex.has(selected.index);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function resolveResourceDetail(snapshot, resourceId) {
|
|
60
|
+
const resource = snapshot.resourceById.get(resourceId);
|
|
61
|
+
if (!resource)
|
|
62
|
+
return undefined;
|
|
63
|
+
const accesses = (snapshot.accessesByResourceId.get(resourceId) ?? [])
|
|
64
|
+
.map((access) => resolveAccessDetail(snapshot, access));
|
|
65
|
+
return {
|
|
66
|
+
...resource,
|
|
67
|
+
debugGroupPath: debugGroupPath(snapshot, resource.debugGroupId),
|
|
68
|
+
writes: accesses.filter((access) => access.mode === 'write'),
|
|
69
|
+
reads: accesses.filter((access) => access.mode === 'read'),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function resolveAccessDetail(snapshot, access) {
|
|
73
|
+
return access.textureViewId === undefined
|
|
74
|
+
? access
|
|
75
|
+
: {
|
|
76
|
+
...access,
|
|
77
|
+
textureView: snapshot.textureViewById.get(access.textureViewId),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function debugGroupPath(snapshot, groupId) {
|
|
81
|
+
if (groupId === undefined)
|
|
82
|
+
return '-';
|
|
83
|
+
return snapshot.groupById.get(groupId)?.path.join(' / ') ?? `#${groupId}`;
|
|
84
|
+
}
|
|
85
|
+
function isValidIndex(index, length) {
|
|
86
|
+
return Number.isInteger(index) && index >= 0 && index < length;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=panelSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelSelection.js","sourceRoot":"","sources":["../src/panelSelection.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CACpC,QAAkC,EAClC,QAA+B;IAE/B,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,IAAI;gBACV,CAAC,CAAC;oBACD,GAAG,IAAI;oBACP,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC;oBAC3D,gBAAgB;oBAChB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACxE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;iBAC1E;gBACD,CAAC,CAAC,SAAS,CAAC;QACd,CAAC;QACD,KAAK,UAAU;YACd,OAAO,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrD,KAAK,OAAO;YACX,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtD,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC,CAAC,CAAC;gBACf,GAAG,MAAM;gBACT,IAAI,EAAE;oBACL,GAAG,MAAM,CAAC,IAAI;oBACd,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAC/E,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;iBACjF;aACD,CAAC,CAAC,CAAC,SAAS,CAAC;QACf,CAAC;QACD,KAAK,YAAY;YAChB,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,SAAS;YACb,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAkC,EAAE,QAAmB;IACtF,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM;YACV,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,KAAK,OAAO;YACX,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtD,KAAK,UAAU;YACd,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM;YACV,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,KAAK,QAAQ;YACZ,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClE,KAAK,YAAY;YAChB,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,SAAS;YACb,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAkC,EAAE,UAAkB;IACpF,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;SACpE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO;QACN,GAAG,QAAQ;QACX,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC/D,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;QAC5D,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;KAC1D,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,QAAkC,EAClC,MAAe;IAEf,OAAO,MAAM,CAAC,aAAa,KAAK,SAAS;QACxC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC;YACD,GAAG,MAAM;YACT,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;SAC/D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAkC,EAAE,OAA2B;IACtF,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,MAAc;IAClD,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC;AAChE,CAAC","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport type { Selection } from './panelTypes.ts';\n\nexport function resolveSelectedDetail(\n\tsnapshot: FrameGraphDebugViewModel,\n\tselected: Selection | undefined,\n): unknown {\n\tif (!selected) return snapshot;\n\n\tswitch (selected.kind) {\n\t\tcase 'node': {\n\t\t\tconst node = snapshot.nodeById.get(selected.id);\n\t\t\tconst executionSegment = snapshot.segmentByNodeId.get(selected.id);\n\t\t\treturn node\n\t\t\t\t? {\n\t\t\t\t\t...node,\n\t\t\t\t\tdebugGroupPath: debugGroupPath(snapshot, node.debugGroupId),\n\t\t\t\t\texecutionSegment,\n\t\t\t\t\treads: node.reads.map((access) => resolveAccessDetail(snapshot, access)),\n\t\t\t\t\twrites: node.writes.map((access) => resolveAccessDetail(snapshot, access)),\n\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'resource':\n\t\t\treturn resolveResourceDetail(snapshot, selected.id);\n\t\tcase 'group':\n\t\t\treturn snapshot.groupByPathKey.get(selected.pathKey);\n\t\tcase 'root':\n\t\t\treturn snapshot.roots[selected.index];\n\t\tcase 'culled': {\n\t\t\tconst culled = snapshot.culledNodes[selected.index];\n\t\t\treturn culled ? {\n\t\t\t\t...culled,\n\t\t\t\tnode: {\n\t\t\t\t\t...culled.node,\n\t\t\t\t\treads: culled.node.reads.map((access) => resolveAccessDetail(snapshot, access)),\n\t\t\t\t\twrites: culled.node.writes.map((access) => resolveAccessDetail(snapshot, access)),\n\t\t\t\t},\n\t\t\t} : undefined;\n\t\t}\n\t\tcase 'allocation':\n\t\t\treturn snapshot.allocationById.get(selected.id);\n\t\tcase 'segment':\n\t\t\treturn snapshot.segmentByIndex.get(selected.index);\n\t}\n}\n\nexport function selectionExists(snapshot: FrameGraphDebugViewModel, selected: Selection): boolean {\n\tswitch (selected.kind) {\n\t\tcase 'node':\n\t\t\treturn snapshot.nodeById.has(selected.id);\n\t\tcase 'group':\n\t\t\treturn snapshot.groupByPathKey.has(selected.pathKey);\n\t\tcase 'resource':\n\t\t\treturn snapshot.resourceById.has(selected.id);\n\t\tcase 'root':\n\t\t\treturn isValidIndex(selected.index, snapshot.roots.length);\n\t\tcase 'culled':\n\t\t\treturn isValidIndex(selected.index, snapshot.culledNodes.length);\n\t\tcase 'allocation':\n\t\t\treturn snapshot.allocationById.has(selected.id);\n\t\tcase 'segment':\n\t\t\treturn snapshot.segmentByIndex.has(selected.index);\n\t}\n}\n\nfunction resolveResourceDetail(snapshot: FrameGraphDebugViewModel, resourceId: string): unknown {\n\tconst resource = snapshot.resourceById.get(resourceId);\n\tif (!resource) return undefined;\n\tconst accesses = (snapshot.accessesByResourceId.get(resourceId) ?? [])\n\t\t.map((access) => resolveAccessDetail(snapshot, access));\n\treturn {\n\t\t...resource,\n\t\tdebugGroupPath: debugGroupPath(snapshot, resource.debugGroupId),\n\t\twrites: accesses.filter((access) => access.mode === 'write'),\n\t\treads: accesses.filter((access) => access.mode === 'read'),\n\t};\n}\n\nfunction resolveAccessDetail<TAccess extends { readonly textureViewId?: string }>(\n\tsnapshot: FrameGraphDebugViewModel,\n\taccess: TAccess,\n): TAccess & { readonly textureView?: FrameGraphDebugViewModel['protocol']['graph']['textureViews'][number] } {\n\treturn access.textureViewId === undefined\n\t\t? access\n\t\t: {\n\t\t\t...access,\n\t\t\ttextureView: snapshot.textureViewById.get(access.textureViewId),\n\t\t};\n}\n\nfunction debugGroupPath(snapshot: FrameGraphDebugViewModel, groupId: string | undefined): string {\n\tif (groupId === undefined) return '-';\n\treturn snapshot.groupById.get(groupId)?.path.join(' / ') ?? `#${groupId}`;\n}\n\nfunction isValidIndex(index: number, length: number): boolean {\n\treturn Number.isInteger(index) && index >= 0 && index < length;\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { GraphRenderer } from './panelGraphRenderer.ts';
|
|
2
|
+
export type Selection = {
|
|
3
|
+
kind: 'node';
|
|
4
|
+
id: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'group';
|
|
7
|
+
pathKey: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'resource';
|
|
10
|
+
id: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'root';
|
|
13
|
+
index: number;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'culled';
|
|
16
|
+
index: number;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'allocation';
|
|
19
|
+
id: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'segment';
|
|
22
|
+
index: number;
|
|
23
|
+
};
|
|
24
|
+
export type WorkbenchTab = 'overview' | 'graph' | 'passes' | 'resources' | 'memory' | 'diagnostics';
|
|
25
|
+
export type PassesSubview = 'list' | 'groups';
|
|
26
|
+
export type InspectorTab = 'summary' | 'relations' | 'raw';
|
|
27
|
+
export type GraphViewMode = 'passes' | 'resources';
|
|
28
|
+
export type GraphViewState = {
|
|
29
|
+
readonly host: HTMLElement;
|
|
30
|
+
readonly toolbar: HTMLElement;
|
|
31
|
+
readonly legend?: HTMLElement;
|
|
32
|
+
readonly layoutElementBudget?: number;
|
|
33
|
+
graphMode: GraphViewMode;
|
|
34
|
+
groupsEnabled: boolean;
|
|
35
|
+
readonly expandedGroupPaths: Set<string>;
|
|
36
|
+
renderer?: GraphRenderer;
|
|
37
|
+
fitOnNextRender: boolean;
|
|
38
|
+
anchorElementIdOnNextRender?: string;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=panelTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelTypes.d.ts","sourceRoot":"","sources":["../src/panelTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;AACpG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC9C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelTypes.js","sourceRoot":"","sources":["../src/panelTypes.ts"],"names":[],"mappings":"","sourcesContent":["import type { GraphRenderer } from './panelGraphRenderer.ts';\n\nexport type Selection =\n | { kind: 'node'; id: string }\n | { kind: 'group'; pathKey: string }\n | { kind: 'resource'; id: string }\n | { kind: 'root'; index: number }\n | { kind: 'culled'; index: number }\n | { kind: 'allocation'; id: string }\n | { kind: 'segment'; index: number };\n\nexport type WorkbenchTab = 'overview' | 'graph' | 'passes' | 'resources' | 'memory' | 'diagnostics';\nexport type PassesSubview = 'list' | 'groups';\nexport type InspectorTab = 'summary' | 'relations' | 'raw';\nexport type GraphViewMode = 'passes' | 'resources';\n\nexport type GraphViewState = {\n readonly host: HTMLElement;\n readonly toolbar: HTMLElement;\n readonly legend?: HTMLElement;\n\treadonly layoutElementBudget?: number;\n graphMode: GraphViewMode;\n groupsEnabled: boolean;\n readonly expandedGroupPaths: Set<string>;\n renderer?: GraphRenderer;\n fitOnNextRender: boolean;\n anchorElementIdOnNextRender?: string;\n};\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const FRAME_GRAPH_DEBUG_VISUAL_THEME: {
|
|
2
|
+
readonly canvas: "#0b0f14";
|
|
3
|
+
readonly panel: "#0f151d";
|
|
4
|
+
readonly surface: "#131b24";
|
|
5
|
+
readonly surfaceRaised: "#18222d";
|
|
6
|
+
readonly surfaceHover: "#1d2935";
|
|
7
|
+
readonly border: "#263341";
|
|
8
|
+
readonly text: "#e6edf3";
|
|
9
|
+
readonly textSecondary: "#b4beca";
|
|
10
|
+
readonly muted: "#8b98a5";
|
|
11
|
+
readonly accent: "#38bdf8";
|
|
12
|
+
readonly success: "#34d399";
|
|
13
|
+
readonly warning: "#fbbf24";
|
|
14
|
+
readonly danger: "#fb7185";
|
|
15
|
+
readonly fontUi: "system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif";
|
|
16
|
+
readonly fontMono: "ui-monospace, SFMono-Regular, Consolas, \"Liberation Mono\", monospace";
|
|
17
|
+
};
|
|
18
|
+
export declare const GRAPH_VISUAL_THEME: {
|
|
19
|
+
readonly canvas: "#0b0f14";
|
|
20
|
+
readonly surface: "#131b24";
|
|
21
|
+
readonly surfaceRaised: "#18222d";
|
|
22
|
+
readonly text: "#e6edf3";
|
|
23
|
+
readonly muted: "#8b98a5";
|
|
24
|
+
readonly render: {
|
|
25
|
+
readonly stroke: "#34d399";
|
|
26
|
+
readonly fill: "#12342b";
|
|
27
|
+
};
|
|
28
|
+
readonly compute: {
|
|
29
|
+
readonly stroke: "#60a5fa";
|
|
30
|
+
readonly fill: "#162c46";
|
|
31
|
+
};
|
|
32
|
+
readonly copy: {
|
|
33
|
+
readonly stroke: "#fbbf24";
|
|
34
|
+
readonly fill: "#3a2d12";
|
|
35
|
+
};
|
|
36
|
+
readonly clear: {
|
|
37
|
+
readonly stroke: "#94a3b8";
|
|
38
|
+
readonly fill: "#25303a";
|
|
39
|
+
};
|
|
40
|
+
readonly command: {
|
|
41
|
+
readonly stroke: "#c084fc";
|
|
42
|
+
readonly fill: "#322044";
|
|
43
|
+
};
|
|
44
|
+
readonly external: {
|
|
45
|
+
readonly stroke: "#fb923c";
|
|
46
|
+
readonly fill: "#402318";
|
|
47
|
+
};
|
|
48
|
+
readonly texture: {
|
|
49
|
+
readonly stroke: "#f472b6";
|
|
50
|
+
readonly fill: "#3c1f32";
|
|
51
|
+
};
|
|
52
|
+
readonly buffer: {
|
|
53
|
+
readonly stroke: "#2dd4bf";
|
|
54
|
+
readonly fill: "#123632";
|
|
55
|
+
};
|
|
56
|
+
readonly group: {
|
|
57
|
+
readonly stroke: "#64748b";
|
|
58
|
+
readonly fill: "#141c29";
|
|
59
|
+
readonly alternateFill: "#172033";
|
|
60
|
+
};
|
|
61
|
+
readonly dependency: {
|
|
62
|
+
readonly value: "#94a3b8";
|
|
63
|
+
readonly ordering: "#64748b";
|
|
64
|
+
};
|
|
65
|
+
readonly access: {
|
|
66
|
+
readonly read: "#2dd4bf";
|
|
67
|
+
readonly write: "#f59e0b";
|
|
68
|
+
};
|
|
69
|
+
readonly selected: "#38bdf8";
|
|
70
|
+
readonly hover: "#cbd5e1";
|
|
71
|
+
readonly culled: {
|
|
72
|
+
readonly stroke: "#64748b";
|
|
73
|
+
readonly fill: "#171d24";
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=panelVisualTheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelVisualTheme.d.ts","sourceRoot":"","sources":["../src/panelVisualTheme.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;CAgBjC,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBrB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const FRAME_GRAPH_DEBUG_VISUAL_THEME = {
|
|
2
|
+
canvas: '#0b0f14',
|
|
3
|
+
panel: '#0f151d',
|
|
4
|
+
surface: '#131b24',
|
|
5
|
+
surfaceRaised: '#18222d',
|
|
6
|
+
surfaceHover: '#1d2935',
|
|
7
|
+
border: '#263341',
|
|
8
|
+
text: '#e6edf3',
|
|
9
|
+
textSecondary: '#b4beca',
|
|
10
|
+
muted: '#8b98a5',
|
|
11
|
+
accent: '#38bdf8',
|
|
12
|
+
success: '#34d399',
|
|
13
|
+
warning: '#fbbf24',
|
|
14
|
+
danger: '#fb7185',
|
|
15
|
+
fontUi: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
|
|
16
|
+
fontMono: 'ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace',
|
|
17
|
+
};
|
|
18
|
+
export const GRAPH_VISUAL_THEME = {
|
|
19
|
+
canvas: FRAME_GRAPH_DEBUG_VISUAL_THEME.canvas,
|
|
20
|
+
surface: FRAME_GRAPH_DEBUG_VISUAL_THEME.surface,
|
|
21
|
+
surfaceRaised: FRAME_GRAPH_DEBUG_VISUAL_THEME.surfaceRaised,
|
|
22
|
+
text: FRAME_GRAPH_DEBUG_VISUAL_THEME.text,
|
|
23
|
+
muted: FRAME_GRAPH_DEBUG_VISUAL_THEME.muted,
|
|
24
|
+
render: { stroke: '#34d399', fill: '#12342b' },
|
|
25
|
+
compute: { stroke: '#60a5fa', fill: '#162c46' },
|
|
26
|
+
copy: { stroke: '#fbbf24', fill: '#3a2d12' },
|
|
27
|
+
clear: { stroke: '#94a3b8', fill: '#25303a' },
|
|
28
|
+
command: { stroke: '#c084fc', fill: '#322044' },
|
|
29
|
+
external: { stroke: '#fb923c', fill: '#402318' },
|
|
30
|
+
texture: { stroke: '#f472b6', fill: '#3c1f32' },
|
|
31
|
+
buffer: { stroke: '#2dd4bf', fill: '#123632' },
|
|
32
|
+
group: { stroke: '#64748b', fill: '#141c29', alternateFill: '#172033' },
|
|
33
|
+
dependency: { value: '#94a3b8', ordering: '#64748b' },
|
|
34
|
+
access: { read: '#2dd4bf', write: '#f59e0b' },
|
|
35
|
+
selected: FRAME_GRAPH_DEBUG_VISUAL_THEME.accent,
|
|
36
|
+
hover: '#cbd5e1',
|
|
37
|
+
culled: { stroke: '#64748b', fill: '#171d24' },
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=panelVisualTheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelVisualTheme.js","sourceRoot":"","sources":["../src/panelVisualTheme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IACvB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,sEAAsE;IAC9E,QAAQ,EAAE,sEAAsE;CACvE,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,MAAM,EAAE,8BAA8B,CAAC,MAAM;IAC7C,OAAO,EAAE,8BAA8B,CAAC,OAAO;IAC/C,aAAa,EAAE,8BAA8B,CAAC,aAAa;IAC3D,IAAI,EAAE,8BAA8B,CAAC,IAAI;IACzC,KAAK,EAAE,8BAA8B,CAAC,KAAK;IAC3C,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9C,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/C,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC7C,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/C,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAChD,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/C,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9C,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE;IACvE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;IACrD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C,QAAQ,EAAE,8BAA8B,CAAC,MAAM;IAC/C,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;CACrC,CAAC","sourcesContent":["export const FRAME_GRAPH_DEBUG_VISUAL_THEME = {\n\tcanvas: '#0b0f14',\n\tpanel: '#0f151d',\n\tsurface: '#131b24',\n\tsurfaceRaised: '#18222d',\n\tsurfaceHover: '#1d2935',\n\tborder: '#263341',\n\ttext: '#e6edf3',\n\ttextSecondary: '#b4beca',\n\tmuted: '#8b98a5',\n\taccent: '#38bdf8',\n\tsuccess: '#34d399',\n\twarning: '#fbbf24',\n\tdanger: '#fb7185',\n\tfontUi: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n\tfontMono: 'ui-monospace, SFMono-Regular, Consolas, \"Liberation Mono\", monospace',\n} as const;\n\nexport const GRAPH_VISUAL_THEME = {\n\tcanvas: FRAME_GRAPH_DEBUG_VISUAL_THEME.canvas,\n\tsurface: FRAME_GRAPH_DEBUG_VISUAL_THEME.surface,\n\tsurfaceRaised: FRAME_GRAPH_DEBUG_VISUAL_THEME.surfaceRaised,\n\ttext: FRAME_GRAPH_DEBUG_VISUAL_THEME.text,\n\tmuted: FRAME_GRAPH_DEBUG_VISUAL_THEME.muted,\n\trender: { stroke: '#34d399', fill: '#12342b' },\n\tcompute: { stroke: '#60a5fa', fill: '#162c46' },\n\tcopy: { stroke: '#fbbf24', fill: '#3a2d12' },\n\tclear: { stroke: '#94a3b8', fill: '#25303a' },\n\tcommand: { stroke: '#c084fc', fill: '#322044' },\n\texternal: { stroke: '#fb923c', fill: '#402318' },\n\ttexture: { stroke: '#f472b6', fill: '#3c1f32' },\n\tbuffer: { stroke: '#2dd4bf', fill: '#123632' },\n\tgroup: { stroke: '#64748b', fill: '#141c29', alternateFill: '#172033' },\n\tdependency: { value: '#94a3b8', ordering: '#64748b' },\n\taccess: { read: '#2dd4bf', write: '#f59e0b' },\n\tselected: FRAME_GRAPH_DEBUG_VISUAL_THEME.accent,\n\thover: '#cbd5e1',\n\tculled: { stroke: '#64748b', fill: '#171d24' },\n} as const;\r\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FrameGraphDebugResource, FrameGraphDebugViewModel } from './debugCaptureModel.ts';
|
|
2
|
+
import type { Selection } from './panelTypes.ts';
|
|
3
|
+
export type WorkbenchCallbacks = {
|
|
4
|
+
readonly onSelect: (selection: Selection) => void;
|
|
5
|
+
readonly onHover: (selection: Selection | undefined) => void;
|
|
6
|
+
readonly onGroupToggle: (pathKey: string) => void;
|
|
7
|
+
readonly isGroupExpanded: (pathKey: string) => boolean;
|
|
8
|
+
};
|
|
9
|
+
export type WorkbenchTableColumn = {
|
|
10
|
+
readonly label: string;
|
|
11
|
+
readonly column?: 'code' | 'kind' | 'numeric';
|
|
12
|
+
};
|
|
13
|
+
export declare function selectionKey(selection: Selection): string;
|
|
14
|
+
export declare function sameSelection(a: Selection | undefined, b: Selection | undefined): boolean;
|
|
15
|
+
export declare function updateSelectedRows(rows: ReadonlyMap<string, readonly HTMLElement[]>, selected: Selection | undefined): void;
|
|
16
|
+
export declare function registerSelectable(rows: Map<string, HTMLElement[]>, element: HTMLElement, selection: Selection, callbacks: WorkbenchCallbacks): void;
|
|
17
|
+
export declare function createViewToolbar(label: string): HTMLDivElement;
|
|
18
|
+
export declare function createSearchInput(placeholder: string, value: string, onInput: (value: string) => void): HTMLInputElement;
|
|
19
|
+
export declare function createFilterSelect(label: string, value: string, options: readonly (readonly [value: string, label: string])[], onChange: (value: string) => void): HTMLSelectElement;
|
|
20
|
+
export declare function createTableScroller(headers: readonly WorkbenchTableColumn[]): {
|
|
21
|
+
readonly scroller: HTMLDivElement;
|
|
22
|
+
readonly table: HTMLTableElement;
|
|
23
|
+
readonly body: HTMLTableSectionElement;
|
|
24
|
+
};
|
|
25
|
+
export declare function createSelectionCell(text: string, selection: Selection, callbacks: WorkbenchCallbacks, column?: WorkbenchTableColumn['column']): HTMLTableCellElement;
|
|
26
|
+
export declare function createRelationButton(text: string, selection: Selection, onSelect: (selection: Selection) => void): HTMLButtonElement;
|
|
27
|
+
export declare function createKindCell(kind: string, label?: string): HTMLTableCellElement;
|
|
28
|
+
export declare function groupPath(snapshot: FrameGraphDebugViewModel, groupId: string | undefined): string;
|
|
29
|
+
export declare function formatEstimatedBytes(bytes: number | undefined): string;
|
|
30
|
+
export declare function formatResourceDescriptor(resource: FrameGraphDebugResource): string;
|
|
31
|
+
export declare function resourceAccessCounts(snapshot: FrameGraphDebugViewModel, resourceId: string): readonly [number, number];
|
|
32
|
+
export declare function createEmptyTableRow(columnCount: number, text: string): HTMLTableRowElement;
|
|
33
|
+
export declare function resourceLabel(snapshot: FrameGraphDebugViewModel, resourceId: string): string;
|
|
34
|
+
//# sourceMappingURL=panelWorkbenchHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelWorkbenchHelpers.d.ts","sourceRoot":"","sources":["../src/panelWorkbenchHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { createCell, formatBytes, labelResource } from "./panelDomHelpers.js";
|
|
2
|
+
export function selectionKey(selection) {
|
|
3
|
+
switch (selection.kind) {
|
|
4
|
+
case 'node': return `node:${selection.id}`;
|
|
5
|
+
case 'group': return `group:${selection.pathKey}`;
|
|
6
|
+
case 'resource': return `resource:${selection.id}`;
|
|
7
|
+
case 'root': return `root:${selection.index}`;
|
|
8
|
+
case 'culled': return `culled:${selection.index}`;
|
|
9
|
+
case 'allocation': return `allocation:${selection.id}`;
|
|
10
|
+
case 'segment': return `segment:${selection.index}`;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function sameSelection(a, b) {
|
|
14
|
+
return a === undefined || b === undefined ? a === b : selectionKey(a) === selectionKey(b);
|
|
15
|
+
}
|
|
16
|
+
export function updateSelectedRows(rows, selected) {
|
|
17
|
+
const key = selected ? selectionKey(selected) : undefined;
|
|
18
|
+
for (const [rowKey, elements] of rows) {
|
|
19
|
+
for (const element of elements) {
|
|
20
|
+
const active = rowKey === key;
|
|
21
|
+
element.classList.toggle('selected', active);
|
|
22
|
+
if (element.getAttribute('role') === 'option') {
|
|
23
|
+
element.setAttribute('aria-selected', active ? 'true' : 'false');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function registerSelectable(rows, element, selection, callbacks) {
|
|
29
|
+
const key = selectionKey(selection);
|
|
30
|
+
const elements = rows.get(key) ?? [];
|
|
31
|
+
elements.push(element);
|
|
32
|
+
rows.set(key, elements);
|
|
33
|
+
element.dataset.selectionKey = key;
|
|
34
|
+
element.addEventListener('mouseenter', () => callbacks.onHover(selection));
|
|
35
|
+
element.addEventListener('mouseleave', () => callbacks.onHover(undefined));
|
|
36
|
+
}
|
|
37
|
+
export function createViewToolbar(label) {
|
|
38
|
+
const toolbar = document.createElement('div');
|
|
39
|
+
toolbar.className = 'zenfg-inspector-view-toolbar';
|
|
40
|
+
toolbar.setAttribute('role', 'toolbar');
|
|
41
|
+
toolbar.setAttribute('aria-label', label);
|
|
42
|
+
return toolbar;
|
|
43
|
+
}
|
|
44
|
+
export function createSearchInput(placeholder, value, onInput) {
|
|
45
|
+
const input = document.createElement('input');
|
|
46
|
+
input.type = 'search';
|
|
47
|
+
input.placeholder = placeholder;
|
|
48
|
+
input.value = value;
|
|
49
|
+
input.setAttribute('aria-label', placeholder);
|
|
50
|
+
input.addEventListener('input', () => onInput(input.value));
|
|
51
|
+
return input;
|
|
52
|
+
}
|
|
53
|
+
export function createFilterSelect(label, value, options, onChange) {
|
|
54
|
+
const select = document.createElement('select');
|
|
55
|
+
select.setAttribute('aria-label', label);
|
|
56
|
+
for (const [optionValue, optionLabel] of options) {
|
|
57
|
+
const option = document.createElement('option');
|
|
58
|
+
option.value = optionValue;
|
|
59
|
+
option.textContent = optionLabel;
|
|
60
|
+
select.appendChild(option);
|
|
61
|
+
}
|
|
62
|
+
select.value = value;
|
|
63
|
+
select.addEventListener('change', () => onChange(select.value));
|
|
64
|
+
return select;
|
|
65
|
+
}
|
|
66
|
+
export function createTableScroller(headers) {
|
|
67
|
+
const scroller = document.createElement('div');
|
|
68
|
+
scroller.className = 'zenfg-inspector-table-scroller';
|
|
69
|
+
const table = document.createElement('table');
|
|
70
|
+
table.className = 'zenfg-inspector-workbench-table';
|
|
71
|
+
const head = document.createElement('thead');
|
|
72
|
+
const row = document.createElement('tr');
|
|
73
|
+
for (const header of headers) {
|
|
74
|
+
const cell = document.createElement('th');
|
|
75
|
+
cell.textContent = header.label;
|
|
76
|
+
if (header.column)
|
|
77
|
+
cell.dataset.column = header.column;
|
|
78
|
+
row.appendChild(cell);
|
|
79
|
+
}
|
|
80
|
+
head.appendChild(row);
|
|
81
|
+
const body = document.createElement('tbody');
|
|
82
|
+
table.append(head, body);
|
|
83
|
+
scroller.appendChild(table);
|
|
84
|
+
return { scroller, table, body };
|
|
85
|
+
}
|
|
86
|
+
export function createSelectionCell(text, selection, callbacks, column) {
|
|
87
|
+
const cell = document.createElement('td');
|
|
88
|
+
const button = createRelationButton(text, selection, callbacks.onSelect);
|
|
89
|
+
cell.appendChild(button);
|
|
90
|
+
if (column)
|
|
91
|
+
cell.dataset.column = column;
|
|
92
|
+
return cell;
|
|
93
|
+
}
|
|
94
|
+
export function createRelationButton(text, selection, onSelect) {
|
|
95
|
+
const button = document.createElement('button');
|
|
96
|
+
button.type = 'button';
|
|
97
|
+
button.className = 'zenfg-inspector-relation-button';
|
|
98
|
+
button.textContent = text;
|
|
99
|
+
button.addEventListener('click', () => onSelect(selection));
|
|
100
|
+
return button;
|
|
101
|
+
}
|
|
102
|
+
export function createKindCell(kind, label = kind) {
|
|
103
|
+
const cell = createCell('', { column: 'kind', kind });
|
|
104
|
+
const marker = document.createElement('span');
|
|
105
|
+
marker.className = 'zenfg-inspector-kind-label';
|
|
106
|
+
marker.dataset.kind = kind;
|
|
107
|
+
marker.textContent = label;
|
|
108
|
+
cell.appendChild(marker);
|
|
109
|
+
return cell;
|
|
110
|
+
}
|
|
111
|
+
export function groupPath(snapshot, groupId) {
|
|
112
|
+
if (groupId === undefined)
|
|
113
|
+
return '-';
|
|
114
|
+
return snapshot.groupById.get(groupId)?.path.join(' / ') ?? `group-${groupId}`;
|
|
115
|
+
}
|
|
116
|
+
export function formatEstimatedBytes(bytes) {
|
|
117
|
+
return bytes === undefined ? 'Unknown' : formatBytes(bytes);
|
|
118
|
+
}
|
|
119
|
+
export function formatResourceDescriptor(resource) {
|
|
120
|
+
const descriptor = resource.descriptor;
|
|
121
|
+
if (!descriptor)
|
|
122
|
+
return 'Unknown';
|
|
123
|
+
if (resource.kind === 'buffer' && 'size' in descriptor && typeof descriptor.size === 'number') {
|
|
124
|
+
return `${formatBytes(descriptor.size)} buffer`;
|
|
125
|
+
}
|
|
126
|
+
if ('format' in descriptor) {
|
|
127
|
+
const size = descriptor.size;
|
|
128
|
+
const extent = `${size.width}×${size.height}×${size.depthOrArrayLayers}`;
|
|
129
|
+
const extras = [
|
|
130
|
+
descriptor.dimension !== '2d' ? descriptor.dimension : undefined,
|
|
131
|
+
descriptor.mipLevelCount > 1 ? `${descriptor.mipLevelCount} mips` : undefined,
|
|
132
|
+
descriptor.sampleCount > 1 ? `${descriptor.sampleCount}× MSAA` : undefined,
|
|
133
|
+
descriptor.viewFormats.length > 0 ? `views ${descriptor.viewFormats.join(', ')}` : undefined,
|
|
134
|
+
].filter(Boolean);
|
|
135
|
+
return `${descriptor.format} · ${extent}${extras.length ? ` · ${extras.join(' · ')}` : ''}`;
|
|
136
|
+
}
|
|
137
|
+
return 'Unknown';
|
|
138
|
+
}
|
|
139
|
+
export function resourceAccessCounts(snapshot, resourceId) {
|
|
140
|
+
let reads = 0;
|
|
141
|
+
let writes = 0;
|
|
142
|
+
for (const access of snapshot.accessesByResourceId.get(resourceId) ?? []) {
|
|
143
|
+
if (access.mode === 'read')
|
|
144
|
+
reads++;
|
|
145
|
+
else
|
|
146
|
+
writes++;
|
|
147
|
+
}
|
|
148
|
+
return [reads, writes];
|
|
149
|
+
}
|
|
150
|
+
export function createEmptyTableRow(columnCount, text) {
|
|
151
|
+
const row = document.createElement('tr');
|
|
152
|
+
const cell = createCell(text);
|
|
153
|
+
cell.colSpan = columnCount;
|
|
154
|
+
cell.className = 'zenfg-inspector-empty-row';
|
|
155
|
+
row.appendChild(cell);
|
|
156
|
+
return row;
|
|
157
|
+
}
|
|
158
|
+
export function resourceLabel(snapshot, resourceId) {
|
|
159
|
+
const resource = snapshot.resourceById.get(resourceId);
|
|
160
|
+
return resource ? labelResource(resource) : `resource-${resourceId}`;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=panelWorkbenchHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelWorkbenchHelpers.js","sourceRoot":"","sources":["../src/panelWorkbenchHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tFrameGraphDebugResource,\n\tFrameGraphDebugViewModel,\n} from './debugCaptureModel.ts';\nimport { createCell, formatBytes, labelResource } from './panelDomHelpers.ts';\nimport type { Selection } from './panelTypes.ts';\n\nexport type WorkbenchCallbacks = {\n\treadonly onSelect: (selection: Selection) => void;\n\treadonly onHover: (selection: Selection | undefined) => void;\n\treadonly onGroupToggle: (pathKey: string) => void;\n\treadonly isGroupExpanded: (pathKey: string) => boolean;\n};\nexport type WorkbenchTableColumn = {\n\treadonly label: string;\n\treadonly column?: 'code' | 'kind' | 'numeric';\n};\n\n\nexport function selectionKey(selection: Selection): string {\n\tswitch (selection.kind) {\n\t\tcase 'node': return `node:${selection.id}`;\n\t\tcase 'group': return `group:${selection.pathKey}`;\n\t\tcase 'resource': return `resource:${selection.id}`;\n\t\tcase 'root': return `root:${selection.index}`;\n\t\tcase 'culled': return `culled:${selection.index}`;\n\t\tcase 'allocation': return `allocation:${selection.id}`;\n\t\tcase 'segment': return `segment:${selection.index}`;\n\t}\n}\n\nexport function sameSelection(a: Selection | undefined, b: Selection | undefined): boolean {\n\treturn a === undefined || b === undefined ? a === b : selectionKey(a) === selectionKey(b);\n}\n\nexport function updateSelectedRows(rows: ReadonlyMap<string, readonly HTMLElement[]>, selected: Selection | undefined): void {\n\tconst key = selected ? selectionKey(selected) : undefined;\n\tfor (const [rowKey, elements] of rows) {\n\t\tfor (const element of elements) {\n\t\t\tconst active = rowKey === key;\n\t\t\telement.classList.toggle('selected', active);\n\t\t\tif (element.getAttribute('role') === 'option') {\n\t\t\t\telement.setAttribute('aria-selected', active ? 'true' : 'false');\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function registerSelectable(\n\trows: Map<string, HTMLElement[]>,\n\telement: HTMLElement,\n\tselection: Selection,\n\tcallbacks: WorkbenchCallbacks,\n): void {\n\tconst key = selectionKey(selection);\n\tconst elements = rows.get(key) ?? [];\n\telements.push(element);\n\trows.set(key, elements);\n\telement.dataset.selectionKey = key;\n\telement.addEventListener('mouseenter', () => callbacks.onHover(selection));\n\telement.addEventListener('mouseleave', () => callbacks.onHover(undefined));\n}\n\nexport function createViewToolbar(label: string): HTMLDivElement {\n\tconst toolbar = document.createElement('div');\n\ttoolbar.className = 'zenfg-inspector-view-toolbar';\n\ttoolbar.setAttribute('role', 'toolbar');\n\ttoolbar.setAttribute('aria-label', label);\n\treturn toolbar;\n}\n\nexport function createSearchInput(\n\tplaceholder: string,\n\tvalue: string,\n\tonInput: (value: string) => void,\n): HTMLInputElement {\n\tconst input = document.createElement('input');\n\tinput.type = 'search';\n\tinput.placeholder = placeholder;\n\tinput.value = value;\n\tinput.setAttribute('aria-label', placeholder);\n\tinput.addEventListener('input', () => onInput(input.value));\n\treturn input;\n}\n\nexport function createFilterSelect(\n\tlabel: string,\n\tvalue: string,\n\toptions: readonly (readonly [value: string, label: string])[],\n\tonChange: (value: string) => void,\n): HTMLSelectElement {\n\tconst select = document.createElement('select');\n\tselect.setAttribute('aria-label', label);\n\tfor (const [optionValue, optionLabel] of options) {\n\t\tconst option = document.createElement('option');\n\t\toption.value = optionValue;\n\t\toption.textContent = optionLabel;\n\t\tselect.appendChild(option);\n\t}\n\tselect.value = value;\n\tselect.addEventListener('change', () => onChange(select.value));\n\treturn select;\n}\n\nexport function createTableScroller(headers: readonly WorkbenchTableColumn[]): {\n\treadonly scroller: HTMLDivElement;\n\treadonly table: HTMLTableElement;\n\treadonly body: HTMLTableSectionElement;\n} {\n\tconst scroller = document.createElement('div');\n\tscroller.className = 'zenfg-inspector-table-scroller';\n\tconst table = document.createElement('table');\n\ttable.className = 'zenfg-inspector-workbench-table';\n\tconst head = document.createElement('thead');\n\tconst row = document.createElement('tr');\n\tfor (const header of headers) {\n\t\tconst cell = document.createElement('th');\n\t\tcell.textContent = header.label;\n\t\tif (header.column) cell.dataset.column = header.column;\n\t\trow.appendChild(cell);\n\t}\n\thead.appendChild(row);\n\tconst body = document.createElement('tbody');\n\ttable.append(head, body);\n\tscroller.appendChild(table);\n\treturn { scroller, table, body };\n}\n\nexport function createSelectionCell(\n\ttext: string,\n\tselection: Selection,\n\tcallbacks: WorkbenchCallbacks,\n\tcolumn?: WorkbenchTableColumn['column'],\n): HTMLTableCellElement {\n\tconst cell = document.createElement('td');\n\tconst button = createRelationButton(text, selection, callbacks.onSelect);\n\tcell.appendChild(button);\n\tif (column) cell.dataset.column = column;\n\treturn cell;\n}\n\nexport function createRelationButton(\n\ttext: string,\n\tselection: Selection,\n\tonSelect: (selection: Selection) => void,\n): HTMLButtonElement {\n\tconst button = document.createElement('button');\n\tbutton.type = 'button';\n\tbutton.className = 'zenfg-inspector-relation-button';\n\tbutton.textContent = text;\n\tbutton.addEventListener('click', () => onSelect(selection));\n\treturn button;\n}\n\nexport function createKindCell(kind: string, label = kind): HTMLTableCellElement {\n\tconst cell = createCell('', { column: 'kind', kind });\n\tconst marker = document.createElement('span');\n\tmarker.className = 'zenfg-inspector-kind-label';\n\tmarker.dataset.kind = kind;\n\tmarker.textContent = label;\n\tcell.appendChild(marker);\n\treturn cell;\n}\n\r\nexport function groupPath(snapshot: FrameGraphDebugViewModel, groupId: string | undefined): string {\n\tif (groupId === undefined) return '-';\n\treturn snapshot.groupById.get(groupId)?.path.join(' / ') ?? `group-${groupId}`;\n}\n\nexport function formatEstimatedBytes(bytes: number | undefined): string {\n\treturn bytes === undefined ? 'Unknown' : formatBytes(bytes);\n}\n\nexport function formatResourceDescriptor(resource: FrameGraphDebugResource): string {\n\tconst descriptor = resource.descriptor;\n\tif (!descriptor) return 'Unknown';\n\tif (resource.kind === 'buffer' && 'size' in descriptor && typeof descriptor.size === 'number') {\n\t\treturn `${formatBytes(descriptor.size)} buffer`;\n\t}\n\tif ('format' in descriptor) {\n\t\tconst size = descriptor.size;\n\t\tconst extent = `${size.width}×${size.height}×${size.depthOrArrayLayers}`;\n\t\tconst extras = [\n\t\t\tdescriptor.dimension !== '2d' ? descriptor.dimension : undefined,\n\t\t\tdescriptor.mipLevelCount > 1 ? `${descriptor.mipLevelCount} mips` : undefined,\n\t\t\tdescriptor.sampleCount > 1 ? `${descriptor.sampleCount}× MSAA` : undefined,\n\t\t\tdescriptor.viewFormats.length > 0 ? `views ${descriptor.viewFormats.join(', ')}` : undefined,\n\t\t].filter(Boolean);\n\t\treturn `${descriptor.format} · ${extent}${extras.length ? ` · ${extras.join(' · ')}` : ''}`;\n\t}\n\treturn 'Unknown';\n}\n\nexport function resourceAccessCounts(snapshot: FrameGraphDebugViewModel, resourceId: string): readonly [number, number] {\n\tlet reads = 0;\n\tlet writes = 0;\n\tfor (const access of snapshot.accessesByResourceId.get(resourceId) ?? []) {\n\t\tif (access.mode === 'read') reads++;\n\t\telse writes++;\n\t}\n\treturn [reads, writes];\n}\n\nexport function createEmptyTableRow(columnCount: number, text: string): HTMLTableRowElement {\n\tconst row = document.createElement('tr');\n\tconst cell = createCell(text);\n\tcell.colSpan = columnCount;\n\tcell.className = 'zenfg-inspector-empty-row';\n\trow.appendChild(cell);\n\treturn row;\n}\n\nexport function resourceLabel(snapshot: FrameGraphDebugViewModel, resourceId: string): string {\n\tconst resource = snapshot.resourceById.get(resourceId);\n\treturn resource ? labelResource(resource) : `resource-${resourceId}`;\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';
|
|
2
|
+
import type { GraphViewState, Selection, WorkbenchTab } from './panelTypes.ts';
|
|
3
|
+
import { type WorkbenchCallbacks } from './panelWorkbenchHelpers.ts';
|
|
4
|
+
export type FrameGraphDebugWorkbenchActions = {
|
|
5
|
+
onCapture(): void;
|
|
6
|
+
onImport(file: File): void;
|
|
7
|
+
onDownload(): void;
|
|
8
|
+
onCopyJson(): void;
|
|
9
|
+
};
|
|
10
|
+
export type FrameGraphDebugWorkbenchOptions = {
|
|
11
|
+
branding: string | false;
|
|
12
|
+
idPrefix: string;
|
|
13
|
+
};
|
|
14
|
+
export type FrameGraphDebugEmptyStateKind = 'waiting' | 'capturing' | 'empty' | 'error';
|
|
15
|
+
export type FrameGraphDebugSnapshotActionState = {
|
|
16
|
+
providerAvailable: boolean;
|
|
17
|
+
hasCapture: boolean;
|
|
18
|
+
capturing: boolean;
|
|
19
|
+
importing: boolean;
|
|
20
|
+
copying: boolean;
|
|
21
|
+
copied: boolean;
|
|
22
|
+
message?: string;
|
|
23
|
+
messageTone?: 'neutral' | 'error';
|
|
24
|
+
};
|
|
25
|
+
export declare class FrameGraphDebugWorkbench {
|
|
26
|
+
private readonly graphView;
|
|
27
|
+
private readonly callbacks;
|
|
28
|
+
readonly root: HTMLDivElement;
|
|
29
|
+
private readonly summary;
|
|
30
|
+
private readonly commandBar;
|
|
31
|
+
private readonly brand;
|
|
32
|
+
private readonly tabList;
|
|
33
|
+
private readonly commandActions;
|
|
34
|
+
private readonly commandStatus;
|
|
35
|
+
private readonly workspace;
|
|
36
|
+
private readonly main;
|
|
37
|
+
private readonly emptyHost;
|
|
38
|
+
private readonly overviewRoot;
|
|
39
|
+
private readonly graphRoot;
|
|
40
|
+
private readonly passes;
|
|
41
|
+
private readonly resources;
|
|
42
|
+
private readonly memory;
|
|
43
|
+
private readonly diagnostics;
|
|
44
|
+
private readonly inspector;
|
|
45
|
+
private readonly inspectorOpenButton;
|
|
46
|
+
private readonly captureButton;
|
|
47
|
+
private readonly importButton;
|
|
48
|
+
private readonly importInput;
|
|
49
|
+
private readonly exportButton;
|
|
50
|
+
private readonly exportMenu;
|
|
51
|
+
private readonly downloadButton;
|
|
52
|
+
private readonly copyButton;
|
|
53
|
+
private readonly tabButtons;
|
|
54
|
+
private readonly views;
|
|
55
|
+
private activeTab;
|
|
56
|
+
private hasSnapshot;
|
|
57
|
+
private snapshot;
|
|
58
|
+
private selected;
|
|
59
|
+
private hovered;
|
|
60
|
+
constructor(graphView: GraphViewState, callbacks: WorkbenchCallbacks, actions: FrameGraphDebugWorkbenchActions, options: FrameGraphDebugWorkbenchOptions);
|
|
61
|
+
setSnapshot(snapshot: FrameGraphDebugViewModel, selected: Selection | undefined): void;
|
|
62
|
+
showEmptyState(kind: FrameGraphDebugEmptyStateKind, message: string, detail?: string): void;
|
|
63
|
+
setSnapshotActionState(state: FrameGraphDebugSnapshotActionState): void;
|
|
64
|
+
setSelection(selected: Selection | undefined): void;
|
|
65
|
+
setHovered(hovered: Selection | undefined): void;
|
|
66
|
+
setActiveTab(tab: WorkbenchTab): void;
|
|
67
|
+
refreshGraphStructure(): void;
|
|
68
|
+
resizeGraph(fit?: boolean): void;
|
|
69
|
+
private updateActiveTab;
|
|
70
|
+
private renderGraph;
|
|
71
|
+
private renderSummary;
|
|
72
|
+
private createSummaryGroup;
|
|
73
|
+
private setExportMenuOpen;
|
|
74
|
+
private handleInspectorOpenChange;
|
|
75
|
+
private updateWorkspaceState;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=panelWorkbenchView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelWorkbenchView.d.ts","sourceRoot":"","sources":["../src/panelWorkbenchView.ts"],"names":[],"mappings":"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"}
|