This commit is contained in:
parent
6bc125be1c
commit
ed5a4379db
76 changed files with 1418 additions and 988 deletions
|
|
@ -16,11 +16,6 @@ interface GpuProfilerSample {
|
|||
totalPassMs: number;
|
||||
}
|
||||
|
||||
interface FleetingGardenPerf {
|
||||
latest?: GpuProfilerSample;
|
||||
samples: Array<GpuProfilerSample>;
|
||||
}
|
||||
|
||||
interface ActivePass {
|
||||
endQueryIndex: number;
|
||||
name: GpuPassName;
|
||||
|
|
@ -32,33 +27,29 @@ interface ReadbackSlot {
|
|||
state: 'idle' | 'encoding' | 'mapping';
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
__fleetingGardenPerf?: FleetingGardenPerf;
|
||||
}
|
||||
}
|
||||
|
||||
const MAX_QUERY_COUNT = PASS_NAMES.length * 2;
|
||||
const QUERY_BYTES = BigUint64Array.BYTES_PER_ELEMENT;
|
||||
const READBACK_SLOT_COUNT = 4;
|
||||
const MAX_SAMPLE_COUNT = 600;
|
||||
|
||||
export class GpuProfiler {
|
||||
private readonly querySet: GPUQuerySet;
|
||||
private readonly resolveBuffer: GPUBuffer;
|
||||
private readonly readbackSlots: Array<ReadbackSlot>;
|
||||
private readonly isEnabled: () => boolean;
|
||||
private activePasses: Array<ActivePass> = [];
|
||||
private nextQueryIndex = 0;
|
||||
private frame = 0;
|
||||
private latestSample: GpuProfilerSample | null = null;
|
||||
|
||||
public static create(device: GPUDevice): GpuProfiler | null {
|
||||
public static create(device: GPUDevice, isEnabled: () => boolean): GpuProfiler | null {
|
||||
if (!device.features.has('timestamp-query')) {
|
||||
return null;
|
||||
}
|
||||
return new GpuProfiler(device);
|
||||
return new GpuProfiler(device, isEnabled);
|
||||
}
|
||||
|
||||
private constructor(device: GPUDevice) {
|
||||
private constructor(device: GPUDevice, isEnabled: () => boolean) {
|
||||
this.isEnabled = isEnabled;
|
||||
this.querySet = device.createQuerySet({
|
||||
type: 'timestamp',
|
||||
count: MAX_QUERY_COUNT,
|
||||
|
|
@ -85,6 +76,9 @@ export class GpuProfiler {
|
|||
public timestampWrites(
|
||||
name: GpuPassName
|
||||
): (GPUComputePassTimestampWrites & GPURenderPassTimestampWrites) | undefined {
|
||||
if (!this.isEnabled()) {
|
||||
return undefined;
|
||||
}
|
||||
if (this.nextQueryIndex + 1 >= MAX_QUERY_COUNT) {
|
||||
return undefined;
|
||||
}
|
||||
|
|
@ -146,6 +140,10 @@ export class GpuProfiler {
|
|||
});
|
||||
}
|
||||
|
||||
public get latestTotalPassMs(): number | undefined {
|
||||
return this.latestSample?.totalPassMs;
|
||||
}
|
||||
|
||||
private publishSample(
|
||||
frame: number,
|
||||
passes: Array<ActivePass>,
|
||||
|
|
@ -170,11 +168,6 @@ export class GpuProfiler {
|
|||
sample.totalPassMs += elapsedMs;
|
||||
});
|
||||
|
||||
const perf = (window.__fleetingGardenPerf ??= { samples: [] });
|
||||
perf.latest = sample;
|
||||
perf.samples.push(sample);
|
||||
if (perf.samples.length > MAX_SAMPLE_COUNT) {
|
||||
perf.samples.splice(0, perf.samples.length - MAX_SAMPLE_COUNT);
|
||||
}
|
||||
this.latestSample = sample;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue