@forgeax/engine-rhi-debug 0.0.0-dev.8d955ade1c79
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 +202 -0
- package/README.md +178 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/bootstrap-integration.test.d.ts +2 -0
- package/dist/__tests__/bootstrap-integration.test.d.ts.map +1 -0
- package/dist/__tests__/consumer-inventory.unit.test.d.ts +2 -0
- package/dist/__tests__/consumer-inventory.unit.test.d.ts.map +1 -0
- package/dist/__tests__/copy-src-usage-validity.dawn.test.d.ts +15 -0
- package/dist/__tests__/copy-src-usage-validity.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/coverage-invariant.test-d.d.ts +2 -0
- package/dist/__tests__/coverage-invariant.test-d.d.ts.map +1 -0
- package/dist/__tests__/coverage-invariant.unit.test.d.ts +2 -0
- package/dist/__tests__/coverage-invariant.unit.test.d.ts.map +1 -0
- package/dist/__tests__/e2e.browser.test.d.ts +2 -0
- package/dist/__tests__/e2e.browser.test.d.ts.map +1 -0
- package/dist/__tests__/error-code-narrowing.test-d.d.ts +2 -0
- package/dist/__tests__/error-code-narrowing.test-d.d.ts.map +1 -0
- package/dist/__tests__/errors-v7.test-d.d.ts +2 -0
- package/dist/__tests__/errors-v7.test-d.d.ts.map +1 -0
- package/dist/__tests__/errors-v7.unit.test.d.ts +2 -0
- package/dist/__tests__/errors-v7.unit.test.d.ts.map +1 -0
- package/dist/__tests__/errors.unit.test.d.ts +2 -0
- package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/event-semantics-coverage.unit.test.d.ts +2 -0
- package/dist/__tests__/event-semantics-coverage.unit.test.d.ts.map +1 -0
- package/dist/__tests__/format-info.unit.test.d.ts +2 -0
- package/dist/__tests__/format-info.unit.test.d.ts.map +1 -0
- package/dist/__tests__/frame-model-parity.test-d.d.ts +2 -0
- package/dist/__tests__/frame-model-parity.test-d.d.ts.map +1 -0
- package/dist/__tests__/frame-model-parity.unit.test.d.ts +2 -0
- package/dist/__tests__/frame-model-parity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/guard-gates.test.d.ts +2 -0
- package/dist/__tests__/guard-gates.test.d.ts.map +1 -0
- package/dist/__tests__/public-surface.integration.test.d.ts +2 -0
- package/dist/__tests__/public-surface.integration.test.d.ts.map +1 -0
- package/dist/__tests__/readback-fault-cleanup.unit.test.d.ts +2 -0
- package/dist/__tests__/readback-fault-cleanup.unit.test.d.ts.map +1 -0
- package/dist/__tests__/readback-format-matrix.dawn.test.d.ts +2 -0
- package/dist/__tests__/readback-format-matrix.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/readback-format-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/readback-format-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/readback-matrix-fixture.d.ts +32 -0
- package/dist/__tests__/readback-matrix-fixture.d.ts.map +1 -0
- package/dist/__tests__/recorder-bootstrap.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-bootstrap.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-budget.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-budget.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-fail-fast.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-fail-fast.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-push-event.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-push-event.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-session.integration.test.d.ts +2 -0
- package/dist/__tests__/recorder-session.integration.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-session.unit.test.d.ts +2 -0
- package/dist/__tests__/recorder-session.unit.test.d.ts.map +1 -0
- package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts +2 -0
- package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/replay-fail-fast.unit.test.d.ts +2 -0
- package/dist/__tests__/replay-fail-fast.unit.test.d.ts.map +1 -0
- package/dist/__tests__/replay-session.dawn.test.d.ts +2 -0
- package/dist/__tests__/replay-session.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/replay-session.test-d.d.ts +2 -0
- package/dist/__tests__/replay-session.test-d.d.ts.map +1 -0
- package/dist/__tests__/replay-session.unit.test.d.ts +2 -0
- package/dist/__tests__/replay-session.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts +2 -0
- package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resource-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/resource-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts +2 -0
- package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/tape-index.unit.test.d.ts +2 -0
- package/dist/__tests__/tape-index.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tape-v7-invalid.unit.test.d.ts +2 -0
- package/dist/__tests__/tape-v7-invalid.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tape-v7-version.unit.test.d.ts +2 -0
- package/dist/__tests__/tape-v7-version.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tree-shake.unit.test.d.ts +2 -0
- package/dist/__tests__/tree-shake.unit.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/browser.d.ts +45 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.mjs +83 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/frame-model.d.ts +158 -0
- package/dist/frame-model.d.ts.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +10415 -0
- package/dist/index.mjs.map +1 -0
- package/dist/protocol/codec.d.ts +6 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/event-semantics.d.ts +15 -0
- package/dist/protocol/event-semantics.d.ts.map +1 -0
- package/dist/protocol/tape-index.d.ts +30 -0
- package/dist/protocol/tape-index.d.ts.map +1 -0
- package/dist/protocol/types.d.ts +44 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/validation.d.ts +7 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/readback.d.ts +156 -0
- package/dist/readback.d.ts.map +1 -0
- package/dist/recorder/assemble.d.ts +11 -0
- package/dist/recorder/assemble.d.ts.map +1 -0
- package/dist/recorder/closure.d.ts +39 -0
- package/dist/recorder/closure.d.ts.map +1 -0
- package/dist/recorder/core.d.ts +296 -0
- package/dist/recorder/core.d.ts.map +1 -0
- package/dist/recorder/device.d.ts +4 -0
- package/dist/recorder/device.d.ts.map +1 -0
- package/dist/recorder/encoder.d.ts +5 -0
- package/dist/recorder/encoder.d.ts.map +1 -0
- package/dist/recorder/lifecycle.d.ts +20 -0
- package/dist/recorder/lifecycle.d.ts.map +1 -0
- package/dist/recorder/pass.d.ts +6 -0
- package/dist/recorder/pass.d.ts.map +1 -0
- package/dist/recorder/proxy.d.ts +19 -0
- package/dist/recorder/proxy.d.ts.map +1 -0
- package/dist/recorder/queue.d.ts +4 -0
- package/dist/recorder/queue.d.ts.map +1 -0
- package/dist/recorder/resource-registry.d.ts +15 -0
- package/dist/recorder/resource-registry.d.ts.map +1 -0
- package/dist/recorder/session.d.ts +25 -0
- package/dist/recorder/session.d.ts.map +1 -0
- package/dist/recorder/shader.d.ts +3 -0
- package/dist/recorder/shader.d.ts.map +1 -0
- package/dist/recorder/snapshot.d.ts +10 -0
- package/dist/recorder/snapshot.d.ts.map +1 -0
- package/dist/recorder/wrap.d.ts +4 -0
- package/dist/recorder/wrap.d.ts.map +1 -0
- package/dist/recorder.d.ts +7 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/replay/device-request.d.ts +8 -0
- package/dist/replay/device-request.d.ts.map +1 -0
- package/dist/replay/execute-support.d.ts +33 -0
- package/dist/replay/execute-support.d.ts.map +1 -0
- package/dist/replay/execute.d.ts +18 -0
- package/dist/replay/execute.d.ts.map +1 -0
- package/dist/replay/readback.d.ts +32 -0
- package/dist/replay/readback.d.ts.map +1 -0
- package/dist/replay/resources.d.ts +57 -0
- package/dist/replay/resources.d.ts.map +1 -0
- package/dist/replay/session.d.ts +49 -0
- package/dist/replay/session.d.ts.map +1 -0
- package/dist/replay/texture-format.d.ts +21 -0
- package/dist/replay/texture-format.d.ts.map +1 -0
- package/dist/texel-decode.d.ts +35 -0
- package/dist/texel-decode.d.ts.map +1 -0
- package/dist/texel-layout.d.ts +76 -0
- package/dist/texel-layout.d.ts.map +1 -0
- package/dist/types.d.ts +722 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +72 -0
- package/src/__tests__/bootstrap-integration.test.ts +268 -0
- package/src/__tests__/consumer-inventory.unit.test.ts +154 -0
- package/src/__tests__/copy-src-usage-validity.dawn.test.ts +117 -0
- package/src/__tests__/coverage-invariant.test-d.ts +115 -0
- package/src/__tests__/coverage-invariant.unit.test.ts +45 -0
- package/src/__tests__/e2e.browser.test.ts +239 -0
- package/src/__tests__/error-code-narrowing.test-d.ts +32 -0
- package/src/__tests__/errors-v7.test-d.ts +19 -0
- package/src/__tests__/errors-v7.unit.test.ts +15 -0
- package/src/__tests__/errors.unit.test.ts +83 -0
- package/src/__tests__/event-semantics-coverage.unit.test.ts +22 -0
- package/src/__tests__/format-info.unit.test.ts +85 -0
- package/src/__tests__/frame-model-parity.test-d.ts +20 -0
- package/src/__tests__/frame-model-parity.unit.test.ts +285 -0
- package/src/__tests__/guard-gates.test.ts +317 -0
- package/src/__tests__/public-surface.integration.test.ts +38 -0
- package/src/__tests__/readback-fault-cleanup.unit.test.ts +66 -0
- package/src/__tests__/readback-format-matrix.dawn.test.ts +378 -0
- package/src/__tests__/readback-format-matrix.unit.test.ts +120 -0
- package/src/__tests__/readback-matrix-fixture.ts +20 -0
- package/src/__tests__/recorder-bootstrap.unit.test.ts +302 -0
- package/src/__tests__/recorder-budget.unit.test.ts +42 -0
- package/src/__tests__/recorder-fail-fast.unit.test.ts +434 -0
- package/src/__tests__/recorder-lifecycle.unit.test.ts +42 -0
- package/src/__tests__/recorder-push-event.unit.test.ts +573 -0
- package/src/__tests__/recorder-session.integration.test.ts +32 -0
- package/src/__tests__/recorder-session.unit.test.ts +63 -0
- package/src/__tests__/recorder-steady-frame.dawn.test.ts +52 -0
- package/src/__tests__/replay-fail-fast.unit.test.ts +155 -0
- package/src/__tests__/replay-session.dawn.test.ts +220 -0
- package/src/__tests__/replay-session.test-d.ts +27 -0
- package/src/__tests__/replay-session.unit.test.ts +171 -0
- package/src/__tests__/resolve-texture-descriptor.unit.test.ts +144 -0
- package/src/__tests__/resource-lifecycle.unit.test.ts +114 -0
- package/src/__tests__/rhi-debug-fresh-replay.dawn.test.ts +178 -0
- package/src/__tests__/tape-index.unit.test.ts +56 -0
- package/src/__tests__/tape-v7-invalid.unit.test.ts +45 -0
- package/src/__tests__/tape-v7-roundtrip.unit.test.ts +66 -0
- package/src/__tests__/tape-v7-version.unit.test.ts +13 -0
- package/src/__tests__/tree-shake.unit.test.ts +151 -0
- package/src/__tests__/types.test.ts +257 -0
- package/src/browser.ts +146 -0
- package/src/errors.ts +173 -0
- package/src/frame-model.ts +753 -0
- package/src/index.ts +92 -0
- package/src/pako.d.ts +8 -0
- package/src/protocol/codec.ts +220 -0
- package/src/protocol/event-semantics.ts +180 -0
- package/src/protocol/tape-index.ts +120 -0
- package/src/protocol/types.ts +60 -0
- package/src/protocol/validation.ts +173 -0
- package/src/readback.ts +804 -0
- package/src/recorder/assemble.ts +192 -0
- package/src/recorder/closure.ts +408 -0
- package/src/recorder/core.ts +587 -0
- package/src/recorder/device.ts +474 -0
- package/src/recorder/encoder.ts +251 -0
- package/src/recorder/lifecycle.ts +847 -0
- package/src/recorder/pass.ts +241 -0
- package/src/recorder/proxy.ts +59 -0
- package/src/recorder/queue.ts +109 -0
- package/src/recorder/resource-registry.ts +53 -0
- package/src/recorder/session.ts +152 -0
- package/src/recorder/shader.ts +47 -0
- package/src/recorder/snapshot.ts +38 -0
- package/src/recorder/wrap.ts +157 -0
- package/src/recorder.ts +15 -0
- package/src/replay/device-request.ts +38 -0
- package/src/replay/execute-support.ts +243 -0
- package/src/replay/execute.ts +870 -0
- package/src/replay/readback.ts +671 -0
- package/src/replay/resources.ts +154 -0
- package/src/replay/session.ts +509 -0
- package/src/replay/texture-format.ts +99 -0
- package/src/texel-decode.ts +289 -0
- package/src/texel-layout.ts +324 -0
- package/src/types.ts +888 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { BindGroup, BindGroupLayout, Buffer, CommandBuffer, ComputePipeline, PipelineLayout, RenderPipeline, RhiCommandEncoder, RhiComputePassEncoder, RhiDevice, RhiRenderPassEncoder, Sampler, ShaderModule, Texture, TextureView } from '@forgeax/engine-rhi';
|
|
2
|
+
import { type Result } from '@forgeax/engine-types';
|
|
3
|
+
import { type RhiDebugError } from '../errors';
|
|
4
|
+
import type { ResourceKind } from '../protocol/types';
|
|
5
|
+
export type ReplayResource = {
|
|
6
|
+
readonly role?: string;
|
|
7
|
+
} & ({
|
|
8
|
+
readonly kind: 'buffer';
|
|
9
|
+
readonly value: Buffer;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'texture';
|
|
12
|
+
readonly value: Texture;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'texture-view';
|
|
15
|
+
readonly value: TextureView;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'sampler';
|
|
18
|
+
readonly value: Sampler;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'shader-module';
|
|
21
|
+
readonly value: ShaderModule;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'pipeline';
|
|
24
|
+
readonly role: 'render' | 'compute';
|
|
25
|
+
readonly value: RenderPipeline | ComputePipeline;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: 'binding';
|
|
28
|
+
readonly role: 'bind-group' | 'bind-group-layout' | 'pipeline-layout';
|
|
29
|
+
readonly value: BindGroup | BindGroupLayout | PipelineLayout;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: 'encoder';
|
|
32
|
+
readonly role: 'command' | 'command-buffer' | 'render-pass' | 'compute-pass';
|
|
33
|
+
readonly value: RhiCommandEncoder | RhiRenderPassEncoder | RhiComputePassEncoder | CommandBuffer;
|
|
34
|
+
});
|
|
35
|
+
export interface ResourceTableEntry {
|
|
36
|
+
readonly resourceId: string;
|
|
37
|
+
readonly generation: number;
|
|
38
|
+
readonly resource: ReplayResource;
|
|
39
|
+
readonly descriptor: Record<string, unknown> | undefined;
|
|
40
|
+
}
|
|
41
|
+
export declare class ResourceTable {
|
|
42
|
+
private readonly device;
|
|
43
|
+
private readonly entries;
|
|
44
|
+
private disposed;
|
|
45
|
+
private currentGeneration;
|
|
46
|
+
constructor(device: RhiDevice, generation?: number);
|
|
47
|
+
get generation(): number;
|
|
48
|
+
get(resourceId: string): ResourceTableEntry | undefined;
|
|
49
|
+
set(resourceId: string, resource: ReplayResource, descriptor?: Record<string, unknown> | undefined): Result<void, RhiDebugError>;
|
|
50
|
+
delete(resourceId: string): void;
|
|
51
|
+
values(): IterableIterator<ResourceTableEntry>;
|
|
52
|
+
reset(): Result<void, RhiDebugError>;
|
|
53
|
+
dispose(): Result<void, RhiDebugError>;
|
|
54
|
+
private releaseAll;
|
|
55
|
+
}
|
|
56
|
+
export declare function isResourceKind(resource: ReplayResource, kind: ResourceKind): boolean;
|
|
57
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/replay/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { RhiDevice } from '@forgeax/engine-rhi';
|
|
2
|
+
import { type Result } from '@forgeax/engine-types';
|
|
3
|
+
import { type RhiDebugError } from '../errors';
|
|
4
|
+
import { type WorkBinding, type WorkPipeline } from '../frame-model';
|
|
5
|
+
import type { Tape } from '../protocol/types';
|
|
6
|
+
import type { CreateShaderModuleFn } from '../recorder';
|
|
7
|
+
import { type BufferReadbackRange, type ReplayReadbackResult } from './readback';
|
|
8
|
+
export interface ReplayBackend {
|
|
9
|
+
readonly device: RhiDevice;
|
|
10
|
+
readonly createShaderModule: CreateShaderModuleFn;
|
|
11
|
+
}
|
|
12
|
+
export interface TextureSubresource {
|
|
13
|
+
readonly mipLevel: number;
|
|
14
|
+
readonly arrayLayer: number;
|
|
15
|
+
readonly aspect?: 'all' | 'depth-only' | 'stencil-only';
|
|
16
|
+
}
|
|
17
|
+
export type ReadbackSubresource = TextureSubresource | BufferReadbackRange;
|
|
18
|
+
export type InspectField = 'bindings' | 'pipeline' | 'pixels';
|
|
19
|
+
export interface WorkInspection {
|
|
20
|
+
readonly workIndex: number;
|
|
21
|
+
readonly eventIndex: number;
|
|
22
|
+
readonly passIndex: number;
|
|
23
|
+
readonly attachment: ReplayReadbackResult | undefined;
|
|
24
|
+
readonly pipeline?: WorkPipeline;
|
|
25
|
+
readonly bindings?: readonly WorkBinding[];
|
|
26
|
+
readonly vertexBuffers?: readonly {
|
|
27
|
+
readonly slot: number;
|
|
28
|
+
readonly bufferHandleId: string;
|
|
29
|
+
readonly offset: number;
|
|
30
|
+
readonly size: number | null;
|
|
31
|
+
}[];
|
|
32
|
+
readonly indexBuffer?: {
|
|
33
|
+
readonly bufferHandleId: string;
|
|
34
|
+
readonly format: string;
|
|
35
|
+
readonly offset: number;
|
|
36
|
+
readonly size: number | null;
|
|
37
|
+
} | null;
|
|
38
|
+
readonly shaders?: WorkPipeline['shaders'];
|
|
39
|
+
readonly resourceIds?: readonly string[];
|
|
40
|
+
}
|
|
41
|
+
export interface ReplaySession {
|
|
42
|
+
readonly generation: number;
|
|
43
|
+
inspectWork(workIndex: number, fields?: readonly InspectField[], signal?: AbortSignal): Promise<Result<WorkInspection, RhiDebugError>>;
|
|
44
|
+
readResource(resourceId: string, subresource?: ReadbackSubresource, signal?: AbortSignal): Promise<Result<ReplayReadbackResult, RhiDebugError>>;
|
|
45
|
+
dispose(): Promise<Result<void, RhiDebugError>>;
|
|
46
|
+
}
|
|
47
|
+
export declare function openReplay(tape: Tape, backend: ReplayBackend): Promise<Result<ReplaySession, RhiDebugError>>;
|
|
48
|
+
export type { BufferReadbackRange, ReplayReadbackResult } from './readback';
|
|
49
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/replay/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface TextureReadbackDescriptor {
|
|
2
|
+
readonly format: string;
|
|
3
|
+
readonly dimension: string;
|
|
4
|
+
readonly aspect?: GPUTextureAspect | undefined;
|
|
5
|
+
}
|
|
6
|
+
export type TextureReadbackPlan = {
|
|
7
|
+
readonly supported: true;
|
|
8
|
+
readonly format: string;
|
|
9
|
+
readonly bytesPerTexel: number;
|
|
10
|
+
readonly blockWidth: 1;
|
|
11
|
+
readonly blockHeight: 1;
|
|
12
|
+
} | {
|
|
13
|
+
readonly supported: false;
|
|
14
|
+
readonly format: string;
|
|
15
|
+
readonly reason: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function isDepthTextureFormat(format: string): boolean;
|
|
18
|
+
export declare function isDepthStencilTextureFormat(format: string): boolean;
|
|
19
|
+
export declare function getTextureReadbackPlan(descriptor: TextureReadbackDescriptor): TextureReadbackPlan;
|
|
20
|
+
export declare function textureBytesPerTexel(format: string): number | undefined;
|
|
21
|
+
//# sourceMappingURL=texture-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texture-format.d.ts","sourceRoot":"","sources":["../../src/replay/texture-format.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AA2BN,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,yBAAyB,GAAG,mBAAmB,CAuCjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Decode a single IEEE half-float (16-bit) bit pattern to a JS number. */
|
|
2
|
+
export declare function halfToFloat(h: number): number;
|
|
3
|
+
/**
|
|
4
|
+
* Decode tight raw GPU bytes of a supported color or depth/stencil plane into
|
|
5
|
+
* RGBA8 the canvas can paint via putImageData. Returns null when the format has
|
|
6
|
+
* no {@link formatInfo} entry or the requested aspect is invalid.
|
|
7
|
+
*
|
|
8
|
+
* @param bytes - Tight readback bytes (no row padding), length = w*h*bytesPerTexel.
|
|
9
|
+
* @param format - The texture's real format string.
|
|
10
|
+
* @param width - Texture width in pixels.
|
|
11
|
+
* @param height - Texture height in pixels.
|
|
12
|
+
* @param aspect - Explicit plane selected by readback for depth/stencil formats.
|
|
13
|
+
*/
|
|
14
|
+
export declare function decodeToRgba8(bytes: Uint8Array, format: string, width: number, height: number, aspect?: 'all' | 'depth-only' | 'stencil-only'): Uint8ClampedArray<ArrayBuffer> | null;
|
|
15
|
+
/**
|
|
16
|
+
* Decode a single texel from tight raw GPU bytes into raw float RGBA values
|
|
17
|
+
* without the display clamp (D-4: raw byte bypass for HDR fidelity).
|
|
18
|
+
*
|
|
19
|
+
* Unlike `decodeToRgba8` which clamps float/ufloat to [0,1] for display, this
|
|
20
|
+
* returns the decoded per-channel values as-is: float formats keep true values
|
|
21
|
+
* (2.5 stays 2.5, negative stays negative), unorm/snorm stay in their native
|
|
22
|
+
* ranges, uint/sint stay as integers cast to number.
|
|
23
|
+
*
|
|
24
|
+
* Channels: 1ch grayscale (R=G=B, A=1), 2ch (RG, B=0, A=1), 3/4ch (RGBA or
|
|
25
|
+
* BGRA→swizzled). Returns null when the format has no {@link formatInfo} entry.
|
|
26
|
+
*
|
|
27
|
+
* @param bytes - Tight readback bytes, length = width*height*bytesPerTexel.
|
|
28
|
+
* @param format - The texture's real format string.
|
|
29
|
+
* @param width - Texture width in pixels.
|
|
30
|
+
* @param height - Texture height in pixels.
|
|
31
|
+
* @param texelX - 0-based column of the target texel.
|
|
32
|
+
* @param texelY - 0-based row of the target texel.
|
|
33
|
+
*/
|
|
34
|
+
export declare function decodeTexelRaw(bytes: Uint8Array, format: string, width: number, height: number, texelX: number, texelY: number): [number, number, number, number] | null;
|
|
35
|
+
//# sourceMappingURL=texel-decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texel-decode.d.ts","sourceRoot":"","sources":["../src/texel-decode.ts"],"names":[],"mappings":"AAqBA,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAe7C;AA8GD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,KAAK,GAAG,YAAY,GAAG,cAAsB,GACpD,iBAAiB,CAAC,WAAW,CAAC,GAAG,IAAI,CAuCvC;AA+BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CA4BzC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bytes per texel for uncompressed color formats. Block-compressed formats use
|
|
3
|
+
* {@link textureBlockLayout} because their bytes are addressed by blocks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function bytesPerTexel(format: GPUTextureFormat | undefined): number | undefined;
|
|
6
|
+
export interface TextureBlockLayout {
|
|
7
|
+
readonly blockWidth: number;
|
|
8
|
+
readonly blockHeight: number;
|
|
9
|
+
readonly bytesPerBlock: number;
|
|
10
|
+
}
|
|
11
|
+
/** Return the WebGPU texel-block footprint for each supported color format. */
|
|
12
|
+
export declare function textureBlockLayout(format: GPUTextureFormat | undefined): TextureBlockLayout | undefined;
|
|
13
|
+
/** How a channel's bits are interpreted (drives the host-side decode-to-RGBA8). */
|
|
14
|
+
export type ChannelType = 'unorm' | 'snorm' | 'uint' | 'sint' | 'float' | 'ufloat';
|
|
15
|
+
/**
|
|
16
|
+
* Per-channel layout of an uncompressed color format, enough to decode its raw
|
|
17
|
+
* GPU bytes into displayable RGBA8 on the host (no GPU). Sits beside
|
|
18
|
+
* {@link bytesPerTexel} (which stays the SSOT for total texel size); the
|
|
19
|
+
* per-channel byte width is derived as `bytesPerTexel / channels` for plain
|
|
20
|
+
* formats, so no byte count is re-stored here. `packed` formats pack all
|
|
21
|
+
* channels into a single 4-byte word (channels read by bit-field, not by a
|
|
22
|
+
* uniform per-channel width).
|
|
23
|
+
*/
|
|
24
|
+
export interface FormatInfo {
|
|
25
|
+
readonly channels: 1 | 2 | 3 | 4;
|
|
26
|
+
readonly channelType: ChannelType;
|
|
27
|
+
/** Channels stored blue-first in memory (swizzle B<->R when decoding). */
|
|
28
|
+
readonly bgra?: boolean;
|
|
29
|
+
/** Bit-packed layout (channels share one 32-bit word) needing special unpack. */
|
|
30
|
+
readonly packed?: 'rgb10a2unorm' | 'rg11b10ufloat';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Per-channel layout of an uncompressed color format for host-side decode.
|
|
34
|
+
* Returns `undefined` for depth/stencil, block-compressed, or unknown formats
|
|
35
|
+
* (the viewer's preview path treats `undefined` as "not directly previewable").
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatInfo(format: GPUTextureFormat | string | undefined): FormatInfo | undefined;
|
|
38
|
+
/** One mip level of one array layer: its extent + where its tight bytes live in the blob. */
|
|
39
|
+
export interface SubresourceSlice {
|
|
40
|
+
readonly layer: number;
|
|
41
|
+
readonly mip: number;
|
|
42
|
+
readonly width: number;
|
|
43
|
+
readonly height: number;
|
|
44
|
+
readonly byteOffset: number;
|
|
45
|
+
readonly byteLength: number;
|
|
46
|
+
}
|
|
47
|
+
/** Full subresource layout of a texture snapshot blob. */
|
|
48
|
+
export interface TextureLayout {
|
|
49
|
+
readonly blockWidth: number;
|
|
50
|
+
readonly blockHeight: number;
|
|
51
|
+
readonly bytesPerBlock: number;
|
|
52
|
+
readonly layerCount: number;
|
|
53
|
+
readonly mipLevelCount: number;
|
|
54
|
+
readonly slices: readonly SubresourceSlice[];
|
|
55
|
+
/** Total tight byte length across every subresource (the blob size). */
|
|
56
|
+
readonly totalBytes: number;
|
|
57
|
+
}
|
|
58
|
+
export interface TextureExtent {
|
|
59
|
+
readonly width: number;
|
|
60
|
+
readonly height: number;
|
|
61
|
+
readonly layerCount: number;
|
|
62
|
+
}
|
|
63
|
+
/** Project a serialized GPU texture extent onto the dimensions used by snapshots. */
|
|
64
|
+
export declare function projectTextureExtent(size: unknown): TextureExtent;
|
|
65
|
+
/**
|
|
66
|
+
* Compute the canonical tight byte layout for a texture snapshot: every array
|
|
67
|
+
* layer, every mip level, packed in layer-major then mip-minor order with no row
|
|
68
|
+
* padding (tight bytesPerRow = blockCountX * bytesPerBlock). Mip dimensions halve
|
|
69
|
+
* per level (floor, min 1), matching the WebGPU mip size rule.
|
|
70
|
+
*
|
|
71
|
+
* Returns `undefined` when the format has no known block footprint. The
|
|
72
|
+
* recorder reads each slice into this exact offset; the replayer reads each
|
|
73
|
+
* slice back out and writeTexture's it to (layer, mip).
|
|
74
|
+
*/
|
|
75
|
+
export declare function computeTextureLayout(format: GPUTextureFormat | undefined, width: number, height: number, layerCount: number, mipLevelCount: number): TextureLayout | undefined;
|
|
76
|
+
//# sourceMappingURL=texel-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texel-layout.d.ts","sourceRoot":"","sources":["../src/texel-layout.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGtF;AA8CD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AA4DD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,kBAAkB,GAAG,SAAS,CAQhC;AAMD,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnF;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;CACpD;AA8CD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AAED,6FAA6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAqBjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,aAAa,GAAG,SAAS,CA4B3B"}
|