@plasius/gpu-lighting 0.1.4 → 0.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"sourcesContent":["const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n"],"mappings":"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","names":["source"]}
1
+ {"version":3,"sources":["../src/index.js"],"sourcesContent":["const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n"],"mappings":"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","names":["source"]}