Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { describe, expect, it } from 'vitest';

import { compareRgba8Coverage, renderFlatMtsdfCpuReference } from './mtsdf-cpu-reference';

describe('RGBA8 coverage comparison', () => {
describe('CPU RGBA8 coverage comparison', () => {
it('uses red for extra candidate coverage and cyan for extra reference coverage', () => {
const comparison = compareRgba8Coverage(
Uint8Array.from([20, 20, 20, 255, 10, 10, 10, 255, 7, 7, 7, 255]),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export interface Rgba8CoverageDifference {
}

/**
* Compares opaque grayscale coverage frames. Red marks candidate-only coverage,
* Pure-CPU comparison of opaque grayscale coverage frames. Red marks candidate-only coverage,
* cyan marks reference-only coverage, and black marks agreement.
*/
export function compareRgba8Coverage(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { describe, expect, it } from 'vitest';

import { renderFlatSlugCpuReference } from './slug-cpu-reference';

describe('flat Slug CPU reference', () => {
describe('conformance flat Slug CPU reference', () => {
it('reconstructs an exact quadratic square at physical pixel centers', () => {
const result = renderFlatSlugCpuReference(squareResource(), specimenLayout(), {
width: 4,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export interface FlatSlugCpuReferenceOptions {
}

/**
* Reconstruct the fixed flat Slug specimen from exact decoded curve, header,
* Reconstruct the fixed flat Slug specimen on the CPU from exact decoded curve, header,
* and reference resources without invoking Three.js, TSL, or browser fonts.
*/
export function renderFlatSlugCpuReference(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest';

import { assertSourceOutlineTransform } from './source-outline-reference';

describe('source-outline transform validation', () => {
describe('conformance source-outline transform validation', () => {
it('accepts a finite invertible affine transform', () => {
expect(() => assertSourceOutlineTransform({ a: 2, b: 0.5, c: -0.25, d: 3, e: 12, f: -8 })).not.toThrow();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import type { ParagraphLayout } from '@pmndrs/text';

import amiriSourceUrl from '../../fixtures/fonts/amiri-1.002/Amiri-Regular.ttf?url';
import dancingScriptSourceUrl from '../../fixtures/fonts/dancing-script-3.000/DancingScript-Regular.otf?url';
import dotGothicSourceUrl from '../../fixtures/fonts/dot-gothic-16/DotGothic16-Regular.ttf?url';
import fontAwesomeSourceUrl from '../../fixtures/fonts/font-awesome-free-6.7.2/fa-solid-900.ttf?url';
import interSourceUrl from '../../fixtures/fonts/inter-v4.1/Inter-Regular.ttf?url';
import notoCjkSourceUrl from '../../fixtures/fonts/noto-sans-cjk-showcase-v0/NotoSansCJKjp-Showcase.otf?url';
import devanagariSourceUrl from '../../fixtures/fonts/noto-sans-devanagari/NotoSansDevanagari.ttf?url';
import sourceSerifSourceUrl from '../../fixtures/fonts/source-serif-4.005/SourceSerif4-Regular.ttf?url';
import type { BenchmarkFontFixture } from '../benchmark/font-fixtures';
import amiriSourceUrl from '../../../../fixtures/fonts/amiri-1.002/Amiri-Regular.ttf?url';
import dancingScriptSourceUrl from '../../../../fixtures/fonts/dancing-script-3.000/DancingScript-Regular.otf?url';
import dotGothicSourceUrl from '../../../../fixtures/fonts/dot-gothic-16/DotGothic16-Regular.ttf?url';
import fontAwesomeSourceUrl from '../../../../fixtures/fonts/font-awesome-free-6.7.2/fa-solid-900.ttf?url';
import interSourceUrl from '../../../../fixtures/fonts/inter-v4.1/Inter-Regular.ttf?url';
import notoCjkSourceUrl from '../../../../fixtures/fonts/noto-sans-cjk-showcase-v0/NotoSansCJKjp-Showcase.otf?url';
import devanagariSourceUrl from '../../../../fixtures/fonts/noto-sans-devanagari/NotoSansDevanagari.ttf?url';
import sourceSerifSourceUrl from '../../../../fixtures/fonts/source-serif-4.005/SourceSerif4-Regular.ttf?url';
import type { BenchmarkFontFixture } from '../../font-fixtures';
import { compareRgba8Coverage } from './mtsdf-cpu-reference';

const sourceFontUrls: Readonly<Record<BenchmarkFontFixture, string>> = {
Expand Down
21 changes: 19 additions & 2 deletions apps/benchmarks/src/benchmark/target-boundary.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { createProductTargets } from './targets/product';
import { registeredTargetIds } from './targets/registry';

const benchmarkDirectory = fileURLToPath(new URL('.', import.meta.url));
const rendererDirectory = fileURLToPath(new URL('../renderer', import.meta.url));
const directWasmDependencyModule = 'targets/shared/direct-wasm.ts';

async function sourceFiles(directory: string): Promise<readonly string[]> {
Expand Down Expand Up @@ -35,10 +36,22 @@ describe('benchmark target boundaries', () => {
expect(offenders.filter((file): file is string => file !== undefined)).toEqual([directWasmDependencyModule]);
});

it('keeps low-level targets downstream from renderer infrastructure', async () => {
const files = await sourceFiles(rendererDirectory);
const offenders = await Promise.all(
files.map(async (file) => {
const source = await readFile(file, 'utf8');
return /benchmark\/targets/.test(source) ? file.slice(rendererDirectory.length + 1) : undefined;
}),
);
expect(offenders.filter((file): file is string => file !== undefined)).toEqual([]);
});

it('resolves targets through the lazy group registry without importing the monolithic implementation facade', async () => {
const registry = await readFile(new URL('./targets/registry.ts', import.meta.url), 'utf8');
const execution = await readFile(new URL('./execution.ts', import.meta.url), 'utf8');
const conformance = await readFile(new URL('./targets/conformance/index.ts', import.meta.url), 'utf8');
const product = await readFile(new URL('./targets/product/index.ts', import.meta.url), 'utf8');
const mtsdfAdapter = await readFile(new URL('./targets/conformance/raster/mtsdf.ts', import.meta.url), 'utf8');
const slugAdapter = await readFile(new URL('./targets/conformance/raster/slug.ts', import.meta.url), 'utf8');

Expand All @@ -47,9 +60,13 @@ describe('benchmark target boundaries', () => {
expect(registry).toContain("import('./conformance')");
expect(execution).toContain('await loadRegisteredTarget(request.targetId)');
expect(conformance).toContain("import('./advanced-shaping')");
expect(conformance).toContain("import('./raster/runtime-fallback')");
expect(conformance).not.toContain('renderer/advanced-shaping-conformance');
expect(conformance).not.toContain("import('../../../renderer/mtsdf-text')");
expect(conformance).not.toContain("import('../../../renderer/slug-text')");
expect(conformance).not.toContain('renderer/runtime-fallback-conformance');
expect(product).toContain("import('./external-raster-proof')");
expect(product).toContain("import('./react-text')");
expect(product).not.toContain('renderer/external-raster-proof');
expect(product).not.toContain('renderer/react-text');
expect(mtsdfAdapter).toContain("import('../../../../renderer/mtsdf-text')");
expect(slugAdapter).toContain("import('../../../../renderer/slug-text')");
const { createAdvancedShapingConformanceTarget } = await import('./targets/conformance/advanced-shaping');
Expand Down
2 changes: 1 addition & 1 deletion apps/benchmarks/src/benchmark/targets/conformance/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ function runtimeFallbackTarget(technique: Technique, backend: Backend): Benchmar
load: async () => undefined,
run: async (input, _sampleIndex, controls, context) => {
const fontFixture = selectableFontFixture(input.fontFixture ?? configuredInput.fontFixture ?? 'inter');
const { captureRuntimeFallbackConformance } = await import('../../../renderer/runtime-fallback-conformance');
const { captureRuntimeFallbackConformance } = await import('./raster/runtime-fallback');
const capture = await captureRuntimeFallbackConformance({
backend,
dpr: controls.dpr,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import * as THREE from 'three/webgpu';
import { beforeEach, describe, expect, it, vi } from 'vitest';

import type { PersistentRenderSceneContext, PersistentRenderSceneRenderer } from './persistent-render-host';
import { createRasterTechniqueComparisonPersistentScene } from './raster-technique-compare';
import type {
PersistentRenderSceneContext,
PersistentRenderSceneRenderer,
} from '../../../../renderer/persistent-render-host';
import { createRasterTechniqueComparisonPersistentScene } from './comparison-scene';

const mocks = vi.hoisted(() => ({
fontDisposals: [] as string[],
Expand Down Expand Up @@ -72,7 +75,7 @@ vi.mock('@pmndrs/text', async () => {
return { Text: MockText };
});

vi.mock('./mtsdf-text', () => ({
vi.mock('../../../../renderer/mtsdf-text', () => ({
loadMtsdfFont: async (signal?: AbortSignal) => {
signal?.throwIfAborted();
return {
Expand All @@ -82,7 +85,7 @@ vi.mock('./mtsdf-text', () => ({
},
}));

vi.mock('./slug-text', () => ({
vi.mock('../../../../renderer/slug-text', () => ({
loadSlugFont: async (signal?: AbortSignal) => {
signal?.throwIfAborted();
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import type { Node } from 'three/webgpu';
import * as THREE from 'three/webgpu';
import { mul, saturate, sub, texture, vec4 } from 'three/tsl';

import { rasterConformanceSpecimen, type SelectableFontFixture } from '../benchmark/font-fixtures';
import { loadMtsdfFont } from './mtsdf-text';
import { rasterConformanceSpecimen, type SelectableFontFixture } from '../../../font-fixtures';
import { loadMtsdfFont } from '../../../../renderer/mtsdf-text';
import {
createPersistentRenderHost,
type PersistentRenderScene,
type PersistentRenderSceneContext,
type PersistentRenderSceneRenderer,
type PersistentRenderViewport,
} from './persistent-render-host';
import { loadSlugFont } from './slug-text';
import type { RendererBackend } from './webgpu-renderer';
} from '../../../../renderer/persistent-render-host';
import { loadSlugFont } from '../../../../renderer/slug-text';
import type { RendererBackend } from '../../../../renderer/webgpu-renderer';

const BACKGROUND = 0x070709;
const BASE_PHYSICAL_PPEM = 64;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { BenchmarkFontFixture } from '../benchmark/font-fixtures';
import type { RasterTechnique } from '../benchmark/url-state';
import { captureBitmapTextConformance } from './bitmap-text';
import { captureMtsdfTextConformance } from './mtsdf-text';
import type { PersistentRenderSceneRenderer } from './persistent-render-host';
import type { RendererBackend } from './webgpu-renderer';
import type { BenchmarkFontFixture } from '../../../font-fixtures';
import type { RasterTechnique } from '../../../url-state';
import { captureBitmapTextConformance } from '../../../../renderer/bitmap-text';
import { captureMtsdfTextConformance } from '../../../../renderer/mtsdf-text';
import type { PersistentRenderSceneRenderer } from '../../../../renderer/persistent-render-host';
import type { RendererBackend } from '../../../../renderer/webgpu-renderer';

export interface RuntimeFallbackCapture {
readonly width: number;
Expand Down Expand Up @@ -78,7 +78,7 @@ async function captureSlug(options: {
readonly renderer?: PersistentRenderSceneRenderer;
readonly signal?: AbortSignal;
}) {
const { captureSlugTextConformance } = await import('./slug-text');
const { captureSlugTextConformance } = await import('../../../../renderer/slug-text');
return captureSlugTextConformance(options);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@ import { FontRegistry, Text } from '@pmndrs/text';
import { glyphExample } from '@pmndrs/text-glyph-example-raster';
import * as THREE from 'three/webgpu';

import type { BenchmarkTarget, TargetRunOutput } from '../benchmark/contracts';
import { compactRgba8Readback } from './tsl-baseline';
import { loadBenchmarkFontAsset } from '../workloads/font-assets';
import type { PersistentRenderSceneRenderer } from './persistent-render-host';
import { withRendererStateRestored } from './renderer-state-transaction';
import { createConfiguredRenderer, disposeConfiguredRenderer, type RendererBackend } from './webgpu-renderer';
import type { BenchmarkTarget, TargetRunOutput } from '../../contracts';
import { compactRgba8Readback } from '../../../renderer/tsl-baseline';
import { loadBenchmarkFontAsset } from '../../../workloads/font-assets';
import type { PersistentRenderSceneRenderer } from '../../../renderer/persistent-render-host';
import { withRendererStateRestored } from '../../../renderer/renderer-state-transaction';
import {
createConfiguredRenderer,
disposeConfiguredRenderer,
type RendererBackend,
} from '../../../renderer/webgpu-renderer';

const WIDTH = 384;
const HEIGHT = 128;
Expand Down
4 changes: 2 additions & 2 deletions apps/benchmarks/src/benchmark/targets/product/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ function externalRasterProofTarget(backend: Backend): BenchmarkTarget {
capabilities: rasterCapabilities,
status: () => 'ready',
},
async () => (await import('../../../renderer/external-raster-proof')).createExternalRasterProofTarget(backend),
async () => (await import('./external-raster-proof')).createExternalRasterProofTarget(backend),
);
}

Expand All @@ -98,7 +98,7 @@ const reactTextTarget = () =>
capabilities: new Set(['deterministic', 'loader', 'shaping', 'paragraph', 'raster']),
status: () => 'ready',
},
async () => (await import('../../../renderer/react-text')).createReactTextTarget(),
async () => (await import('./react-text')).createReactTextTarget(),
);

export function createProductTargets(): readonly BenchmarkTarget[] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import { Text as CoreText, defineFont, type ParagraphLayout } from '@pmndrs/text
import { Text, useFont } from '@pmndrs/text/react';
import { bitmap } from '@pmndrs/text/raster/bitmap';

import canonicalParagraphLayout from '../../fixtures/contracts/paragraph-layout-v0.json';
import bitmapFontUrl from '../../fixtures/rendering/inter-bitmap-16.font.glb?url';
import type { BenchmarkTarget, TargetRunOutput } from '../benchmark/contracts';
import { hashParagraphLayout } from '../benchmark/paragraph-layout-digest';
import { createConfiguredRenderer, disposeConfiguredRenderer } from './webgpu-renderer';
import canonicalParagraphLayout from '../../../../fixtures/contracts/paragraph-layout-v0.json';
import bitmapFontUrl from '../../../../fixtures/rendering/inter-bitmap-16.font.glb?url';
import type { BenchmarkTarget, TargetRunOutput } from '../../contracts';
import { hashParagraphLayout } from '../../paragraph-layout-digest';
import { createConfiguredRenderer, disposeConfiguredRenderer } from '../../../renderer/webgpu-renderer';

const FRAME_WIDTH = 384;
const FRAME_HEIGHT = 128;
Expand Down
5 changes: 4 additions & 1 deletion apps/benchmarks/src/renderer/bitmap-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ import {
liveTextPosition,
type LiveTextAnchor,
} from '../workloads/shared/text-style';
import { captureSourceOutlineFidelity, type SourceOutlineFidelityCapture } from './source-outline-reference';
import {
captureSourceOutlineFidelity,
type SourceOutlineFidelityCapture,
} from '../benchmark/low-level/raster/source-outline-reference';
import {
createConfiguredRenderer,
disposeConfiguredRenderer,
Expand Down
7 changes: 5 additions & 2 deletions apps/benchmarks/src/renderer/mtsdf-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ import {
liveTextPosition,
type LiveTextAnchor,
} from '../workloads/shared/text-style';
import { compareRgba8Coverage, renderFlatMtsdfCpuReference } from './mtsdf-cpu-reference';
import { captureSourceOutlineFidelity, type SourceOutlineFidelityCapture } from './source-outline-reference';
import { compareRgba8Coverage, renderFlatMtsdfCpuReference } from '../benchmark/low-level/raster/mtsdf-cpu-reference';
import {
captureSourceOutlineFidelity,
type SourceOutlineFidelityCapture,
} from '../benchmark/low-level/raster/source-outline-reference';
import { compactRgba8Readback } from './tsl-baseline';
import { createConfiguredRenderer, disposeConfiguredRenderer, type RendererBackend } from './webgpu-renderer';
import {
Expand Down
9 changes: 6 additions & 3 deletions apps/benchmarks/src/renderer/slug-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
type LiveTextAnchor,
} from '../workloads/shared/text-style';
import { createTextUpdateTelemetry, type TextUpdateTimingSummary } from './text-update-telemetry';
import { compareRgba8Coverage } from './mtsdf-cpu-reference';
import { compareRgba8Coverage } from '../benchmark/low-level/raster/mtsdf-cpu-reference';
import {
createPersistentRenderHost,
type PersistentRenderScene,
Expand All @@ -42,13 +42,16 @@ import {
type LiveFontFixtureUpdate,
type RetainedFontFixtureController,
} from './retained-font-fixture';
import { renderFlatSlugCpuReference } from './slug-cpu-reference';
import { renderFlatSlugCpuReference } from '../benchmark/low-level/raster/slug-cpu-reference';
import type {
SlugAffineRoleSceneDefinition,
SlugProjectionZoomSceneDefinition,
SlugRoleSceneDefinition,
} from './slug-role-scenes';
import { captureSourceOutlineFidelity, type SourceOutlineFidelityCapture } from './source-outline-reference';
import {
captureSourceOutlineFidelity,
type SourceOutlineFidelityCapture,
} from '../benchmark/low-level/raster/source-outline-reference';
import { compactRgba8Readback } from './tsl-baseline';
import {
createConfiguredRenderer,
Expand Down
6 changes: 3 additions & 3 deletions apps/benchmarks/src/surfaces/conformance/capture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import type { BitmapTextConformanceCapture } from '../../renderer/bitmap-text';
import type { MtsdfTextConformanceCapture } from '../../renderer/mtsdf-text';
import type { PersistentRenderSceneRenderer } from '../../renderer/persistent-render-host';
import type { SlugTextConformanceCapture } from '../../renderer/slug-text';
import type { SourceOutlineFidelityCapture } from '../../renderer/source-outline-reference';
import type { RuntimeFallbackCapture } from '../../renderer/runtime-fallback-conformance';
import type { SourceOutlineFidelityCapture } from '../../benchmark/low-level/raster/source-outline-reference';
import type { RuntimeFallbackCapture } from '../../benchmark/targets/conformance/raster/runtime-fallback';

export type FiniteConformanceCapture =
| { readonly kind: 'bitmap'; readonly value: BitmapTextConformanceCapture }
Expand Down Expand Up @@ -38,7 +38,7 @@ function loadSlugTextRenderer() {
}

function loadRuntimeFallbackConformance() {
return import('../../renderer/runtime-fallback-conformance');
return import('../../benchmark/targets/conformance/raster/runtime-fallback');
}

/** Captures through the caller-provided persistent host renderer; this module never owns a second renderer. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import type { BitmapTextConformanceCapture } from '../../renderer/bitmap-text';
import type { MtsdfTextConformanceCapture } from '../../renderer/mtsdf-text';
import { usePersistentRenderHost } from '../../renderer/persistent-render-host-context';
import type { SlugTextConformanceCapture } from '../../renderer/slug-text';
import type { RuntimeFallbackCapture } from '../../renderer/runtime-fallback-conformance';
import type { SourceOutlineFidelityCapture } from '../../renderer/source-outline-reference';
import type { RuntimeFallbackCapture } from '../../benchmark/targets/conformance/raster/runtime-fallback';
import type { SourceOutlineFidelityCapture } from '../../benchmark/low-level/raster/source-outline-reference';
import type { ConformanceView } from '../../components/render-controls';
import { Metric } from '../../components/ui';
import { captureFiniteConformance, type FiniteConformanceCapture } from './capture';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { useEffect, useEffectEvent, useRef, useState } from 'react';

import { Metric } from '../../components/ui';
import { usePersistentRenderHost } from '../../renderer/persistent-render-host-context';
import type { RasterTechniqueComparisonPersistentScene } from '../../renderer/raster-technique-compare';
import type { RasterTechniqueComparisonPersistentScene } from '../../benchmark/targets/conformance/raster/comparison-scene';
import type { ConformanceSurfaceProps } from './types';

function loadRasterTechniqueComparison() {
return import('../../renderer/raster-technique-compare');
return import('../../benchmark/targets/conformance/raster/comparison-scene');
}

async function reportInitializationFailure(
Expand Down
Loading