@forgeax/engine-rhi-null 0.1.2
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 +128 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/device-lost-owner.test-d.d.ts +2 -0
- package/dist/__tests__/device-lost-owner.test-d.d.ts.map +1 -0
- package/dist/adapter.d.ts +9 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/bookkeeping.d.ts +86 -0
- package/dist/bookkeeping.d.ts.map +1 -0
- package/dist/canvas-context.d.ts +22 -0
- package/dist/canvas-context.d.ts.map +1 -0
- package/dist/command-encoder.d.ts +27 -0
- package/dist/command-encoder.d.ts.map +1 -0
- package/dist/device.d.ts +66 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +470 -0
- package/dist/index.mjs.map +1 -0
- package/dist/pass-encoders.d.ts +65 -0
- package/dist/pass-encoders.d.ts.map +1 -0
- package/dist/queue.d.ts +10 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/shader.d.ts +14 -0
- package/dist/shader.d.ts.map +1 -0
- package/package.json +58 -0
- package/src/__tests__/device-lost-owner.test-d.ts +48 -0
- package/src/adapter.ts +40 -0
- package/src/bookkeeping.ts +179 -0
- package/src/canvas-context.ts +71 -0
- package/src/command-encoder.ts +145 -0
- package/src/device.ts +259 -0
- package/src/index.ts +63 -0
- package/src/pass-encoders.ts +211 -0
- package/src/queue.ts +62 -0
- package/src/shader.ts +37 -0
package/src/queue.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// @forgeax/engine-rhi-null/src/queue - headless command queue.
|
|
2
|
+
//
|
|
3
|
+
// All write* methods are no-ops returning ok; submit records nothing and
|
|
4
|
+
// returns ok (AC-12). onSubmittedWorkDone resolves immediately so headless
|
|
5
|
+
// read-back idioms never hang (the real GPU resolves after work completes; with
|
|
6
|
+
// no pending work the headless backend resolves synchronously).
|
|
7
|
+
//
|
|
8
|
+
// Related: requirements AC-12 (submit ok + onSubmittedWorkDone resolves);
|
|
9
|
+
// research Finding A1 row 4.
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
Buffer,
|
|
13
|
+
CommandBuffer,
|
|
14
|
+
Result,
|
|
15
|
+
RhiError as RhiErrorType,
|
|
16
|
+
RhiQueue,
|
|
17
|
+
} from '@forgeax/engine-rhi';
|
|
18
|
+
import { ok } from '@forgeax/engine-types';
|
|
19
|
+
|
|
20
|
+
/** Headless no-op queue. */
|
|
21
|
+
export class RhiNullQueue implements RhiQueue {
|
|
22
|
+
writeBuffer(
|
|
23
|
+
_buffer: Buffer,
|
|
24
|
+
_bufferOffset: number,
|
|
25
|
+
_data: ArrayBufferView | ArrayBuffer,
|
|
26
|
+
_dataOffset?: number | undefined,
|
|
27
|
+
_size?: number | undefined,
|
|
28
|
+
): Result<void, RhiErrorType> {
|
|
29
|
+
return ok(undefined);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
writeTexture(
|
|
33
|
+
_destination: Pick<GPUTexelCopyTextureInfo, 'texture' | 'mipLevel' | 'origin' | 'aspect'>,
|
|
34
|
+
_data: ArrayBufferView | ArrayBuffer,
|
|
35
|
+
_dataLayout: Pick<GPUTexelCopyBufferLayout, 'offset' | 'bytesPerRow' | 'rowsPerImage'>,
|
|
36
|
+
_size: GPUExtent3DStrict,
|
|
37
|
+
): Result<void, RhiErrorType> {
|
|
38
|
+
return ok(undefined);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
copyExternalImageToTexture(
|
|
42
|
+
_source: Pick<GPUCopyExternalImageSourceInfo, 'source' | 'origin' | 'flipY'>,
|
|
43
|
+
_destination: Pick<
|
|
44
|
+
GPUCopyExternalImageDestInfo,
|
|
45
|
+
'texture' | 'mipLevel' | 'origin' | 'aspect' | 'colorSpace' | 'premultipliedAlpha'
|
|
46
|
+
>,
|
|
47
|
+
_copySize: GPUExtent3DStrict,
|
|
48
|
+
): Result<void, RhiErrorType> {
|
|
49
|
+
return ok(undefined);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
submit(_commandBuffers: readonly CommandBuffer[]): Result<void, RhiErrorType> {
|
|
53
|
+
return ok(undefined);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// forgeax-async-whitelist: dom-native — spec `GPUQueue.onSubmittedWorkDone`
|
|
57
|
+
// never rejects. The headless backend has no pending GPU work, so it resolves
|
|
58
|
+
// immediately (AC-12: read-back idioms must not hang).
|
|
59
|
+
onSubmittedWorkDone(): Promise<undefined> {
|
|
60
|
+
return Promise.resolve(undefined);
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/shader.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// @forgeax/engine-rhi-null/src/shader - headless shader module factory (R-2).
|
|
2
|
+
//
|
|
3
|
+
// createShaderModule is the highest-risk hidden contract: the createRenderer
|
|
4
|
+
// ready chain resolves a shader module through a three-tier fallback
|
|
5
|
+
// (RhiBackendPack.createShaderModule -> RhiDevice.createShaderModule duck-typed
|
|
6
|
+
// -> err('rhi-not-available')). If RhiNull provides neither, createRenderer ->
|
|
7
|
+
// ready REJECTS rhi-not-available and AC-02 / AC-10 / AC-13 all fail. RhiNull
|
|
8
|
+
// exposes the top-level async factory (symmetric with rhi-webgpu) that skips
|
|
9
|
+
// real WGSL compilation and returns a legal ShaderModule brand.
|
|
10
|
+
//
|
|
11
|
+
// Related: requirements AC-10 (shader brand skips compile) + AC-02
|
|
12
|
+
// (createRenderer ready does not reject); research Finding A5 (three-tier
|
|
13
|
+
// fallback, top-level factory recommended) + A6 (brand construction);
|
|
14
|
+
// plan-strategy §4 R-2.
|
|
15
|
+
|
|
16
|
+
import type {
|
|
17
|
+
Result,
|
|
18
|
+
RhiDevice,
|
|
19
|
+
RhiError as RhiErrorType,
|
|
20
|
+
ShaderModule,
|
|
21
|
+
} from '@forgeax/engine-rhi';
|
|
22
|
+
import { ok } from '@forgeax/engine-types';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build a shader module for the headless backend. No WGSL is compiled — the
|
|
26
|
+
* code is ignored and a legal ShaderModule brand is returned immediately
|
|
27
|
+
* (<1ms), so the ready chain's shader step always resolves ok (AC-10). Mirrors
|
|
28
|
+
* the rhi-webgpu top-level `createShaderModule(device, desc)` signature so
|
|
29
|
+
* Channel 1's RhiBackendPack picks it up via the same `'createShaderModule' in
|
|
30
|
+
* mod` probe.
|
|
31
|
+
*/
|
|
32
|
+
export function createShaderModule(
|
|
33
|
+
_device: RhiDevice,
|
|
34
|
+
_desc: { label?: string | undefined; code: string },
|
|
35
|
+
): Promise<Result<ShaderModule, RhiErrorType>> {
|
|
36
|
+
return Promise.resolve(ok({} as unknown as ShaderModule));
|
|
37
|
+
}
|