blob: 5d09f62f82e1ca97e27927a30ef93289ed13453c [file] [log] [blame]
// These functions will throw an error if the JSON doesn't match the DebugTrace interface, even if
// the JSON is valid.
import {
Convert as GencodeConvert,
DebugTrace,
Function as FunctionInfo,
Slot as SlotInfo
} from './generate/debug-trace-quicktype';
export { DebugTrace, FunctionInfo, SlotInfo };
export class Convert extends GencodeConvert {
public static toDebugTrace(json: string): DebugTrace {
// Use the quicktype library to parse and check the validity of the passed-in JSON.
const out = GencodeConvert.toDebugTrace(json);
// Confirm the version of the JSON trace data.
const expectedVersion: string = '20220209';
if (out.version != expectedVersion) {
throw Error(
`Version mismatch. Trace version is '${out.version}', expected version ` +
`is '${expectedVersion}'`);
}
// The trace data consists of three values--one trace-op and two data fields.
// https://github.com/google/skia/blob/2ac310266912687a2266d45f5008b942d56fc35e/src/sksl/tracing/SkVMDebugTrace.h#L52-L53
// Our JSON trace arrays omit trailing zeros from the data to save space. Re-insert them here.
for (let index = 0; index < out.trace.length; ++index) {
while (out.trace[index].length < 3) {
out.trace[index].push(0);
}
}
// If the groupIdx field is missing from a slot, have it mirror `index` (the component index).
for (let index = 0; index < out.slots.length; ++index) {
if ((out.slots[index].groupIdx ?? -1) < 0) {
out.slots[index].groupIdx = out.slots[index].index;
}
}
return out;
}
}