@carbonenginejs/runtime-resource 0.15.0 → 0.17.0
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/dist/format/CjsFormat.js +84 -83
- package/dist/format/CjsFormat.js.map +1 -1
- package/dist/format/CjsResourceProbe.js +87 -86
- package/dist/format/CjsResourceProbe.js.map +1 -1
- package/dist/format/carbonEffect/backendEngineId.js +100 -0
- package/dist/format/carbonEffect/backendEngineId.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +23 -23
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/index.js +1 -1
- package/dist/formats/png/core/helpers.js +27 -8
- package/dist/formats/png/core/helpers.js.map +1 -1
- package/dist/formats/webgl/core/effectPackage.js +141 -53
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +799 -456
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgl/core/glslBackendBlock.js +70 -27
- package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -1
- package/dist/formats/webgl/core/helpers.js +53 -53
- package/dist/formats/webgl/core/helpers.js.map +1 -1
- package/dist/formats/webgl/core/readGlslEffectContainer.js +82 -67
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js +10 -1
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -1
- package/dist/formats/wem/CjsWemFormat.js +121 -121
- package/dist/formats/wem/CjsWemFormat.js.map +1 -1
- package/dist/formats/wem/core/resolve.js +8 -8
- package/dist/formats/wem/core/resolve.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +2 -2
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +2 -2
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +102 -60
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +2 -2
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js +2 -2
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js.map +1 -1
- package/docs/concepts/format-type-resolution.md +79 -0
- package/docs/formats/README.md +11 -0
- package/docs/formats/wwise.md +25 -0
- package/docs/roadmap.md +19 -0
- package/package.json +61 -61
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CjsResourceProbe.js","sources":["../../../src/format/CjsResourceProbe.js"],"sourcesContent":["import { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\nimport { io, type } from \"@carbonenginejs/runtime-utils/schema\";\n\n/**\n * Standard probe report for resource formats and a reusable base for format-specific probes.\n *\n * Instances can be built by:\n * - returning plain object JSON payloads from format packages, then converted with CjsResourceProbe.from(...)\n * - returning CjsResourceProbe instances directly\n *\n * A format can report multiple usable variants in one payload, such as a\n * native compressed texture and a decoded RGBA fallback, without deciding\n * which engine-gpu or media backend should use.\n */\n@type.define({ className: \"CjsResourceProbe\", family: \"resource\" })\nexport class CjsResourceProbe extends CjsModel\n{\n @io.persist\n @type.string\n format = \"\";\n\n @io.persist\n @type.string\n source = \"\";\n\n @io.persist\n @type.string\n supported = \"none\";\n\n /**\n * True when the report's variant flags are CONTENT-verified (a bounded\n * resolveType() check ran), false when they are declaration-derived\n * (inspect/isSupported). Declared/resolved/mismatch evidence rides in\n * `metadata` per the kb §5 content-verified type resolution contract.\n */\n @io.persist\n @type.boolean\n verified = false;\n\n @io.persist\n @type.float64\n confidence = 0;\n\n @io.persist\n @type.string\n preferred = \"\";\n\n @io.persist\n @type.string\n reason = \"\";\n\n @io.persist\n @type.unknown\n metadata = null;\n\n @io.persist\n @type.unknown\n variant = {};\n\n @io.persist\n @type.list(\"unknown\")\n variants = [];\n\n @io.persist\n @type.list(\"string\")\n warnings = [];\n\n @io.persist\n @type.list(\"string\")\n errors = [];\n\n /** Creates a CjsResourceProbe with caller-provided initial state. */\n constructor(values = null) {\n super();\n this.SetValues(values || {}, {\n markDirty: false,\n skipUpdate: true,\n skipEvents: true\n });\n }\n\n /**\n * Initialize probe fields from a plain object payload.\n *\n * @param {object|null} values\n * @returns {CjsResourceProbe}\n */\n Initialize(values = null) {\n this.SetValues(values || {}, { skipEvents: true });\n return this;\n }\n\n /**\n * Lightweight probe entrypoint.\n * Format packages should override this or provide their own probe implementation.\n *\n * @param {*} src\n * Raw source path or source payload passed by caller.\n * @param {object|null} options\n * Optional metadata/control overrides.\n * @returns {CjsResourceProbe}\n */\n static isSupported(src, options = null) {\n return new CjsResourceProbe({\n format: \"\",\n source: typeof src === \"string\" ? src : \"buffer\",\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: \"No probe provided.\",\n metadata: null,\n variant: {},\n variants: [],\n warnings: [],\n errors: [\"CjsResourceProbe has no built-in format detection.\"],\n ...options\n });\n }\n\n /**\n * Detailed probe with report-style metadata. Aliases isSupported() in this minimal base.\n *\n * @param {*} src\n * @param {object|null} options\n * @returns {CjsResourceProbe}\n */\n static inspect(src, options = null) {\n return CjsResourceProbe.isSupported(src, options);\n }\n\n /**\n * Build a probe report representing explicit failure.\n *\n * @param {string} format\n * @param {string} reason\n * @param {object|null} options\n * @returns {CjsResourceProbe}\n */\n static createUnsupported(format, reason, options = null) {\n return new CjsResourceProbe({\n format,\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: reason || \"Unsupported format.\",\n variant: {},\n variants: [],\n warnings: [],\n errors: [reason],\n ...(options || {})\n });\n }\n\n /**\n * Build a probe report representing one or more variants.\n *\n * @param {string} format\n * @param {Array<Object>} variants\n * @param {object|null} options\n * @returns {CjsResourceProbe}\n */\n static createSupported(format, variants, options = null) {\n const normalizedVariants = Array.isArray(variants) ? variants : [];\n const anySupported = normalizedVariants.some((entry) => entry && entry.supported === true);\n const normalized = normalizedVariants.map((entry) => CjsResourceProbe.normalizeVariant(entry));\n const preferred = options && options.preferred ? options.preferred : CjsResourceProbe.selectPreferred(normalized);\n\n return new CjsResourceProbe({\n format,\n source: options?.source || \"\",\n supported: anySupported ? \"full\" : normalizedVariants.length > 0 ? \"partial\" : \"none\",\n confidence: normalized.length > 0 && anySupported ? 1 : (normalized.length > 0 ? 0.5 : 0),\n preferred,\n reason: options?.reason || (anySupported ? \"Supported variant found.\" : \"No variant supported.\"),\n metadata: options?.metadata || null,\n variant: normalized[0] || {},\n variants: normalized,\n warnings: Array.isArray(options?.warnings) ? options.warnings : [],\n errors: Array.isArray(options?.errors) ? options.errors : [],\n ...(options || {})\n });\n }\n\n /**\n * Normalize incoming report payloads into a standard CjsResourceProbe instance.\n *\n * @param {CjsResourceProbe|object|null} input\n * @returns {CjsResourceProbe}\n */\n static from(input) {\n if (input instanceof CjsResourceProbe) return input;\n if (!input) return CjsResourceProbe.createUnsupported(\"\", \"No probe input.\");\n if (typeof input === \"object\" && typeof input.toJSON === \"function\") {\n return new CjsResourceProbe(CjsResourceProbe.normalizeReport(input.toJSON()));\n }\n if (typeof input === \"object\") return new CjsResourceProbe(CjsResourceProbe.normalizeReport(input));\n return CjsResourceProbe.createUnsupported(\"\", \"Invalid probe payload.\");\n }\n\n /**\n * Normalize a plain probe report while preserving format-specific metadata.\n *\n * @param {object} input\n * @returns {object}\n */\n static normalizeReport(input) {\n const variants = Array.isArray(input.variants)\n ? input.variants.map((entry) => CjsResourceProbe.normalizeVariant(entry))\n : [];\n return {\n ...input,\n variant: input.variant ? CjsResourceProbe.normalizeVariant(input.variant) : variants[0] || {},\n variants\n };\n }\n\n /**\n * Normalize variant objects so runtimes can evaluate capability uniformly.\n *\n * @param {object|any} input\n * @returns {{kind: string, payloadType: string, codec: string, format: string, supported: boolean, reason: string, meta: *}}\n */\n static normalizeVariant(input) {\n if (!input || typeof input !== \"object\") {\n return {\n kind: \"raw\",\n payloadType: \"raw\",\n codec: \"\",\n format: \"\",\n supported: false,\n reason: \"Invalid variant payload.\",\n meta: null\n };\n }\n\n const kind = input.kind || input.payloadType || \"raw\";\n return {\n ...input,\n kind,\n payloadType: input.payloadType || kind,\n codec: input.codec || \"\",\n format: input.format || \"\",\n supported: !!input.supported,\n reason: input.reason || \"\",\n meta: input.meta || null\n };\n }\n\n /**\n * Select best preferred variant from normalized variant list.\n *\n * @param {Array<Object>} variants\n * @returns {string}\n */\n static selectPreferred(variants) {\n if (!Array.isArray(variants) || variants.length < 1) return \"\";\n const priority = [ \"compressed\", \"texture\", \"rgba\", \"pcm\", \"raw\", \"container\", \"video\", \"audio\" ];\n const preferred = priority\n .map((kind) => variants.find((variant) => variant.kind === kind && variant.supported))\n .find(Boolean) || variants.find((variant) => variant.supported);\n return preferred ? preferred.codec || preferred.payloadType || preferred.kind || \"\" : \"\";\n }\n\n /**\n * Returns true if any supported variant is available.\n *\n * @returns {boolean}\n */\n isSupported() {\n return this.supported === \"full\" || this.supported === \"partial\";\n }\n\n /**\n * Returns true if raw fallback variant is supported.\n *\n * @returns {boolean}\n */\n canUseRaw() {\n return this.variants.some((entry) => entry && [ \"raw\", \"rgba\" ].includes(entry.kind) && entry.supported);\n }\n\n /**\n * Returns true if compressed variant is supported.\n *\n * @returns {boolean}\n */\n canUseCompressed() {\n return this.variants.some((entry) => entry && entry.kind === \"compressed\" && entry.supported);\n }\n\n /**\n * Return true when a supported variant of the requested kind exists.\n *\n * @param {string} kind\n * @returns {boolean}\n */\n canUse(kind) {\n return this.variants.some((entry) => entry && entry.kind === kind && entry.supported);\n }\n}\n"],"names":["_CjsResourceProbe","CjsResourceProbe","CjsModel","e","_init_format","_init_extra_format","_init_source","_init_extra_source","_init_supported","_init_extra_supported","_init_verified","_init_extra_verified","_init_confidence","_init_extra_confidence","_init_preferred","_init_extra_preferred","_init_reason","_init_extra_reason","_init_metadata","_init_extra_metadata","_init_variant","_init_extra_variant","_init_variants","_init_extra_variants","_init_warnings","_init_extra_warnings","_init_errors","_init_extra_errors","c","_initClass","_applyDecs","type","define","className","family","io","persist","string","boolean","float64","unknown","list","format","source","supported","verified","confidence","preferred","reason","metadata","variant","variants","warnings","errors","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","Initialize","isSupported","src","options","inspect","createUnsupported","createSupported","normalizedVariants","Array","isArray","anySupported","some","entry","normalized","map","normalizeVariant","selectPreferred","length","from","input","toJSON","normalizeReport","kind","payloadType","codec","meta","priority","find","Boolean","canUseRaw","includes","canUseCompressed","canUse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CjsResourceProbe.js","sources":["../../../src/format/CjsResourceProbe.js"],"sourcesContent":["import { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\r\nimport { io, type } from \"@carbonenginejs/runtime-utils/schema\";\r\n\r\n/**\r\n * Standard probe report for resource formats and a reusable base for format-specific probes.\r\n *\r\n * Instances can be built by:\r\n * - returning plain object JSON payloads from format packages, then converted with CjsResourceProbe.from(...)\r\n * - returning CjsResourceProbe instances directly\r\n *\r\n * A format can report multiple usable variants in one payload, such as a\r\n * native compressed texture and a decoded RGBA fallback, without deciding\r\n * which engine-gpu or media backend should use.\r\n */\r\n@type.define({ className: \"CjsResourceProbe\", family: \"resource\" })\r\nexport class CjsResourceProbe extends CjsModel\r\n{\r\n @io.persist\r\n @type.string\r\n format = \"\";\r\n\r\n @io.persist\r\n @type.string\r\n source = \"\";\r\n\r\n @io.persist\r\n @type.string\r\n supported = \"none\";\r\n\r\n /**\r\n * True when the report's variant flags are CONTENT-verified (a bounded\r\n * resolveType() check ran), false when they are declaration-derived\r\n * (inspect/isSupported). Declared/resolved/mismatch evidence rides in\r\n * `metadata` per the content-verified type resolution contract\r\n// (docs/concepts/format-type-resolution.md).\r\n */\r\n @io.persist\r\n @type.boolean\r\n verified = false;\r\n\r\n @io.persist\r\n @type.float64\r\n confidence = 0;\r\n\r\n @io.persist\r\n @type.string\r\n preferred = \"\";\r\n\r\n @io.persist\r\n @type.string\r\n reason = \"\";\r\n\r\n @io.persist\r\n @type.unknown\r\n metadata = null;\r\n\r\n @io.persist\r\n @type.unknown\r\n variant = {};\r\n\r\n @io.persist\r\n @type.list(\"unknown\")\r\n variants = [];\r\n\r\n @io.persist\r\n @type.list(\"string\")\r\n warnings = [];\r\n\r\n @io.persist\r\n @type.list(\"string\")\r\n errors = [];\r\n\r\n /** Creates a CjsResourceProbe with caller-provided initial state. */\r\n constructor(values = null) {\r\n super();\r\n this.SetValues(values || {}, {\r\n markDirty: false,\r\n skipUpdate: true,\r\n skipEvents: true\r\n });\r\n }\r\n\r\n /**\r\n * Initialize probe fields from a plain object payload.\r\n *\r\n * @param {object|null} values\r\n * @returns {CjsResourceProbe}\r\n */\r\n Initialize(values = null) {\r\n this.SetValues(values || {}, { skipEvents: true });\r\n return this;\r\n }\r\n\r\n /**\r\n * Lightweight probe entrypoint.\r\n * Format packages should override this or provide their own probe implementation.\r\n *\r\n * @param {*} src\r\n * Raw source path or source payload passed by caller.\r\n * @param {object|null} options\r\n * Optional metadata/control overrides.\r\n * @returns {CjsResourceProbe}\r\n */\r\n static isSupported(src, options = null) {\r\n return new CjsResourceProbe({\r\n format: \"\",\r\n source: typeof src === \"string\" ? src : \"buffer\",\r\n supported: \"none\",\r\n confidence: 0,\r\n preferred: \"\",\r\n reason: \"No probe provided.\",\r\n metadata: null,\r\n variant: {},\r\n variants: [],\r\n warnings: [],\r\n errors: [\"CjsResourceProbe has no built-in format detection.\"],\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Detailed probe with report-style metadata. Aliases isSupported() in this minimal base.\r\n *\r\n * @param {*} src\r\n * @param {object|null} options\r\n * @returns {CjsResourceProbe}\r\n */\r\n static inspect(src, options = null) {\r\n return CjsResourceProbe.isSupported(src, options);\r\n }\r\n\r\n /**\r\n * Build a probe report representing explicit failure.\r\n *\r\n * @param {string} format\r\n * @param {string} reason\r\n * @param {object|null} options\r\n * @returns {CjsResourceProbe}\r\n */\r\n static createUnsupported(format, reason, options = null) {\r\n return new CjsResourceProbe({\r\n format,\r\n supported: \"none\",\r\n confidence: 0,\r\n preferred: \"\",\r\n reason: reason || \"Unsupported format.\",\r\n variant: {},\r\n variants: [],\r\n warnings: [],\r\n errors: [reason],\r\n ...(options || {})\r\n });\r\n }\r\n\r\n /**\r\n * Build a probe report representing one or more variants.\r\n *\r\n * @param {string} format\r\n * @param {Array<Object>} variants\r\n * @param {object|null} options\r\n * @returns {CjsResourceProbe}\r\n */\r\n static createSupported(format, variants, options = null) {\r\n const normalizedVariants = Array.isArray(variants) ? variants : [];\r\n const anySupported = normalizedVariants.some((entry) => entry && entry.supported === true);\r\n const normalized = normalizedVariants.map((entry) => CjsResourceProbe.normalizeVariant(entry));\r\n const preferred = options && options.preferred ? options.preferred : CjsResourceProbe.selectPreferred(normalized);\r\n\r\n return new CjsResourceProbe({\r\n format,\r\n source: options?.source || \"\",\r\n supported: anySupported ? \"full\" : normalizedVariants.length > 0 ? \"partial\" : \"none\",\r\n confidence: normalized.length > 0 && anySupported ? 1 : (normalized.length > 0 ? 0.5 : 0),\r\n preferred,\r\n reason: options?.reason || (anySupported ? \"Supported variant found.\" : \"No variant supported.\"),\r\n metadata: options?.metadata || null,\r\n variant: normalized[0] || {},\r\n variants: normalized,\r\n warnings: Array.isArray(options?.warnings) ? options.warnings : [],\r\n errors: Array.isArray(options?.errors) ? options.errors : [],\r\n ...(options || {})\r\n });\r\n }\r\n\r\n /**\r\n * Normalize incoming report payloads into a standard CjsResourceProbe instance.\r\n *\r\n * @param {CjsResourceProbe|object|null} input\r\n * @returns {CjsResourceProbe}\r\n */\r\n static from(input) {\r\n if (input instanceof CjsResourceProbe) return input;\r\n if (!input) return CjsResourceProbe.createUnsupported(\"\", \"No probe input.\");\r\n if (typeof input === \"object\" && typeof input.toJSON === \"function\") {\r\n return new CjsResourceProbe(CjsResourceProbe.normalizeReport(input.toJSON()));\r\n }\r\n if (typeof input === \"object\") return new CjsResourceProbe(CjsResourceProbe.normalizeReport(input));\r\n return CjsResourceProbe.createUnsupported(\"\", \"Invalid probe payload.\");\r\n }\r\n\r\n /**\r\n * Normalize a plain probe report while preserving format-specific metadata.\r\n *\r\n * @param {object} input\r\n * @returns {object}\r\n */\r\n static normalizeReport(input) {\r\n const variants = Array.isArray(input.variants)\r\n ? input.variants.map((entry) => CjsResourceProbe.normalizeVariant(entry))\r\n : [];\r\n return {\r\n ...input,\r\n variant: input.variant ? CjsResourceProbe.normalizeVariant(input.variant) : variants[0] || {},\r\n variants\r\n };\r\n }\r\n\r\n /**\r\n * Normalize variant objects so runtimes can evaluate capability uniformly.\r\n *\r\n * @param {object|any} input\r\n * @returns {{kind: string, payloadType: string, codec: string, format: string, supported: boolean, reason: string, meta: *}}\r\n */\r\n static normalizeVariant(input) {\r\n if (!input || typeof input !== \"object\") {\r\n return {\r\n kind: \"raw\",\r\n payloadType: \"raw\",\r\n codec: \"\",\r\n format: \"\",\r\n supported: false,\r\n reason: \"Invalid variant payload.\",\r\n meta: null\r\n };\r\n }\r\n\r\n const kind = input.kind || input.payloadType || \"raw\";\r\n return {\r\n ...input,\r\n kind,\r\n payloadType: input.payloadType || kind,\r\n codec: input.codec || \"\",\r\n format: input.format || \"\",\r\n supported: !!input.supported,\r\n reason: input.reason || \"\",\r\n meta: input.meta || null\r\n };\r\n }\r\n\r\n /**\r\n * Select best preferred variant from normalized variant list.\r\n *\r\n * @param {Array<Object>} variants\r\n * @returns {string}\r\n */\r\n static selectPreferred(variants) {\r\n if (!Array.isArray(variants) || variants.length < 1) return \"\";\r\n const priority = [ \"compressed\", \"texture\", \"rgba\", \"pcm\", \"raw\", \"container\", \"video\", \"audio\" ];\r\n const preferred = priority\r\n .map((kind) => variants.find((variant) => variant.kind === kind && variant.supported))\r\n .find(Boolean) || variants.find((variant) => variant.supported);\r\n return preferred ? preferred.codec || preferred.payloadType || preferred.kind || \"\" : \"\";\r\n }\r\n\r\n /**\r\n * Returns true if any supported variant is available.\r\n *\r\n * @returns {boolean}\r\n */\r\n isSupported() {\r\n return this.supported === \"full\" || this.supported === \"partial\";\r\n }\r\n\r\n /**\r\n * Returns true if raw fallback variant is supported.\r\n *\r\n * @returns {boolean}\r\n */\r\n canUseRaw() {\r\n return this.variants.some((entry) => entry && [ \"raw\", \"rgba\" ].includes(entry.kind) && entry.supported);\r\n }\r\n\r\n /**\r\n * Returns true if compressed variant is supported.\r\n *\r\n * @returns {boolean}\r\n */\r\n canUseCompressed() {\r\n return this.variants.some((entry) => entry && entry.kind === \"compressed\" && entry.supported);\r\n }\r\n\r\n /**\r\n * Return true when a supported variant of the requested kind exists.\r\n *\r\n * @param {string} kind\r\n * @returns {boolean}\r\n */\r\n canUse(kind) {\r\n return this.variants.some((entry) => entry && entry.kind === kind && entry.supported);\r\n }\r\n}\r\n"],"names":["_CjsResourceProbe","CjsResourceProbe","CjsModel","e","_init_format","_init_extra_format","_init_source","_init_extra_source","_init_supported","_init_extra_supported","_init_verified","_init_extra_verified","_init_confidence","_init_extra_confidence","_init_preferred","_init_extra_preferred","_init_reason","_init_extra_reason","_init_metadata","_init_extra_metadata","_init_variant","_init_extra_variant","_init_variants","_init_extra_variants","_init_warnings","_init_extra_warnings","_init_errors","_init_extra_errors","c","_initClass","_applyDecs","type","define","className","family","io","persist","string","boolean","float64","unknown","list","format","source","supported","verified","confidence","preferred","reason","metadata","variant","variants","warnings","errors","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","Initialize","isSupported","src","options","inspect","createUnsupported","createSupported","normalizedVariants","Array","isArray","anySupported","some","entry","normalized","map","normalizeVariant","selectPreferred","length","from","input","toJSON","normalizeReport","kind","payloadType","codec","meta","priority","find","Boolean","canUseRaw","includes","canUseCompressed","canUse"],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { CjsFormatReadError } from '../CjsFormatError.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Which backend a per-pass block belongs to.
|
|
5
|
+
*
|
|
6
|
+
* The container diverges by backend at exactly one place — the optional
|
|
7
|
+
* per-pass backend block — and until this byte existed a block could not say
|
|
8
|
+
* what it was. Both writers emitted a leading `1` meaning unrelated things, so
|
|
9
|
+
* telling a WebGL2 block from a WebGPU one relied on the caller already knowing,
|
|
10
|
+
* which is not identification.
|
|
11
|
+
*
|
|
12
|
+
* **`0` is deliberately not a backend.** Absent, truncated, or zero-filled data
|
|
13
|
+
* must not read as a valid one; that is the failure mode this byte exists to
|
|
14
|
+
* make impossible.
|
|
15
|
+
*
|
|
16
|
+
* Reserved numbers cost nothing, so they are assigned now rather than argued
|
|
17
|
+
* about later. `webgl1` and `opengl` will most likely never emit a block at
|
|
18
|
+
* all: a backend records one only where its lowering is NOT purely
|
|
19
|
+
* conventional. OpenGL lowered without any such block because the same rule
|
|
20
|
+
* applied to every shader, so the runtime applied it without being told. Ours
|
|
21
|
+
* varies per effect — which resources became data textures, which detail maps
|
|
22
|
+
* merged into which array layer, whether local lights were packed or dropped —
|
|
23
|
+
* and none of that is derivable from the shader.
|
|
24
|
+
*
|
|
25
|
+
* Authority: `/docs/architecture/effect-read-path.md` § *The block identifies
|
|
26
|
+
* itself*.
|
|
27
|
+
*/
|
|
28
|
+
const CARBON_BACKEND_ENGINE_ID = Object.freeze({
|
|
29
|
+
invalid: 0,
|
|
30
|
+
webgl2: 1,
|
|
31
|
+
webgpu: 2,
|
|
32
|
+
webgl1: 3,
|
|
33
|
+
opengl: 4
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/** Wire value to name, for error messages. */
|
|
37
|
+
const TYPE_NAMES = Object.freeze(Object.fromEntries(Object.entries(CARBON_BACKEND_ENGINE_ID).map(([name, value]) => [value, name])));
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Reads a block's engine id without consuming it or validating it.
|
|
41
|
+
*
|
|
42
|
+
* This is how a CONTAINER reader stays tolerant. Loading a container must never
|
|
43
|
+
* depend on being able to use its backend blocks: CCP's own dx11, dx12 and metal
|
|
44
|
+
* containers are Carbon-shaped and carry no block at all, and a dx11 container
|
|
45
|
+
* must load here even though nothing in this library can execute its programs.
|
|
46
|
+
* The same must hold for a block belonging to a sibling backend — a WebGPU block
|
|
47
|
+
* met by the WebGL2 reader means "not for this engine", not "corrupt file".
|
|
48
|
+
*
|
|
49
|
+
* So the container peeks, and only calls the matching parser. The hard failure
|
|
50
|
+
* in `readBackendEngineId` then applies exactly where it should: to a caller
|
|
51
|
+
* that has already committed to parsing this block as a specific backend.
|
|
52
|
+
*
|
|
53
|
+
* @param {Uint8Array} bytes Block bytes.
|
|
54
|
+
* @returns {number} The declared engine id, or `invalid` when unreadable.
|
|
55
|
+
*/
|
|
56
|
+
function peekBackendEngineId(bytes) {
|
|
57
|
+
return bytes && bytes.length ? bytes[0] : CARBON_BACKEND_ENGINE_ID.invalid;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Reads and validates a block's leading type byte.
|
|
62
|
+
*
|
|
63
|
+
* A block that does not identify as the backend the caller is parsing is a hard
|
|
64
|
+
* error, never a skip. The caller has already decided which parser to run from
|
|
65
|
+
* the resource path, so a mismatch means the two disagree about what the file
|
|
66
|
+
* is — and continuing would misparse structurally valid bytes into plausible
|
|
67
|
+
* nonsense.
|
|
68
|
+
*
|
|
69
|
+
* No version byte follows. Carbon's container version is the only version.
|
|
70
|
+
*
|
|
71
|
+
* Consumers split two ways, and neither wants one. ccpwgl builds a container and
|
|
72
|
+
* reads it back in the same process (`Tw2EffectRes` calls `buildEffect` then
|
|
73
|
+
* `read` on the result), so writer and reader are always the same build.
|
|
74
|
+
* engine-webgpu's harness does consume a stored file — `--draw-cewgpu <path>` —
|
|
75
|
+
* but that file is a disposable operator-built input regenerated on demand, not
|
|
76
|
+
* a shipped asset, and a skew there already fails at the CONTAINER magic long
|
|
77
|
+
* before any block is parsed. A per-block version would not have caught it.
|
|
78
|
+
*
|
|
79
|
+
* A block from a different build is caught by the trailing-byte check at the end
|
|
80
|
+
* of each reader, and the remedy is to rebuild the package.
|
|
81
|
+
*
|
|
82
|
+
* @param {object} reader Byte reader positioned at the start of the block.
|
|
83
|
+
* @param {number} expected Expected `CARBON_BACKEND_ENGINE_ID` value.
|
|
84
|
+
* @param {string} source Source name for error details.
|
|
85
|
+
* @returns {number} The type that was read.
|
|
86
|
+
*/
|
|
87
|
+
function readBackendEngineId(reader, expected, source) {
|
|
88
|
+
const type = reader.readUint8();
|
|
89
|
+
if (type !== expected) {
|
|
90
|
+
throw new CjsFormatReadError(`Backend block declares type ${type} (${TYPE_NAMES[type] ?? "unknown"}) ` + `but was parsed as ${TYPE_NAMES[expected]}`, {
|
|
91
|
+
source,
|
|
92
|
+
type,
|
|
93
|
+
expected
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return type;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { CARBON_BACKEND_ENGINE_ID, peekBackendEngineId, readBackendEngineId };
|
|
100
|
+
//# sourceMappingURL=backendEngineId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backendEngineId.js","sources":["../../../../src/format/carbonEffect/backendEngineId.js"],"sourcesContent":["import { CjsFormatReadError } from \"../CjsFormatError.js\";\n\n/**\n * Which backend a per-pass block belongs to.\n *\n * The container diverges by backend at exactly one place — the optional\n * per-pass backend block — and until this byte existed a block could not say\n * what it was. Both writers emitted a leading `1` meaning unrelated things, so\n * telling a WebGL2 block from a WebGPU one relied on the caller already knowing,\n * which is not identification.\n *\n * **`0` is deliberately not a backend.** Absent, truncated, or zero-filled data\n * must not read as a valid one; that is the failure mode this byte exists to\n * make impossible.\n *\n * Reserved numbers cost nothing, so they are assigned now rather than argued\n * about later. `webgl1` and `opengl` will most likely never emit a block at\n * all: a backend records one only where its lowering is NOT purely\n * conventional. OpenGL lowered without any such block because the same rule\n * applied to every shader, so the runtime applied it without being told. Ours\n * varies per effect — which resources became data textures, which detail maps\n * merged into which array layer, whether local lights were packed or dropped —\n * and none of that is derivable from the shader.\n *\n * Authority: `/docs/architecture/effect-read-path.md` § *The block identifies\n * itself*.\n */\nexport const CARBON_BACKEND_ENGINE_ID = Object.freeze({\n invalid: 0,\n webgl2: 1,\n webgpu: 2,\n webgl1: 3,\n opengl: 4\n});\n\n/** Wire value to name, for error messages. */\nconst TYPE_NAMES = Object.freeze(\n Object.fromEntries(Object.entries(CARBON_BACKEND_ENGINE_ID).map(([ name, value ]) => [ value, name ]))\n);\n\n/**\n * Reads a block's engine id without consuming it or validating it.\n *\n * This is how a CONTAINER reader stays tolerant. Loading a container must never\n * depend on being able to use its backend blocks: CCP's own dx11, dx12 and metal\n * containers are Carbon-shaped and carry no block at all, and a dx11 container\n * must load here even though nothing in this library can execute its programs.\n * The same must hold for a block belonging to a sibling backend — a WebGPU block\n * met by the WebGL2 reader means \"not for this engine\", not \"corrupt file\".\n *\n * So the container peeks, and only calls the matching parser. The hard failure\n * in `readBackendEngineId` then applies exactly where it should: to a caller\n * that has already committed to parsing this block as a specific backend.\n *\n * @param {Uint8Array} bytes Block bytes.\n * @returns {number} The declared engine id, or `invalid` when unreadable.\n */\nexport function peekBackendEngineId(bytes)\n{\n return bytes && bytes.length ? bytes[0] : CARBON_BACKEND_ENGINE_ID.invalid;\n}\n\n/**\n * Reads and validates a block's leading type byte.\n *\n * A block that does not identify as the backend the caller is parsing is a hard\n * error, never a skip. The caller has already decided which parser to run from\n * the resource path, so a mismatch means the two disagree about what the file\n * is — and continuing would misparse structurally valid bytes into plausible\n * nonsense.\n *\n * No version byte follows. Carbon's container version is the only version.\n *\n * Consumers split two ways, and neither wants one. ccpwgl builds a container and\n * reads it back in the same process (`Tw2EffectRes` calls `buildEffect` then\n * `read` on the result), so writer and reader are always the same build.\n * engine-webgpu's harness does consume a stored file — `--draw-cewgpu <path>` —\n * but that file is a disposable operator-built input regenerated on demand, not\n * a shipped asset, and a skew there already fails at the CONTAINER magic long\n * before any block is parsed. A per-block version would not have caught it.\n *\n * A block from a different build is caught by the trailing-byte check at the end\n * of each reader, and the remedy is to rebuild the package.\n *\n * @param {object} reader Byte reader positioned at the start of the block.\n * @param {number} expected Expected `CARBON_BACKEND_ENGINE_ID` value.\n * @param {string} source Source name for error details.\n * @returns {number} The type that was read.\n */\nexport function readBackendEngineId(reader, expected, source)\n{\n const type = reader.readUint8();\n\n if (type !== expected)\n {\n throw new CjsFormatReadError(\n `Backend block declares type ${type} (${TYPE_NAMES[type] ?? \"unknown\"}) `\n + `but was parsed as ${TYPE_NAMES[expected]}`,\n { source, type, expected }\n );\n }\n\n return type;\n}\n"],"names":["CARBON_BACKEND_ENGINE_ID","Object","freeze","invalid","webgl2","webgpu","webgl1","opengl","TYPE_NAMES","fromEntries","entries","map","name","value","peekBackendEngineId","bytes","length","readBackendEngineId","reader","expected","source","type","readUint8","CjsFormatReadError"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACaA,wBAAwB,GAAGC,MAAM,CAACC,MAAM,CAAC;AAClDC,EAAAA,OAAO,EAAE,CAAC;AACVC,EAAAA,MAAM,EAAE,CAAC;AACTC,EAAAA,MAAM,EAAE,CAAC;AACTC,EAAAA,MAAM,EAAE,CAAC;AACTC,EAAAA,MAAM,EAAE;AACZ,CAAC;;AAED;AACA,MAAMC,UAAU,GAAGP,MAAM,CAACC,MAAM,CAC5BD,MAAM,CAACQ,WAAW,CAACR,MAAM,CAACS,OAAO,CAACV,wBAAwB,CAAC,CAACW,GAAG,CAAC,CAAC,CAAEC,IAAI,EAAEC,KAAK,CAAE,KAAK,CAAEA,KAAK,EAAED,IAAI,CAAE,CAAC,CACzG,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,mBAAmBA,CAACC,KAAK,EACzC;AACI,EAAA,OAAOA,KAAK,IAAIA,KAAK,CAACC,MAAM,GAAGD,KAAK,CAAC,CAAC,CAAC,GAAGf,wBAAwB,CAACG,OAAO;AAC9E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASc,mBAAmBA,CAACC,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAC5D;AACI,EAAA,MAAMC,IAAI,GAAGH,MAAM,CAACI,SAAS,EAAE;EAE/B,IAAID,IAAI,KAAKF,QAAQ,EACrB;IACI,MAAM,IAAII,kBAAkB,CACxB,CAAA,4BAAA,EAA+BF,IAAI,CAAA,EAAA,EAAKb,UAAU,CAACa,IAAI,CAAC,IAAI,SAAS,CAAA,EAAA,CAAI,GACvE,CAAA,kBAAA,EAAqBb,UAAU,CAACW,QAAQ,CAAC,EAAE,EAC7C;MAAEC,MAAM;MAAEC,IAAI;AAAEF,MAAAA;AAAS,KAC7B,CAAC;AACL,EAAA;AAEA,EAAA,OAAOE,IAAI;AACf;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CjsByteWriter } from '../CjsByteWriter.js';
|
|
2
2
|
import { CjsByteReader } from '../CjsByteReader.js';
|
|
3
3
|
import { CjsFormatReadError, CjsFormatWriteError } from '../CjsFormatError.js';
|
|
4
|
+
import { readBackendEngineId, CARBON_BACKEND_ENGINE_ID } from './backendEngineId.js';
|
|
4
5
|
import { readInlineString, readTransformSection, writeInlineString, writeTransformSection } from './carbonEffectResourceTransform.js';
|
|
5
6
|
export { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS } from './carbonEffectResourceTransform.js';
|
|
6
7
|
|
|
@@ -38,8 +39,20 @@ export { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS } from './ca
|
|
|
38
39
|
* The block itself is what dedupes, and it dedupes 30x.
|
|
39
40
|
*/
|
|
40
41
|
|
|
41
|
-
/**
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The leading byte is the TARGET ENGINE IDENTIFIER, not a version.
|
|
44
|
+
*
|
|
45
|
+
* It was called CARBON_EFFECT_BACKEND_BLOCK_VERSION and emitted 1, while the
|
|
46
|
+
* WebGL2 writer also emitted 1 meaning something unrelated - so the byte could
|
|
47
|
+
* not do the one job it was there for. Renamed to what it is, and given a
|
|
48
|
+
* distinct value per backend, it identifies the block.
|
|
49
|
+
*
|
|
50
|
+
* Carbon container version remains the only version. Nothing stores this block:
|
|
51
|
+
* a consumer builds one and reads it back in the same process, so a block from
|
|
52
|
+
* a different build is caught by the trailing-byte check at the end of the read.
|
|
53
|
+
*
|
|
54
|
+
* Authority: /docs/architecture/effect-read-path.md, the block identifies itself.
|
|
55
|
+
*/
|
|
43
56
|
|
|
44
57
|
/**
|
|
45
58
|
* Resource kinds, ordered so the wire value is stable
|
|
@@ -186,7 +199,7 @@ function writeBackendBlock(block) {
|
|
|
186
199
|
const bindGroups = block.bindGroups ?? [];
|
|
187
200
|
const transforms = block.transforms ?? [];
|
|
188
201
|
const writer = new CjsByteWriter(256);
|
|
189
|
-
writer.u8(
|
|
202
|
+
writer.u8(CARBON_BACKEND_ENGINE_ID.webgpu);
|
|
190
203
|
writer.u8(bindGroups.length);
|
|
191
204
|
for (const group of bindGroups) {
|
|
192
205
|
writer.u8(group.group);
|
|
@@ -230,18 +243,7 @@ function readBackendBlock(bytes, options = {}) {
|
|
|
230
243
|
source: options.source ?? "backend block"
|
|
231
244
|
});
|
|
232
245
|
const layoutKey = options.layoutKey ?? null;
|
|
233
|
-
|
|
234
|
-
if (version > CARBON_EFFECT_BACKEND_BLOCK_VERSION) {
|
|
235
|
-
// Forward compatibility: an unknown block version means a newer writer
|
|
236
|
-
// added fields. Report the pass as having no backend data rather than
|
|
237
|
-
// misparsing it; the enclosing `{size, offset}` pair makes it skippable.
|
|
238
|
-
return {
|
|
239
|
-
version,
|
|
240
|
-
unsupported: true,
|
|
241
|
-
bindGroups: [],
|
|
242
|
-
transforms: []
|
|
243
|
-
};
|
|
244
|
-
}
|
|
246
|
+
readBackendEngineId(reader, CARBON_BACKEND_ENGINE_ID.webgpu, options.source ?? "backend block");
|
|
245
247
|
const bindGroups = [];
|
|
246
248
|
const groupCount = reader.readUint8();
|
|
247
249
|
for (let groupIndex = 0; groupIndex < groupCount; groupIndex += 1) {
|
|
@@ -293,23 +295,21 @@ function readBackendBlock(bytes, options = {}) {
|
|
|
293
295
|
}
|
|
294
296
|
const transforms = readTransformSection(reader, layoutKey);
|
|
295
297
|
|
|
296
|
-
// A sized record
|
|
297
|
-
//
|
|
298
|
-
//
|
|
298
|
+
// A sized record must land exactly on its declared end. Trailing bytes mean
|
|
299
|
+
// the writer knew fields this reader does not, which with no version byte is
|
|
300
|
+
// the ONLY signal that a block came from a different build - so this check is
|
|
301
|
+
// load-bearing rather than defensive.
|
|
299
302
|
// This is the only surviving form of a closed-schema check: under a record
|
|
300
303
|
// layout a field either exists at its offset or the read fails, so there is
|
|
301
304
|
// nothing per-field left to assert, but exhaustiveness is still checkable and
|
|
302
305
|
// is exactly what a silently-discarded tail would violate.
|
|
303
306
|
if (reader.remaining !== 0) {
|
|
304
|
-
throw new CjsFormatReadError(`Backend block has ${reader.remaining} unparsed trailing byte(s)
|
|
307
|
+
throw new CjsFormatReadError(`Backend block has ${reader.remaining} unparsed trailing byte(s); rebuild the effect package`, {
|
|
305
308
|
source: options.source ?? "backend block",
|
|
306
|
-
version,
|
|
307
309
|
trailingBytes: reader.remaining
|
|
308
310
|
});
|
|
309
311
|
}
|
|
310
312
|
return {
|
|
311
|
-
version,
|
|
312
|
-
unsupported: false,
|
|
313
313
|
layoutKey,
|
|
314
314
|
bindGroups,
|
|
315
315
|
transforms,
|
|
@@ -317,5 +317,5 @@ function readBackendBlock(bytes, options = {}) {
|
|
|
317
317
|
};
|
|
318
318
|
}
|
|
319
319
|
|
|
320
|
-
export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_VISIBILITY,
|
|
320
|
+
export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_VISIBILITY, readBackendBlock, writeBackendBlock };
|
|
321
321
|
//# sourceMappingURL=carbonEffectBackendBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carbonEffectBackendBlock.js","sources":["../../../../src/format/carbonEffect/carbonEffectBackendBlock.js"],"sourcesContent":["import { CjsByteWriter } from \"../CjsByteWriter.js\";\nimport { CjsByteReader } from \"../CjsByteReader.js\";\nimport { CjsFormatReadError, CjsFormatWriteError } from \"../CjsFormatError.js\";\nimport {\n CARBON_BACKEND_TRANSFORM_FAMILY,\n DETAIL_MAP_ARRAY_DEFAULTS,\n readInlineString,\n readTransformSection,\n writeInlineString,\n writeTransformSection\n} from \"./carbonEffectResourceTransform.js\";\n\n/**\n * The WebGPU pass block: bind-group layouts plus the shared resource-transform\n * section.\n *\n * Neither is derivable from Carbon reflection. Carbon's `registers[]` is the D3D\n * binding model, while `(group, binding, visibility, generatedSymbol)` comes from\n * the *lowered IR's* bindings. So this is the port's only genuine invention, and\n * it is built entirely from Carbon's own techniques: count-prefixed fixed-width\n * records inside a blob referenced by `{u32 size, u32 offset}`, exactly like\n * program source.\n *\n * Both sections share **one** block rather than occupying two, because the\n * invariant worth keeping is \"the Carbon region is backend-invariant, with\n * exactly one optional trailing block\". They are also mutually required — a\n * transform needs a carrier binding in the same pass's layout and a transformed\n * binding needs a recipe — so one unit is the honest shape.\n *\n * ## Why the block is self-contained\n *\n * The block lives in the arena so that identical layouts dedupe across bodies the\n * way program source does; measured sharing is 30.5:1 at `(body, pass)`\n * granularity, 22 distinct blocks across 672 pairs.\n *\n * That forces one design consequence: **the block cannot contain arena offsets.**\n * An offset is only known after the arena's content sort, and the sort depends on\n * every blob's bytes — including this one. A block referencing the arena would\n * have to be interned before its own contents could be computed. Carbon never\n * meets this because no Carbon arena blob refers to the arena.\n *\n * So strings are inline here, length-prefixed, not interned. The cost is real but\n * small: a repeated `\"t11\"` inside 22 distinct blocks rather than one shared copy.\n * The block itself is what dedupes, and it dedupes 30x.\n */\n\n/** Current block version. Bump when a field is added; readers may skip unknown. */\nexport const CARBON_EFFECT_BACKEND_BLOCK_VERSION = 1;\n\n/**\n * Resource kinds, ordered so the wire value is stable\n * (`buildWgslSet.js:117-122`).\n */\nexport const CARBON_BACKEND_RESOURCE_KIND = Object.freeze([\n \"uniform-buffer\",\n \"sampled-resource\",\n \"sampler\",\n \"storage-resource\"\n]);\n\n/** Shader stages, as a bit position in the visibility mask. */\nexport const CARBON_BACKEND_VISIBILITY = Object.freeze([ \"vertex\", \"fragment\", \"compute\" ]);\n\n// The transform section is shared with the GLSL block; both re-export the\n// family enum and defaults so a consumer of either codec sees them.\nexport { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS };\n\n/** Marks an absent optional `u32`. Carbon's null-reference value. */\nconst ABSENT = 0xffffffff;\n\n/**\n * Encodes a visibility list as a bit mask.\n *\n * @param {string[]} visibility Stage names.\n * @returns {number} Bit mask.\n */\nfunction packVisibility(visibility)\n{\n let mask = 0;\n for (const stage of visibility ?? [])\n {\n const bit = CARBON_BACKEND_VISIBILITY.indexOf(stage);\n if (bit < 0)\n {\n throw new CjsFormatWriteError(`Unknown binding visibility \"${stage}\"`, { stage });\n }\n mask |= 1 << bit;\n }\n return mask;\n}\n\n/**\n * Decodes a visibility bit mask, in the canonical stage order.\n *\n * @param {number} mask Bit mask.\n * @returns {string[]} Stage names.\n */\nfunction unpackVisibility(mask)\n{\n const stages = [];\n for (let bit = 0; bit < CARBON_BACKEND_VISIBILITY.length; bit += 1)\n {\n if (mask & (1 << bit)) stages.push(CARBON_BACKEND_VISIBILITY[bit]);\n }\n return stages;\n}\n\n/**\n * Rebuilds a binding's WebGPU descriptor from what the block does store.\n *\n * The descriptor — `buffer`, `texture` or `sampler` — is not on the wire because\n * it is a pure function of the WGSL type, the resource kind and the structure\n * stride, all three of which are. `lowerBindingLayout.js` derives it from the\n * same three inputs on the way out; this derives it back on the way in.\n *\n * The pairs that could collide do not. `array<u32>` reaches both a structured\n * buffer and a compute typed buffer, and the structure stride separates them:\n * structured always carries one, typed never does.\n *\n * @param {object} binding Decoded binding record.\n * @returns {object} The descriptor fragment, as one `{buffer|texture|sampler}` key.\n */\nfunction deriveBindingDescriptor(binding)\n{\n const stride = binding.structureStride;\n\n if (binding.resourceKind === \"sampler\")\n {\n return { sampler: { type: \"filtering\" } };\n }\n\n if (binding.resourceKind === \"uniform-buffer\")\n {\n const vec4Count = /^array<vec4<f32>, (\\d+)>$/u.exec(binding.type)?.[1];\n if (!vec4Count)\n {\n throw new CjsFormatReadError(\n `Backend block uniform binding has untranslatable type \"${binding.type}\"`,\n { type: binding.type }\n );\n }\n return {\n buffer: {\n type: \"uniform\",\n hasDynamicOffset: false,\n minBindingSize: Number(vec4Count) * 16\n }\n };\n }\n\n if (binding.resourceKind === \"sampled-resource\")\n {\n const texture = TEXTURE_DESCRIPTORS[binding.type];\n if (texture) return { texture: { ...texture } };\n\n return {\n buffer: {\n type: \"read-only-storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n }\n\n return {\n buffer: {\n type: \"storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n}\n\n/** Texture descriptors by WGSL type (`lowerBindingLayout.js:90-95`). */\nconst TEXTURE_DESCRIPTORS = Object.freeze({\n \"texture_2d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d\", multisampled: false }),\n \"texture_cube<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"cube\", multisampled: false }),\n \"texture_3d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"3d\", multisampled: false }),\n \"texture_2d_array<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d-array\", multisampled: false })\n});\n\n/**\n * Serialises one pass's backend block.\n *\n * @param {object} block Block contents.\n * @param {object[]} [block.bindGroups] Bind groups with their bindings.\n * @param {object[]} [block.transforms] Resource transforms.\n * @returns {Uint8Array} Self-contained block bytes.\n */\nexport function writeBackendBlock(block)\n{\n const bindGroups = block.bindGroups ?? [];\n const transforms = block.transforms ?? [];\n const writer = new CjsByteWriter(256);\n\n writer.u8(CARBON_EFFECT_BACKEND_BLOCK_VERSION);\n\n writer.u8(bindGroups.length);\n for (const group of bindGroups)\n {\n writer.u8(group.group);\n writer.u8(group.bindings.length);\n for (const binding of group.bindings)\n {\n const kind = CARBON_BACKEND_RESOURCE_KIND.indexOf(binding.resourceKind);\n if (kind < 0)\n {\n throw new CjsFormatWriteError(`Unknown resource kind \"${binding.resourceKind}\"`, {\n resourceKind: binding.resourceKind\n });\n }\n writer.u8(kind);\n writer.u8(binding.registerSpace);\n writer.u8(binding.binding);\n writer.u8(packVisibility(binding.visibility));\n writer.u32(binding.registerIndex);\n writer.u32(binding.structureStride ?? ABSENT);\n writer.u8(binding.arrayLayerCount ?? 0);\n writeInlineString(writer, binding.type);\n writeInlineString(writer, binding.generatedSymbol);\n // A binding either carries a transform id or it does not; an empty\n // string is not a legal id, so length zero encodes absence.\n writeInlineString(writer, binding.transformId ?? \"\");\n }\n }\n\n writeTransformSection(writer, transforms);\n\n return writer.toBytes();\n}\n\n/**\n * Parses one pass's backend block, restoring every derived field.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Block bytes.\n * @param {object} [options] Read options.\n * @param {string} [options.layoutKey] Enclosing pass key, restored onto records.\n * @param {string} [options.source] Source name for error details.\n * @returns {object} Block contents with derived fields restored.\n */\nexport function readBackendBlock(bytes, options = {})\n{\n const reader = new CjsByteReader(bytes, { source: options.source ?? \"backend block\" });\n const layoutKey = options.layoutKey ?? null;\n\n const version = reader.readUint8();\n if (version > CARBON_EFFECT_BACKEND_BLOCK_VERSION)\n {\n // Forward compatibility: an unknown block version means a newer writer\n // added fields. Report the pass as having no backend data rather than\n // misparsing it; the enclosing `{size, offset}` pair makes it skippable.\n return { version, unsupported: true, bindGroups: [], transforms: [] };\n }\n\n const bindGroups = [];\n const groupCount = reader.readUint8();\n for (let groupIndex = 0; groupIndex < groupCount; groupIndex += 1)\n {\n const group = reader.readUint8();\n const bindings = [];\n const bindingCount = reader.readUint8();\n for (let index = 0; index < bindingCount; index += 1)\n {\n const resourceKind = CARBON_BACKEND_RESOURCE_KIND[reader.readUint8()];\n const registerSpace = reader.readUint8();\n const binding = reader.readUint8();\n const visibility = unpackVisibility(reader.readUint8());\n const registerIndex = reader.readUint32();\n const structureStride = reader.readUint32();\n const arrayLayerCount = reader.readUint8();\n const type = readInlineString(reader);\n const generatedSymbol = readInlineString(reader);\n const transformId = readInlineString(reader);\n\n const identity = `${resourceKind}:${registerSpace}:${registerIndex}`;\n const record = {\n group,\n binding,\n resourceKind,\n registerSpace,\n registerIndex,\n visibility,\n type,\n generatedSymbol,\n identity,\n scopeIdentity: `${identity}@${visibility[0]}`,\n ...(structureStride === ABSENT ? {} : { structureStride }),\n ...(arrayLayerCount === 0 ? {} : { arrayLayerCount }),\n ...(transformId === \"\" ? {} : { transformId })\n };\n bindings.push({ ...record, ...deriveBindingDescriptor(record) });\n }\n bindGroups.push({ group, bindings });\n }\n\n const transforms = readTransformSection(reader, layoutKey);\n\n // A sized record parsed at a known version must land exactly on its declared\n // end. Trailing bytes mean the writer knew fields this reader does not — the\n // same skew an unknown `blobVersion` reports, arriving without a version bump.\n // This is the only surviving form of a closed-schema check: under a record\n // layout a field either exists at its offset or the read fails, so there is\n // nothing per-field left to assert, but exhaustiveness is still checkable and\n // is exactly what a silently-discarded tail would violate.\n if (reader.remaining !== 0)\n {\n throw new CjsFormatReadError(\n `Backend block has ${reader.remaining} unparsed trailing byte(s) at version ${version}`,\n { source: options.source ?? \"backend block\", version, trailingBytes: reader.remaining }\n );\n }\n\n return {\n version,\n unsupported: false,\n layoutKey,\n bindGroups,\n transforms,\n trailingBytes: 0\n };\n}\n"],"names":["CARBON_EFFECT_BACKEND_BLOCK_VERSION","CARBON_BACKEND_RESOURCE_KIND","Object","freeze","CARBON_BACKEND_VISIBILITY","ABSENT","packVisibility","visibility","mask","stage","bit","indexOf","CjsFormatWriteError","unpackVisibility","stages","length","push","deriveBindingDescriptor","binding","stride","structureStride","resourceKind","sampler","type","vec4Count","exec","CjsFormatReadError","buffer","hasDynamicOffset","minBindingSize","Number","texture","TEXTURE_DESCRIPTORS","undefined","sampleType","viewDimension","multisampled","writeBackendBlock","block","bindGroups","transforms","writer","CjsByteWriter","u8","group","bindings","kind","registerSpace","u32","registerIndex","arrayLayerCount","writeInlineString","generatedSymbol","transformId","writeTransformSection","toBytes","readBackendBlock","bytes","options","reader","CjsByteReader","source","layoutKey","version","readUint8","unsupported","groupCount","groupIndex","bindingCount","index","readUint32","readInlineString","identity","record","scopeIdentity","readTransformSection","remaining","trailingBytes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"carbonEffectBackendBlock.js","sources":["../../../../src/format/carbonEffect/carbonEffectBackendBlock.js"],"sourcesContent":["import { CjsByteWriter } from \"../CjsByteWriter.js\";\nimport { CjsByteReader } from \"../CjsByteReader.js\";\nimport { CjsFormatReadError, CjsFormatWriteError } from \"../CjsFormatError.js\";\nimport {\n CARBON_BACKEND_ENGINE_ID,\n readBackendEngineId\n} from \"./backendEngineId.js\";\nimport {\n CARBON_BACKEND_TRANSFORM_FAMILY,\n DETAIL_MAP_ARRAY_DEFAULTS,\n readInlineString,\n readTransformSection,\n writeInlineString,\n writeTransformSection\n} from \"./carbonEffectResourceTransform.js\";\n\n/**\n * The WebGPU pass block: bind-group layouts plus the shared resource-transform\n * section.\n *\n * Neither is derivable from Carbon reflection. Carbon's `registers[]` is the D3D\n * binding model, while `(group, binding, visibility, generatedSymbol)` comes from\n * the *lowered IR's* bindings. So this is the port's only genuine invention, and\n * it is built entirely from Carbon's own techniques: count-prefixed fixed-width\n * records inside a blob referenced by `{u32 size, u32 offset}`, exactly like\n * program source.\n *\n * Both sections share **one** block rather than occupying two, because the\n * invariant worth keeping is \"the Carbon region is backend-invariant, with\n * exactly one optional trailing block\". They are also mutually required — a\n * transform needs a carrier binding in the same pass's layout and a transformed\n * binding needs a recipe — so one unit is the honest shape.\n *\n * ## Why the block is self-contained\n *\n * The block lives in the arena so that identical layouts dedupe across bodies the\n * way program source does; measured sharing is 30.5:1 at `(body, pass)`\n * granularity, 22 distinct blocks across 672 pairs.\n *\n * That forces one design consequence: **the block cannot contain arena offsets.**\n * An offset is only known after the arena's content sort, and the sort depends on\n * every blob's bytes — including this one. A block referencing the arena would\n * have to be interned before its own contents could be computed. Carbon never\n * meets this because no Carbon arena blob refers to the arena.\n *\n * So strings are inline here, length-prefixed, not interned. The cost is real but\n * small: a repeated `\"t11\"` inside 22 distinct blocks rather than one shared copy.\n * The block itself is what dedupes, and it dedupes 30x.\n */\n\n/**\n * The leading byte is the TARGET ENGINE IDENTIFIER, not a version.\n *\n * It was called CARBON_EFFECT_BACKEND_BLOCK_VERSION and emitted 1, while the\n * WebGL2 writer also emitted 1 meaning something unrelated - so the byte could\n * not do the one job it was there for. Renamed to what it is, and given a\n * distinct value per backend, it identifies the block.\n *\n * Carbon container version remains the only version. Nothing stores this block:\n * a consumer builds one and reads it back in the same process, so a block from\n * a different build is caught by the trailing-byte check at the end of the read.\n *\n * Authority: /docs/architecture/effect-read-path.md, the block identifies itself.\n */\n\n/**\n * Resource kinds, ordered so the wire value is stable\n * (`buildWgslSet.js:117-122`).\n */\nexport const CARBON_BACKEND_RESOURCE_KIND = Object.freeze([\n \"uniform-buffer\",\n \"sampled-resource\",\n \"sampler\",\n \"storage-resource\"\n]);\n\n/** Shader stages, as a bit position in the visibility mask. */\nexport const CARBON_BACKEND_VISIBILITY = Object.freeze([ \"vertex\", \"fragment\", \"compute\" ]);\n\n// The transform section is shared with the GLSL block; both re-export the\n// family enum and defaults so a consumer of either codec sees them.\nexport { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS };\n\n/** Marks an absent optional `u32`. Carbon's null-reference value. */\nconst ABSENT = 0xffffffff;\n\n/**\n * Encodes a visibility list as a bit mask.\n *\n * @param {string[]} visibility Stage names.\n * @returns {number} Bit mask.\n */\nfunction packVisibility(visibility)\n{\n let mask = 0;\n for (const stage of visibility ?? [])\n {\n const bit = CARBON_BACKEND_VISIBILITY.indexOf(stage);\n if (bit < 0)\n {\n throw new CjsFormatWriteError(`Unknown binding visibility \"${stage}\"`, { stage });\n }\n mask |= 1 << bit;\n }\n return mask;\n}\n\n/**\n * Decodes a visibility bit mask, in the canonical stage order.\n *\n * @param {number} mask Bit mask.\n * @returns {string[]} Stage names.\n */\nfunction unpackVisibility(mask)\n{\n const stages = [];\n for (let bit = 0; bit < CARBON_BACKEND_VISIBILITY.length; bit += 1)\n {\n if (mask & (1 << bit)) stages.push(CARBON_BACKEND_VISIBILITY[bit]);\n }\n return stages;\n}\n\n/**\n * Rebuilds a binding's WebGPU descriptor from what the block does store.\n *\n * The descriptor — `buffer`, `texture` or `sampler` — is not on the wire because\n * it is a pure function of the WGSL type, the resource kind and the structure\n * stride, all three of which are. `lowerBindingLayout.js` derives it from the\n * same three inputs on the way out; this derives it back on the way in.\n *\n * The pairs that could collide do not. `array<u32>` reaches both a structured\n * buffer and a compute typed buffer, and the structure stride separates them:\n * structured always carries one, typed never does.\n *\n * @param {object} binding Decoded binding record.\n * @returns {object} The descriptor fragment, as one `{buffer|texture|sampler}` key.\n */\nfunction deriveBindingDescriptor(binding)\n{\n const stride = binding.structureStride;\n\n if (binding.resourceKind === \"sampler\")\n {\n return { sampler: { type: \"filtering\" } };\n }\n\n if (binding.resourceKind === \"uniform-buffer\")\n {\n const vec4Count = /^array<vec4<f32>, (\\d+)>$/u.exec(binding.type)?.[1];\n if (!vec4Count)\n {\n throw new CjsFormatReadError(\n `Backend block uniform binding has untranslatable type \"${binding.type}\"`,\n { type: binding.type }\n );\n }\n return {\n buffer: {\n type: \"uniform\",\n hasDynamicOffset: false,\n minBindingSize: Number(vec4Count) * 16\n }\n };\n }\n\n if (binding.resourceKind === \"sampled-resource\")\n {\n const texture = TEXTURE_DESCRIPTORS[binding.type];\n if (texture) return { texture: { ...texture } };\n\n return {\n buffer: {\n type: \"read-only-storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n }\n\n return {\n buffer: {\n type: \"storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n}\n\n/** Texture descriptors by WGSL type (`lowerBindingLayout.js:90-95`). */\nconst TEXTURE_DESCRIPTORS = Object.freeze({\n \"texture_2d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d\", multisampled: false }),\n \"texture_cube<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"cube\", multisampled: false }),\n \"texture_3d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"3d\", multisampled: false }),\n \"texture_2d_array<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d-array\", multisampled: false })\n});\n\n/**\n * Serialises one pass's backend block.\n *\n * @param {object} block Block contents.\n * @param {object[]} [block.bindGroups] Bind groups with their bindings.\n * @param {object[]} [block.transforms] Resource transforms.\n * @returns {Uint8Array} Self-contained block bytes.\n */\nexport function writeBackendBlock(block)\n{\n const bindGroups = block.bindGroups ?? [];\n const transforms = block.transforms ?? [];\n const writer = new CjsByteWriter(256);\n\n writer.u8(CARBON_BACKEND_ENGINE_ID.webgpu);\n\n writer.u8(bindGroups.length);\n for (const group of bindGroups)\n {\n writer.u8(group.group);\n writer.u8(group.bindings.length);\n for (const binding of group.bindings)\n {\n const kind = CARBON_BACKEND_RESOURCE_KIND.indexOf(binding.resourceKind);\n if (kind < 0)\n {\n throw new CjsFormatWriteError(`Unknown resource kind \"${binding.resourceKind}\"`, {\n resourceKind: binding.resourceKind\n });\n }\n writer.u8(kind);\n writer.u8(binding.registerSpace);\n writer.u8(binding.binding);\n writer.u8(packVisibility(binding.visibility));\n writer.u32(binding.registerIndex);\n writer.u32(binding.structureStride ?? ABSENT);\n writer.u8(binding.arrayLayerCount ?? 0);\n writeInlineString(writer, binding.type);\n writeInlineString(writer, binding.generatedSymbol);\n // A binding either carries a transform id or it does not; an empty\n // string is not a legal id, so length zero encodes absence.\n writeInlineString(writer, binding.transformId ?? \"\");\n }\n }\n\n writeTransformSection(writer, transforms);\n\n return writer.toBytes();\n}\n\n/**\n * Parses one pass's backend block, restoring every derived field.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Block bytes.\n * @param {object} [options] Read options.\n * @param {string} [options.layoutKey] Enclosing pass key, restored onto records.\n * @param {string} [options.source] Source name for error details.\n * @returns {object} Block contents with derived fields restored.\n */\nexport function readBackendBlock(bytes, options = {})\n{\n const reader = new CjsByteReader(bytes, { source: options.source ?? \"backend block\" });\n const layoutKey = options.layoutKey ?? null;\n\n readBackendEngineId(reader, CARBON_BACKEND_ENGINE_ID.webgpu, options.source ?? \"backend block\");\n\n const bindGroups = [];\n const groupCount = reader.readUint8();\n for (let groupIndex = 0; groupIndex < groupCount; groupIndex += 1)\n {\n const group = reader.readUint8();\n const bindings = [];\n const bindingCount = reader.readUint8();\n for (let index = 0; index < bindingCount; index += 1)\n {\n const resourceKind = CARBON_BACKEND_RESOURCE_KIND[reader.readUint8()];\n const registerSpace = reader.readUint8();\n const binding = reader.readUint8();\n const visibility = unpackVisibility(reader.readUint8());\n const registerIndex = reader.readUint32();\n const structureStride = reader.readUint32();\n const arrayLayerCount = reader.readUint8();\n const type = readInlineString(reader);\n const generatedSymbol = readInlineString(reader);\n const transformId = readInlineString(reader);\n\n const identity = `${resourceKind}:${registerSpace}:${registerIndex}`;\n const record = {\n group,\n binding,\n resourceKind,\n registerSpace,\n registerIndex,\n visibility,\n type,\n generatedSymbol,\n identity,\n scopeIdentity: `${identity}@${visibility[0]}`,\n ...(structureStride === ABSENT ? {} : { structureStride }),\n ...(arrayLayerCount === 0 ? {} : { arrayLayerCount }),\n ...(transformId === \"\" ? {} : { transformId })\n };\n bindings.push({ ...record, ...deriveBindingDescriptor(record) });\n }\n bindGroups.push({ group, bindings });\n }\n\n const transforms = readTransformSection(reader, layoutKey);\n\n // A sized record must land exactly on its declared end. Trailing bytes mean\n // the writer knew fields this reader does not, which with no version byte is\n // the ONLY signal that a block came from a different build - so this check is\n // load-bearing rather than defensive.\n // This is the only surviving form of a closed-schema check: under a record\n // layout a field either exists at its offset or the read fails, so there is\n // nothing per-field left to assert, but exhaustiveness is still checkable and\n // is exactly what a silently-discarded tail would violate.\n if (reader.remaining !== 0)\n {\n throw new CjsFormatReadError(\n `Backend block has ${reader.remaining} unparsed trailing byte(s); rebuild the effect package`,\n { source: options.source ?? \"backend block\", trailingBytes: reader.remaining }\n );\n }\n\n return {\n layoutKey,\n bindGroups,\n transforms,\n trailingBytes: 0\n };\n}\n"],"names":["CARBON_BACKEND_RESOURCE_KIND","Object","freeze","CARBON_BACKEND_VISIBILITY","ABSENT","packVisibility","visibility","mask","stage","bit","indexOf","CjsFormatWriteError","unpackVisibility","stages","length","push","deriveBindingDescriptor","binding","stride","structureStride","resourceKind","sampler","type","vec4Count","exec","CjsFormatReadError","buffer","hasDynamicOffset","minBindingSize","Number","texture","TEXTURE_DESCRIPTORS","undefined","sampleType","viewDimension","multisampled","writeBackendBlock","block","bindGroups","transforms","writer","CjsByteWriter","u8","CARBON_BACKEND_ENGINE_ID","webgpu","group","bindings","kind","registerSpace","u32","registerIndex","arrayLayerCount","writeInlineString","generatedSymbol","transformId","writeTransformSection","toBytes","readBackendBlock","bytes","options","reader","CjsByteReader","source","layoutKey","readBackendEngineId","groupCount","readUint8","groupIndex","bindingCount","index","readUint32","readInlineString","identity","record","scopeIdentity","readTransformSection","remaining","trailingBytes"],"mappings":"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"}
|
package/dist/format/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { CjsByteReader } from './CjsByteReader.js';
|
|
|
4
4
|
export { CjsByteWriter } from './CjsByteWriter.js';
|
|
5
5
|
export { CJS_STRING_TABLE_NULL_REFERENCE, CjsStringTable, compareTableBlobs } from './CjsStringTable.js';
|
|
6
6
|
export { CARBON_ANNOTATION_TYPE, CARBON_EFFECT_COUNT_CAPS, CARBON_EFFECT_DATA_VERSION, CARBON_EFFECT_MIN_DATA_VERSION, CARBON_SHADER_CONSTANTS_MAX, collectArena, compareAnnotationNames, internArena, passthroughArena, readEffectDescription, writeEffectDescription } from './carbonEffect/carbonEffectRecords.js';
|
|
7
|
-
export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_VISIBILITY,
|
|
7
|
+
export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_VISIBILITY, readBackendBlock, writeBackendBlock } from './carbonEffect/carbonEffectBackendBlock.js';
|
|
8
8
|
export { CARBON_EFFECT_RECORD_BYTES, CARBON_EFFECT_SOURCE_HASH_BYTES, CjsCarbonEffectBodyReader, CjsCarbonEffectReader, looksLikeCarbonEffectContainer } from './carbonEffect/CjsCarbonEffectReader.js';
|
|
9
9
|
export { CjsCarbonEffectWriter, writeCarbonEffectFile } from './carbonEffect/CjsCarbonEffectWriter.js';
|
|
10
10
|
export { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS } from './carbonEffect/carbonEffectResourceTransform.js';
|
|
@@ -387,7 +387,7 @@ function readPngChunks(bytes) {
|
|
|
387
387
|
return chunks;
|
|
388
388
|
}
|
|
389
389
|
function readPngChunkSummary(bytes) {
|
|
390
|
-
let
|
|
390
|
+
let cursor = 8;
|
|
391
391
|
let chunkCount = 0;
|
|
392
392
|
let idatChunkCount = 0;
|
|
393
393
|
let idatBytes = 0;
|
|
@@ -396,10 +396,12 @@ function readPngChunkSummary(bytes) {
|
|
|
396
396
|
let hasSrgb = false;
|
|
397
397
|
let hasIend = false;
|
|
398
398
|
let chunksComplete = true;
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
const
|
|
399
|
+
let pngOffset = null;
|
|
400
|
+
let physicalPixelDimensions = null;
|
|
401
|
+
while (cursor + 12 <= bytes.byteLength) {
|
|
402
|
+
const length = readU32BE(bytes, cursor);
|
|
403
|
+
const type = String.fromCharCode(bytes[cursor + 4], bytes[cursor + 5], bytes[cursor + 6], bytes[cursor + 7]);
|
|
404
|
+
const end = cursor + 8 + length;
|
|
403
405
|
if (end + 4 > bytes.byteLength) {
|
|
404
406
|
chunksComplete = false;
|
|
405
407
|
break;
|
|
@@ -408,8 +410,20 @@ function readPngChunkSummary(bytes) {
|
|
|
408
410
|
if (type === "IDAT") {
|
|
409
411
|
idatChunkCount++;
|
|
410
412
|
idatBytes += length;
|
|
411
|
-
} else if (type === "PLTE") hasPalette = true;else if (type === "tRNS") hasTransparency = true;else if (type === "sRGB") hasSrgb = true;else if (type === "
|
|
412
|
-
|
|
413
|
+
} else if (type === "PLTE") hasPalette = true;else if (type === "tRNS") hasTransparency = true;else if (type === "sRGB") hasSrgb = true;else if (type === "oFFs" && length === 9) {
|
|
414
|
+
pngOffset = {
|
|
415
|
+
x: readI32BE(bytes, cursor + 8),
|
|
416
|
+
y: readI32BE(bytes, cursor + 12),
|
|
417
|
+
unit: bytes[cursor + 16]
|
|
418
|
+
};
|
|
419
|
+
} else if (type === "pHYs" && length === 9) {
|
|
420
|
+
physicalPixelDimensions = {
|
|
421
|
+
x: readU32BE(bytes, cursor + 8),
|
|
422
|
+
y: readU32BE(bytes, cursor + 12),
|
|
423
|
+
unit: bytes[cursor + 16]
|
|
424
|
+
};
|
|
425
|
+
} else if (type === "IEND") hasIend = true;
|
|
426
|
+
cursor = end + 4;
|
|
413
427
|
if (type === "IEND") break;
|
|
414
428
|
}
|
|
415
429
|
return {
|
|
@@ -420,7 +434,9 @@ function readPngChunkSummary(bytes) {
|
|
|
420
434
|
hasTransparency,
|
|
421
435
|
hasSrgb,
|
|
422
436
|
hasIend,
|
|
423
|
-
chunksComplete
|
|
437
|
+
chunksComplete,
|
|
438
|
+
offset: pngOffset,
|
|
439
|
+
physicalPixelDimensions
|
|
424
440
|
};
|
|
425
441
|
}
|
|
426
442
|
function concatBytes(chunks) {
|
|
@@ -624,6 +640,9 @@ function readU16LE(bytes, offset) {
|
|
|
624
640
|
function readU32BE(bytes, offset) {
|
|
625
641
|
return bytes[offset] * 0x1000000 + (bytes[offset + 1] << 16 | bytes[offset + 2] << 8 | bytes[offset + 3]) >>> 0;
|
|
626
642
|
}
|
|
643
|
+
function readI32BE(bytes, offset) {
|
|
644
|
+
return new DataView(bytes.buffer, bytes.byteOffset + offset, 4).getInt32(0, false);
|
|
645
|
+
}
|
|
627
646
|
function readU32LE(bytes, offset) {
|
|
628
647
|
return (bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] * 0x1000000) >>> 0;
|
|
629
648
|
}
|