DreamShaderLang
Plugin referenceDiagnostics

DSH9xxx --- Tools, sync and internal invariants

DSH9xxx --- Tools, sync and internal invariants

DSH9xxx --- Tools, sync and internal invariants

The block between the generated markers is written by .skill/gen-diagnostics.ps1. Everything below a marker is written by hand and survives a regeneration.

DSH9001

Severity error

Message

DSH9001: '{0}' uses conditional compilation, and VirtualFunction sync rewrites a source in place at byte offsets taken from the file as written -- it cannot tell which of your branches a definition belongs to, and refuses rather than risk writing one branch over the others. Refresh these definitions by moving them into a source without directives, or edit them by hand.

Raised by Source/DreamShaderEditor/Private/VirtualFunction/DreamShaderVirtualFunctionSyncService.cpp:458

Cause. the VirtualFunction startup sync found a source that uses conditional compilation and refused to touch it. The sync rewrites declarations in place at byte offsets recorded from the file as written; the preprocessor keeps line counts but not byte counts (a cut line becomes a shorter empty line), so every offset past the first cut is wrong, and a preprocessed string reaching the file writer would flatten every dead branch permanently. Unlike Adopt nobody asks for this -- it runs unattended at bridge startup across every writable source -- which is why it is a refusal rather than a prompt

Fix. keep VirtualFunction definitions in a source without directives, or refresh them by hand: Copy VirtualFunction Definition on the material function gives the current declaration to paste. The refusal is per file and does not stop the sync of the others

See VirtualFunction tools, Preprocessor

DSH9011

Severity warning

Message

Compiling shaders for '%s' took %.0f seconds. A stall of this length is almost always a Custom node whose loop bound is an input (a 'for' or 'while' whose limit is not a literal or a #define) combined with implicit-mip texture sampling -- Texture2DSample / Texture3DSample / .Sample inside divergent flow -- which forces the compiler to fully unroll an iteration count it cannot know. To confirm it is still working rather than hung, check whether ShaderCompileWorker.exe is busy in Task Manager. To fix it, bound the loop with a literal or a #define, or switch the samples to SampleLevel.

Raised by Source/DreamShaderCompiler/Private/DreamShaderCompilerService.cpp:262

Cause. the shader-compilation half of one asset's generation -- UpdateStaticPermutation, PostEditChange, the material recompile and the save -- ran for more than thirty seconds. Thirty seconds is not a performance budget; plenty of legitimate materials pass it on a cold shader cache. It is the point past which a still progress bar stops reading as "working" and starts reading as "hung", and this warning exists so that the difference is stated rather than guessed at

Fix. first decide whether anything is wrong. If ShaderCompileWorker.exe is busy in Task Manager the compile is running and the only question is how long it will take; a cold DDC, a Substrate material or a large permutation count can all legitimately cost minutes. If it is idle and nothing progresses, that is a different problem. When the wait is real and you want it shorter, the shape to look for is the one DSH9012 names: a Custom node whose loop bound is an input pin next to an implicit-mip texture sample. Bound the loop with a literal or a #defined constant, or call SampleLevel / SampleGrad, which take the mip level as an argument and do not force the unroll. Advisory; emitted once per asset; never fails a build

See Generation

DSH9012

Severity warning

Message

'%s' loops on the input '%s' and samples with '%s', which takes its mip level from screen-space derivatives. The shader compiler cannot know how many iterations to expect, so it fully unrolls the loop to keep the derivatives defined, and compilation can take minutes. Bound the loop with a literal or a #define, or call SampleLevel / SampleGrad instead.

Raised by Source/DreamShaderCompiler/Private/DreamShaderCompilerService.cpp:290

Cause. the HLSL going onto a Custom node contains two things that are harmless alone and expensive together: a for or while whose bound is one of the node's input pins (an identifier the shader compiler cannot resolve to a constant, unlike a literal or a #defined name), and a sampling call whose mip level is implicit -- Texture2DSample, Texture3DSample, the other Texture*Sample helpers or a member .Sample(). Implicit-mip sampling derives the level from screen-space derivatives, which are undefined inside divergent control flow, so the compiler keeps them defined by fully unrolling the surrounding loop -- with no iteration count to unroll to. That is what turns a ray-march body into a multi-minute compile

Fix. break the pair. Either make the bound static -- a literal or a #defined constant, with the input used to break out early rather than to bound the loop -- or make the sampling explicit with SampleLevel, SampleGrad or SampleBias, which take the level (or the gradients) as an argument. In a ray march the second is almost always what you want anyway: the derivatives inside the loop are meaningless, and SampleLevel(..., 0) says so. The check is a heuristic: the sampling call is looked for anywhere in the body, not only inside the loop, and pin names match case-insensitively. It is a warning and never fails a build; if you have measured your shader and it compiles fine, ignore it

See Generation

DSH9020

Severity error

Message

Could not back up '%s' to '%s'; its asset references were left pointing at the old path.

Raised by Source/DreamShaderEditor/Private/SourceFiles/DreamShaderAssetRenameSyncService.cpp:1147

Cause. an asset a source file references was renamed or moved, so the file had to be rewritten -- but the copy to <file>.bak failed, so there was nothing to fall back to. Usually the source (or the .bak next to it) is read-only, checked out by version control, held open by another process, or on a full or disconnected drive

Fix. nothing was written: the source still names the old path, and it will fail to load the asset at its next compile. Clear whatever blocked the copy -- check the file out, drop the read-only flag, close whatever holds <file>.bak -- and rename the asset back and forth, or edit the path by hand. Turning Sync Source References On Asset Rename off in Project Settings stops the plugin attempting this at all

See Asset rename sync

DSH9021

Severity error

Message

Could not write '%s' after renaming an asset it references; the file as it was is in '%s'.

Raised by Source/DreamShaderEditor/Private/SourceFiles/DreamShaderAssetRenameSyncService.cpp:1163

Cause. the backup was taken and then the rewritten source could not be saved over the original. The window between the two is small, so this is nearly always the file becoming unwritable in between -- a version-control lock, or an editor holding it open exclusively

Fix. the file as it was is in <file>.bak; the on-disk source is untouched, since the failing step is the write itself. Restore or ignore the .bak, make the file writable, and edit the path by hand or rename the asset back and forth to trigger the sync again

See Asset rename sync

DSH9022

Severity error

Message

The IR dump could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:570

Cause. dump-ir could not create its output directory or write the dump file. The message says which. The default directory is <Project>/Saved/DreamShader/IR; -Out= overrides it.

Fix. Check that the directory is writable and that nothing holds the file open. A dump path is <out>/<root>/<path relative to that root>.ir.txt, so a root whose display name contains a path separator would produce an unexpected directory — that is worth checking if the path in the message looks wrong.

DSH9023

Severity error

Message

The symbol index could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:816

Cause. index could not create its output directory or write the index file. The default directory is <Project>/Saved/DreamShader/Index.

Fix. As DSH9022.

DSH9024

Severity error

Message

The builtin catalog manifest could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1353

Cause. export-catalog could not create its directory or write the manifest. The default path is <Project>/Saved/DreamShader/Bridge/dreamshader-builtin-catalog.json, beside the other bridge manifests.

Fix. As DSH9022. If the bridge is running, the directory certainly exists, so this points at a lock or at a read-only Saved/.

DSH9025

Severity error

Message

The builtin catalog came back empty, so '{0}' describes no expression at all. Reflection found no UMaterialExpression classes, which normally means the Engine module is not loaded.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1367

Cause. The manifest was written and describes no expression at all. A language service that binds against an empty catalog reports every UE.* name in the project as unknown, which reads as a language bug rather than as a missing export — so this is an error even though the file exists.

The cause is the same as DSH8297's: reflection found no UMaterialExpression subclass.

Fix. See DSH8297.

DSH9026

Severity error

Message

'{0}' is not a shader platform this engine knows. Write SM6, SM5, ES3_1, or a shader format name such as PCD3D_SM6.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:438

Cause. -Platform= named something this engine has no shader platform for. The accepted spellings are the short profiles (SM6, SM5, ES3_1), which map to PCD3D_SM6, PCD3D_SM5 and PCD3D_ES3_1, and any shader FORMAT name the engine knows (PCD3D_SM6, SF_VULKAN_SM6, SF_METAL_SM5). Note that a format name is not the same string as the EShaderPlatform enumerator name: PCD3D_SM6, not SP_PCD3D_SM6.

Fix. Use one of the short profiles, or the exact shader-format name. Several are comma separated: -Platform=SM6,SM5.

DSH9027

Severity error

Message

'{0}' is not a material quality level. Write Low, Medium, High or Epic.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:455

Cause. -Quality= named something that is not a material quality level. There are four: Low, Medium, High, Epic.

Fix. Use one of the four. Several are comma separated. Omitting the switch checks the project's current scalability level, which is what an editor shows.

DSH9028

Severity error

Message

Shader compilation for '{0}' did not finish within {1} seconds per material. A compile that never finishes is usually a dynamic loop or a texture read whose mip cannot be resolved in a divergent branch; move it into a '@custom' body with an explicit SampleLevel.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:791

Cause. Shader compilation did not finish within the timeout — 120 seconds per material by default, -Timeout= to change it. The run stops waiting and reports; it does not wait it out, because a compile that never finishes is exactly the failure this gate exists to catch.

The two shapes that cause it are both real and both named in the message: a loop whose trip count the compiler cannot bound, and a texture read whose mip level cannot be resolved because the read is inside a divergent branch. Both make the shader compiler do unbounded work rather than fail.

Fix. Find the loop or the texture read. A loop belongs in a @custom body if its trip count is not constant (the front end refuses it in the graph with DSH4360, so this one is nearly always an HLSL loop already). A texture read in a branch needs an explicit level — Tex.SampleLevel(UV, 0) rather than Tex.Sample(UV).

DSH9029

Severity error

Message

[{0} / {1}] {2}

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:692

Cause. The shader compiler rejected the generated HLSL. The message is the compiler's own text, prefixed with the shader platform and quality level it came from, and the diagnostic is located as precisely as the material allows:

  1. through the asset's DreamShader.SourceSpans table, when the error names an expression — exact file, line, column and length;
  2. through the // Begin/End DreamShader source: markers inside a @custom node's code, by counting lines within the block, when the error names a line of generated HLSL;
  3. at line 1 of the source file, with the compiler's raw text in detail, when neither worked.

A location of line 1 therefore means "this error belongs to this file but could not be pinned", never "the mistake is on line 1".

Fix. Read the compiler's own message. The overwhelmingly common cause in a DreamShader source is a symbol used in a @custom body that the graph does not define — a UE.* call inside a @custom body is not lifted to an input pin, so writing one there produces an undeclared identifier here rather than a node.

DSH9030

Severity error

Message

DreamShader failed to create graph dump directory '%s'.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1888

Cause. dump-graph could not create the folder the dump belongs in. The dump tree mirrors the source tree -- <Out>/<root>/<source path>.<asset>.graph.json -- so one folder is created per source subdirectory, and this is that MakeDirectory failing: a -Out under a drive that does not exist, a folder the process cannot write to, or a file sitting where the dump needs a directory

Fix. check the -Out path exists and is writable, and that no file already occupies one of the directory names the dump needs. With no -Out the destination is <Project>/Saved/DreamShader/GraphBaseline, which fails only if Saved/ itself is read-only

See Commandlet

DSH9031

Severity error

Message

DreamShader failed to write graph dump '%s'.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1899

Cause. the folder was there but the JSON could not be written into it. Almost always the file is open in another program, or read-only because a previous capture was committed to version control and checked out read-only

Fix. close whatever holds the file, or clear the read-only flag, and re-run. Capturing into a fresh empty directory sidesteps both -- a baseline is written whole, so there is nothing to preserve in an old one

See Commandlet

DSH9032

Severity error

Message

DreamShader could not work out which assets '%s' builds, so there is no graph to dump.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1792, Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1801, Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1840

Cause. the file was read and preprocessed, but it does not resolve to an asset to dump: either the parse failed, or the source declares no Shader, ShaderFunction, ShaderLayer or ShaderLayerBlend block at all. A .dsh header never reaches this point, but a .dsm that only declares Function or VirtualFunction bodies does -- those generate a .ush include or nothing, not a graph, so there is nothing for a fingerprint to describe

Fix. if the message carries a parse error, fix the source; compile on the same file reports the same failure with its own code. If the file is a helper that legitimately produces no asset, it has nothing to dump and can be left out of the capture -- -All visits it and reports it, which is why a -All run over a tree of helper sources exits 1 without anything being wrong with the tree

See Commandlet

DSH9033

Severity error

Message

DreamShader could not resolve generated asset '%s' from '%s' after generation.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1864

Cause. generation reported success, but the asset it should have produced could not be loaded back from the object path the source names. The usual cause is that the asset already exists on disk, dump-graph's write guard refused to rebuild it, and it failed to load -- a broken or missing package behind a path the source still claims

Fix. run compile -Force on the source and see what the compiler says about the same path; a package that cannot be loaded fails there too, with a message about the package rather than about the dump. If the asset was deleted by hand, compiling it once recreates it

See Commandlet

DSH9034

Severity error

Message

DreamShader cannot dump '%s': %s is not a Material, MaterialFunction, material instance or pass pipeline.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderGraphDump.cpp:1876

Cause. the object at the source's asset path is not a class the dump covers -- not a UMaterial, not a UMaterialFunction (or layer / layer blend), and not a UDreamShaderMaterialInstance. Something else is squatting on the path the source resolves to; generation itself refuses to overwrite a foreign asset (DSH8102 / DSH8103 and friends)

Fix. look at the asset the message names and either move it aside or change the source's Name= / Root= so the two stop colliding. The dump is reporting the same clash generation would; it just gets there by a different route because it did not have to write

See Commandlet

DSH9035

Severity error

Message

'{0}' is not a compilable DreamShader source (.dss, .dsi, .dsp, .dsm or .dsf), so '{1}' has nothing to do with it; a .dsh header is checked through a source that includes it.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:215

Cause. check, dump-ir or index was given a file that is not a .dss. These three verbs drive the 2.0 pipeline; .dsm and .dsf belong to compile, which routes them to the 1.x generator.

Note that -All never produces this: it enumerates .dss files only. It is always an explicit -Source= or a positional path.

Fix. Point the verb at a .dss, or use compile for 1.x sources.

DSH9036

Severity error

Message

The diagnostics JSON could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderCommandletRunner.cpp:800, Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:484

Cause. -DiagnosticsOut= was given and the JSON could not be written. With one source the path is used as given; with -All it becomes a directory and one file is written per source, so that each does not overwrite the last.

Fix. Check that the path is writable. With -All, pass a directory rather than a file name.

DSH9037

Severity info

Message

'{0}' produced no material, so there are no shaders to compile; a function library is checked by the material that calls it.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:571

Cause. Informational. check -Shaders was run on a source that produces no material — a file of exported functions only. There is nothing to compile shaders for: a material function has no shader of its own, it is compiled as part of every material that calls it.

Fix. Nothing. To cover a function library, check a material that calls it.

DSH9038

Severity warning

Message

Shader errors cannot be read in this configuration: '-nullrhi' switches the rendering shader maps off, and no cook target platform matched the requested platforms. Re-run without '-nullrhi', or pass a '-Platform=' an active target platform supports.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderShaderCheck.cpp:800

Cause. check -Shaders ran in a configuration where no compile error can be read. -nullrhi turns FApp::CanEverRender() off, which is what UMaterial::CacheResourceShadersForRendering is gated on, so the rendering shader maps — the only ones whose FMaterialResource a plugin has a public accessor for — are never built; and no cook target platform matched the requested platforms, so the other half had nothing to drive either.

The run still reports a timeout, and still reports anything the engine logged, so it is not useless — but it cannot promise that a silent run means a clean one.

Fix. Re-run without -nullrhi (.skill/dsc.ps1 drops it for check -Shaders automatically; pass -NullRhi to force it back on), or pass a -Platform= that one of the project's active target platforms supports.

DSH9039

Severity error

Message

%s: DSH9039: the DreamShader 2.0 pipeline failed without raising a diagnostic.

Raised by Source/DreamShaderCompiler/Private/Pipeline/DreamShaderCompilePipeline.cpp:1398

Cause. Internal invariant. The 2.0 pipeline returned failure without putting a single error in its diagnostic sink, so there is nothing to report about the source. Every stage of the pipeline raises before it refuses, so reaching this means a stage returned false on a path that does not.

Fix. Not a source problem — report it. The message names the file, which is enough to reproduce. Running dsc dump-ir on the same file usually shows how far the run got, since that verb keeps whatever the pipeline produced even when it failed.

DSH9040

Severity error

Message

The layout dump could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:719

Cause. dsc dump-layout could not write one of its files -- the SVG, or the JSON beside it under -Json. The message carries the file system's reason.

Fix. Point -Out at a directory that can be written, and close whatever holds the file open.

DSH9041

Severity error

Message

'{0}' is not a layout style; -Style takes Blocks, SourceBands, Layered or All.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:642

Cause. dsc dump-layout -Style was given something other than Blocks, SourceBands, Layered or All. Classic, the 1.x layout, is not among them: it works on the finished graph and cannot be drawn from the IR.

Fix. Leave -Style out for one picture of each, or name one of the three.

DSH9042

Severity info

Message

'{0}' has 1.x declarations, and what the printer writes for those is 2.0 text; rewriting 1.x as 2.0 is 'dsc migrate', so 'fmt' leaves the file as it is.

Raised by Source/DreamShaderLang/Private/Lang/LangFormat.cpp:108

Cause. dsc fmt met a header that still has 1.x declarations. The printer writes 2.0 text, so formatting such a file would migrate it by the back door -- without the checks dsc migrate runs. Information, not an error: the file is left as it is and the run goes on.

Fix. Nothing. Run dsc migrate when the header is to become 2.0; fmt formats it from then on.

DSH9043

Severity info

Message

'{0}' uses the preprocessor outside a custom body; 'fmt' reads the file as it is on disk and would have to drop one side of every '#if', so it leaves the file as it is.

Raised by Source/DreamShaderLang/Private/Lang/LangFormat.cpp:94

Cause. dsc fmt met a file that uses #if, #ifdef or their kin outside a /// @custom body. The formatter reads the file as it is on disk, without preprocessing, and the parser keeps only the text between directives -- it would have to drop one side of every conditional. Information, not an error: the file is left as it is.

Fix. Nothing. Format such a file by hand, or move the conditional part into a header of its own.

DSH9044

Severity error

Message

The formatted text of '{0}' failed its own check -- {1} -- so nothing was written. This is a fault of the formatter, not of the file.

Raised by Source/DreamShaderLang/Private/Lang/LangFormat.cpp:130

Cause. The text dsc fmt produced failed the formatter's own check: it has to parse, parse to the same declarations as the original, keep every // and /* */ comment, and come out unchanged when formatted again. Nothing was written. This is a fault of the formatter, never of the file.

Fix. Report it with the file. The message names which of the four checks failed.

DSH9045

Severity error

Message

'{0}' could not be read, so it was not formatted.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:926, Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:970

Cause. dsc fmt could not read a source, or could not write the formatted text back. A file that is read-only -- checked in to Perforce and not checked out -- is the usual reason for the second.

Fix. Check the file out, or make it writable, and run fmt again. fmt -Check reads only.

DSH9046

Severity error

Message

'{0}' is not in the formatter's layout; 'dsc fmt' would rewrite it.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:960

Cause. dsc fmt -Check found a file that fmt would rewrite. -Check writes nothing and fails the run, which is the form for CI.

Fix. Run dsc fmt on the file (or -All) and commit the result.

DSH9047

Severity error

Message

The list of generated assets could not be written: {0}.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1313

Cause. dsc list-generated -Out could not write the list. The message carries the file system's reason.

Fix. Point -Out at a file that can be written; a relative path is taken against the directory dsc.ps1 was called from.

DSH9048

Severity error

Message

'-As={0}' is no list format; the four are Packages, Files, GitIgnore and Json.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1103

Cause. dsc list-generated -As (-ListAs in dsc.ps1) was given something other than the four formats.

Fix. Packages for package names, Files for project-relative files, GitIgnore for a ready ignore block, Json for everything.

DSH9049

Severity warning

Message

{0} generated asset(s) lie outside the project directory -- an engine plugin's content -- and have no project-relative path; '-As=Packages' or '-As=Json' lists them.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1301

Cause. Some generated assets lie outside the project directory -- the content of a plugin installed in the engine -- so they have no project-relative path and were left out of a Files or GitIgnore list. A warning: the rest of the list is complete.

Fix. Use -As=Packages or -As=Json to see them. Ignore rules for an engine plugin's content belong in that plugin's repository.

DSH9050

Severity error

Message

reveal-node needs a non-empty 'file' and a 'line' of 1 or more; got file '{File}' and line {Line}.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:885

Cause. A reveal-node request reached the bridge without the two fields it is made of: file must be a non-empty source path and line must be 1 or more. A request that omits line entirely reads as line 0 and lands here too, which is deliberate — "somewhere in this file" is not a node.

Fix. Send both fields. file may be absolute or project-relative; it is normalized the same way the compiler normalizes a source path, so either spelling matches the same file. line is 1-based, like every line number in the DreamShader wire, so an editor that counts lines from 0 must add one before sending.

DSH9051

Severity error

Message

No asset loaded in this editor was generated from '{File}', so there is no graph to reveal a node in; compile the file first, or open one of its assets once so the editor knows about it.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:908

Cause. Nothing currently loaded in the editor carries DreamShader.SourceFile metadata naming that source. Either the file has never been compiled in this session, or it compiled to assets that are on disk but have not been loaded — a package the asset registry knows about is still not a live UObject, and the source-file stamp lives in package metadata, which cannot be queried without loading the package.

Fix. Compile the file first (recompile with scope: "file", Recompile DSM, or a save with auto-compile on), or open one of its assets once so the package is loaded. If the file genuinely produces no asset — a .dsh header, or a .dss whose products all live in another file — then there is nothing to reveal and the request is aimed at the wrong file.

DSH9052

Severity error

Message

The {Count} asset(s) generated from '{File}' carry no DreamShader.SourceSpans metadata, so no node on them can be located; they predate node navigation -- rebuild them with -Force.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:944

Cause. Assets generated from that source were found, but none of them carries a DreamShader.SourceSpans table. The table is written by the 2.0 emitter only: an asset built by the 1.x generator, or by a 2.0 build from before node navigation landed, has the source-file stamp but no per-node spans.

Fix. Rebuild the source with -Force (the source hash says the asset is current, so an ordinary rebuild skips it and the table is never written). A .dsm / .dsf source is built by the same emitter and gets the table too; only an asset the 1.x generator left behind answers this.

DSH9053

Severity error

Message

The DreamShader.SourceSpans metadata of '{Asset}' is not a JSON object, so no node on it can be mapped back to a source line; rebuild the asset from its source.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:387

Cause. The asset's DreamShader.SourceSpans metadata is present but is not a JSON object — it failed to deserialize at all. Package metadata is a plain string map, so anything can be written into that key; in practice this means the value was truncated or edited by hand.

Fix. Rebuild the asset from its source with -Force, which rewrites the whole table. If it comes back, the value is being written by something other than the emitter — check for a tool or script that stamps package metadata on generated assets.

DSH9054

Severity error

Message

No node generated from '{File}' has a source span on line {Line}; the line produced no graph node (a declaration, a comment, or a statement that folded away).

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:953

Cause. The table was read and the file matched, but no node's span starts on that line, is reached from a helper call on that line, or begins before it. Most lines of a real source are like this: a uniform declaration that became a parameter node is on its own line, but a blank line, a comment, a closing brace, a struct field, a #pragma, or a statement the constant folder removed produce no node at all.

Fix. Aim at a line that carries an expression. Note that the dedupe pass merges two identical expressions into one node whose span is the FIRST of them, so the second spelling of a repeated expression has no node of its own and answers this.

DSH9055

Severity error

Message

The material editor would not open for '{Asset}', so the node could not be revealed.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:1003

Cause. UAssetEditorSubsystem::OpenEditorForAsset was called for the asset and no editor came back for it at all. The usual cause is an asset whose editor cannot open in this session: a ThinCustom base material that is Ephemeral and has no package on disk, or an asset the editor is mid-shutdown on. An editor that opens but is the wrong editor is DSH9056, not this.

Fix. Open the asset by hand once to see the real refusal, which the asset editor reports itself. For a ThinCustom product, materialize it first — the hidden base is the thing with a graph, and an Ephemeral base has no editor until it exists as an asset.

DSH9056

Severity error

Message

'{Asset}' opened in an editor that is not the material editor, which has no node graph to select in; only a node of a Material or a Material Function can be revealed.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:1009

Cause. An editor opened for the asset, but not the material editor — so there is no node graph to select in. A UMaterialInstance does this: it opens the material instance editor, which has a parameter list and no graph, and is not an IMaterialEditor. The reveal path aims at the graph-bearing asset on purpose, so reaching this means the asset carrying the span table is not the kind of asset it claims to be.

Fix. Reveal in the Material or Material Function the source generates, not in an instance of it. For a ThinCustom product the addressable asset is the instance but the graph is on its hidden base material, and that base is what a reveal-node answer names in assetPath — the instance is reported separately in instanceAssetPath. If assetPath already names a Material and this still fires, the asset's class and its metadata disagree; rebuild it from source with -Force.

DSH9057

Severity error

Message

The expression {Guid} recorded for line {Line} is not in '{Asset}' any more, so the node could not be selected; the asset changed since it was generated -- rebuild it from its source.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:1017

Cause. The span table names an expression GUID that the asset's graph no longer contains. The table and the graph are written together, so this means one of them changed afterwards: a node was deleted by hand, or the asset was reverted to an older version while its metadata was not.

Fix. Rebuild the asset from its source with -Force. If the asset was deliberately hand-edited, resolve the divergence first (Revert to Source, Adopt Into Source, or Detach From DreamShader) — a detached asset keeps neither the stamp nor the table, and stops answering navigation at all, which is the correct outcome for an asset that is no longer generated.

DSH9058

Severity error

Message

The source file '{File}' this node was generated from is not on disk any more, so it could not be opened; regenerate the asset, or restore the file.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:588, Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:594

Cause. Open Source Line (or Open Call Site) could not put a text editor on the file. Two separate causes share the code because the user's next move is the same for both: the file named in the span is not on disk any more, or every launcher in the chain refused — VSCode, the OS default editor for the extension, and Notepad.

Fix. If the file is missing, the asset outlived its source: regenerate it, or restore the file from version control. If the file is there, the launcher chain is the problem — check that the extension has a default application, and see Workspace for how VSCode is discovered.

DSH9059

Severity warning

Message

The DreamShader.SourceSpans entry '{Key}' of '{Asset}' is not an expression GUID and was skipped; that node cannot be navigated to.

Raised by Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:402, Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:416, Source/DreamShaderEditor/Private/Navigation/DreamShaderSourceNavigation.cpp:440

Cause. One row of the DreamShader.SourceSpans table could not be read: its key is not a GUID, its value is not an object, or the row names no file (or a line below 1). The row is skipped and the rest of the table is used, so navigation still works for every other node — this is a warning precisely because one bad row is not a reason to refuse the whole asset.

Fix. Rebuild the asset from its source with -Force. A row that keeps coming back malformed is an emitter bug, not an authoring mistake: report it with the asset path, which the message carries.

DSH9060

Severity error

Message

'{0}' is neither a material nor a material function, so it has no graph to read. A material instance decompiles to a '.dsi'.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:3101

Cause. The asset handed to the 2.0 decompiler is neither a material nor a material function (layers and blends included), so there is no expression graph to read. A plain material instance is handled by the instance decompiler and comes out as a .dsi.

Fix. Decompile the material or function itself; for an instance use the same command, which routes it to .dsi output on its own.

DSH9061

Severity info

Message

{0} expression(s) of '{1}' feed no output and are not part of the source; a build would prune them all the same.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2894

Cause. The graph holds expressions that feed no output: leftovers of editing. A source cannot say 'a node nothing reads' -- the compiler would prune it again -- so they are left out.

Fix. Nothing to fix. Wire them to something in the asset first if they are meant to survive.

DSH9062

Severity warning

Message

The reroute {0} feeds itself; the pin that reads it is treated as unconnected.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:511, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:605

Cause. The graph has a cycle: a Reroute (or named reroute) chain leads back into itself, or a node reads a node that reads it back. The engine compiles such a wire as unconnected; the decompiler treats the reroute pin as unconnected and writes a zero for the read that closes a node cycle.

Fix. Delete the looping wire in the material editor and decompile again.

DSH9063

Severity warning

Message

The named reroute {0} has no declaration; the pin that reads it is treated as unconnected.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1666, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1939, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1975, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:487, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:525

Cause. A node reads something that is not there: a NamedRerouteUsage whose declaration no longer exists in the graph (deleted, or lost in a copy from another material), a Reroute with nothing wired into it, or a Break/GetMaterialAttributes node with no material wired in. A Convert node says it too, for a mapping onto or out of a pin or channel the node does not have, and for a channel read past the width of the value wired to its input -- both of which the engine refuses to compile.

Fix. Reconnect or delete the node in the asset. The pin that read a reroute decompiles as unconnected; a read of no material's attributes is written as zero. A Convert mapping the node has no pin for is left out, so that channel takes the output's default; a channel past the wired value is a zero, which is what the new material translator reads there.

DSH9064

Severity warning

Message

{0} calls a material function that is missing; a zero stands in for every value read from it.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1419

Cause. A MaterialFunctionCall node's function asset is missing (deleted, or its plugin is not mounted). There is no interface to read pins from, so every value read from the call is written as zero to keep the rest of the text compilable.

Fix. Restore the function asset, or fix the call in the material, and decompile again.

DSH9065

Severity warning

Message

{0} is of a class the builtin catalog does not list (abstract, deprecated, or from a module loaded after the catalog was built); a zero stands in for every value read from it.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2351

Cause. An expression is of a class the builtin catalog does not list -- abstract, deprecated, or from a module that was loaded after the catalog was built. The language can only name classes the catalog has, so a zero stands in for the node's values.

Fix. If the class comes from a plugin, make sure the plugin is loaded before DreamShader builds its catalog (restart after enabling it), then decompile again.

DSH9066

Severity warning

Message

The input '{0}' of '{1}' is a dynamic bool pin, which the language has no parameter for; it is written as 'bool' and rebuilds as a scalar pin.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1390

Cause. A function input is of the engine's dynamic Bool pin type. The language has bool parameters that are scalar pins, and /// @static ones that are StaticBool pins; it has no spelling for the dynamic bool pin.

Fix. Accept the scalar pin (callers may need reconnecting once), or change the input's type in the asset to StaticBool or Scalar before decompiling.

DSH9067

Severity warning

Message

{0} carries {1} additional define(s), which a '/// @custom' function cannot declare; the rebuilt node has none. Move them into the body as '#define' lines.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1556

Cause. A Custom node carries Additional Defines. A /// @custom function declares inputs, outputs and code, and has no directive for defines.

Fix. Move each define into the function body as a #define line.

DSH9068

Severity warning

Message

{0} changes '{1}', which a '///' directive cannot carry; the rebuilt parameter has the default.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1069, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2455

Cause. A node changes a property the text cannot carry: on a parameter, one that no /// directive stands for (a channel name, a curve atlas, a custom primitive data index ...); on any other node, a property of a kind a call argument cannot hold (an array of pins, a map, a delegate). An array of structs is written as the text ImportText reads, without the pins in it (Layers = "((LayerName=\"Grass\"))"). The rebuilt node has the engine default for it.

Fix. Set that property on the rebuilt asset by hand, or keep this one node out of the source (hand-made function + extern).

DSH9069

Severity info

Message

{0} has nothing wired to Value, so it is its {1} branch and nothing else; the rebuilt graph has no switch there.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1793, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2170, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2181

Cause. A StaticSwitch has nothing wired to its Value pin, so it always takes the branch its DefaultValue names. The source says that branch directly; the rebuilt graph has no switch there. The same goes for a Switch with nothing wired to SwitchValue, whose ConstSwitchValue picks one input (or the default) for good, and for a Switch with no input besides its default.

Fix. Nothing to fix; wire a static bool to Value (a value to SwitchValue) in the asset if the switch is meant to be switchable.

DSH9070

Severity warning

Message

{0} has {1} wired input(s) the class does not declare as named pins, so a call cannot connect them; the rebuilt node leaves them unconnected.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2414

Cause. A node has inputs wired that its class does not declare as named pins (dynamic inputs of a class the catalog reads by reflection). A call in source connects pins by name, so there is no way to write those wires. A class the catalog knows to name its pins per node (a Landscape layer blend, grass or physical-material output) is written with the name the node shows instead; this is said only for a pin whose name is empty, a keyword, or one another pin or argument also answers to.

Fix. Rebuild that part by hand after decompiling; the message names the node.

DSH9071

Severity warning

Message

The input '{0}' of '{1}' has its Preview pin wired. Source says that as a default that is an expression ('float {0} = UE.TexCoord(Index = 1).r'), which the decompiler does not write yet; the rebuilt input previews its number.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1397, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:3024

Cause. A material function states something about its interface that source does not write yet. A FunctionInput has its Preview pin wired: the input's default is a graph expression, which source says as a parameter default that is an expression -- the compiler builds it, the decompiler does not write it yet, and the rebuilt input previews its number. Or the function has a user-exposed caption, which no directive carries.

Fix. Write the default by hand in the decompiled text: float Name = <expression>. A caption has to be set on the rebuilt asset.

DSH9072

Severity warning

Message

{0} is read through its output {1}, which is no material attribute the catalog knows; a zero stands in for that read.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1597, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1628, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:695, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:728, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:735

Cause. A node is used through something the catalog does not know: a Break/GetMaterialAttributes output that is no material attribute (added by a plugin, or an index past the table) is read as zero; an output index the node has no slot for is read as the node's first output, and a read of a node whose class lists no output at all is read as zero; a Set/MakeMaterialAttributes input that is no known attribute is dropped.

Fix. Check whether the attribute belongs to a plugin that is not loaded; otherwise rewire the node in the asset.

DSH9073

Severity info

Message

{0} is a StaticSwitchParameter, which the language writes as a '/// @static' uniform and a static branch; the rebuilt graph has those two nodes in its place.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1191, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1329, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:1716, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2064, Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2227

Cause. One engine node the language writes as two, or under another class. A StaticSwitchParameter is both a parameter and a switch: source says a /// @static uniform bool and a static branch, and a build makes a StaticBoolParameter plus a StaticSwitch. A texture sample parameter becomes a texture uniform and a sample of it (TextureObjectParameter + TextureSample). A GetMaterialAttributes node rebuilds as a BreakMaterialAttributes. A Convert node (Make / Break FloatN) and a Switch with an unnamed case keep their pins in arrays no call can name, so they are written as what they compute (a Switch whose cases are all named is written as the Switch itself): each Convert output as the channels it is put together from (ComponentMask and AppendVector nodes), a Switch as the branches the engine makes of it (Floor and If nodes). Instances keep working: parameter names and static permutations are the same.

Fix. Nothing to fix.

DSH9074

Severity info

Message

'{0}' reads its attributes as one set, so the {1} individual pin(s) that are also wired are ignored, by the engine and here.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderGraphImport.cpp:2985

Cause. A material with Use Material Attributes on reads its attributes from the one MaterialAttributes pin; the individual attribute pins that are also wired are ignored by the engine, and so by the decompiler.

Fix. Nothing to fix; disconnect the dead wires in the asset to stop the note.

DSH9075

Severity info

Message

The uniform '{0}' is written as '{1}': the name is already taken in this file.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1277, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:664, Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:69

Cause. Something in the decompiled file could not keep its name: a parameter whose name is taken by another declaration, a local named like a parameter or not an identifier the language allows, a custom function whose name is taken. It is written under another name; a uniform keeps its real parameter name through /// @name.

Fix. Nothing to fix for uniforms and locals. A custom function that was renamed may still be called by its old name from inside another custom body, which is verbatim HLSL: change that call by hand.

DSH9076

Severity warning

Message

A region of '{0}' is titled '{1}', which does not fit on a '#pragma region' line; it is written as '{2}'.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:575

Cause. A comment box's title cannot stand on a #pragma region line as it is (it has line breaks, or is empty). It is written in a form that can.

Fix. Nothing to fix; edit the region's title in the text if you like.

DSH9077

Severity info

Message

{0} node position(s) of '{1}' belong to values the source writes inline, and a position is kept by variable name; those nodes are placed by the layout pass when the file is built.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1698, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1927

Cause. Some node positions are not kept. A position is stored by variable name (#pragma layout(Node, Var = ...)) for the whole file: a value the source writes inline has no name to hang one on, and a name two functions of the file place differently is ambiguous. Those nodes are placed by the layout pass on the next build.

Fix. Nothing to fix. Give a value a variable of its own to keep its position.

DSH9078

Severity error

Message

The output '{0}' of '{1}' did not become a parameter; nothing is written to it.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1837, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1889, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1894, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1098, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:801, Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:121, Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:319, Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:360

Cause. Something in the graph has no place in the text being written: a function output that did not become a parameter, an attribute or pin whose name is not one the language has, an input that is neither a pin of its class nor a name an argument can carry, a node that cannot be written as source at all (0.0 stands in its place), or a material instance handed to the .dss writer (it is written as a .dsi).

Fix. Rename the pin, output or attribute in the asset to an identifier and decompile again. For a node that cannot be written, the message says why.

DSH9079

Severity info

Message

{0} is an If whose branches no comparison selects between; it is written as 'UE.If(...)'.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1406

Cause. An If node's A/B inputs are not a comparison the language can write as a > b ? x : y (its three branches differ in a way no single operator selects). It is written as the node call UE.If(...), which builds the same node.

Fix. Nothing to fix.

DSH9080

Severity warning

Message

The parameter '{0}' appears more than once and its nodes do not agree on its default, group or kind; the uniform is written from the first one, in '{1}'.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:549

Cause. A parameter name is used by more than one node and the nodes disagree on default, group or kind. The engine takes one of them; the uniform is written from the first one met.

Fix. Make the nodes agree in the asset, or check that the written default is the one you want.

DSH9081

Severity warning

Message

'{0}' is called and its interface was not available, so its 'extern' prototype is written from the calls alone: pins no call connects are missing from it, and their order is the order the calls wire them in.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1136

Cause. The text calls a material function whose asset was not available to read an interface from (a Core-only decompile, or a missing asset), so the extern prototype is inferred from the calls: pins no call connects are missing, their order is the order of first use, and defaults are unknown.

Fix. Decompile in the editor with the function asset present, or correct the prototype by hand against the asset's pins.

DSH9082

Severity warning

Message

The code of the custom node '{0}' carries DreamShader's markers and does not read as what the compiler writes; it is kept verbatim as the body of one function, the functions it embeds included.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1220, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1431

Cause. A Custom node's code could not be taken apart cleanly. Either it carries DreamShader's begin/end markers and does not parse as what the code builder writes -- it was edited by hand after generation -- and is kept verbatim as the body of one function, embedded helpers included; or a pin has a name the language cannot declare, so the parameter is written under another name while the body still says the old one.

Fix. For the first, nothing to fix if the code is right; tidy the helpers out into functions of their own by hand if you want them shared. For the second, rename the identifier in the body to match the parameter.

DSH9083

Severity warning

Message

'{0}' is a {1}, and its pins are not the ones the language writes that kind with; it is written as a plain exported function, which builds a material function.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:950, Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:959

Cause. The asset is a material layer or blend whose pins are not the shape the language writes that kind with (a layer with extra inputs, a blend without exactly two material inputs). It is written as a plain exported function, which builds a MaterialFunction rather than a layer asset.

Fix. Give the layer/blend the standard pins in the asset, or keep that asset hand-made and declare it extern.

DSH9084

Severity warning

Message

The output '{0}' of '{1}' is not connected to anything; nothing is written to it.

Raised by Source/DreamShaderLang/Private/Decompile/IRToAst.cpp:1814, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1126, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1149, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1506, Source/DreamShaderLang/Private/Decompile/IRToAstExpressions.cpp:1545, Source/DreamShaderLang/Private/Decompile/IRToAstStatements.cpp:204

Cause. Something is left at a default because the graph or the language gives nothing to write: a function output, custom-output pin or material attribute with nothing wired to it; a node property that is a list, or whose name an argument cannot carry (left at the class default); a required input left unconnected (0.0 is passed); an inout input left unconnected (the variable starts at zero); a wired input its class does not declare (dropped).

Fix. Nothing to fix unless the output or input was meant to carry a value; then wire it in the asset and decompile again.

DSH9085

Severity error

Message

'{0}' ends in '.{1}', which is read as {2} source, and the decompile was asked for {3} text; name the file after the text, or leave the format to the extension.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderDecompileService.cpp:295, Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:212

Cause. The output file's extension and the text asked for disagree: .dsm / .dsf are read as 1.x text, anything else as 2.0, and the decompile was asked for the other one; or the asset is a material instance, which decompiles to a .dsi and to nothing else.

Fix. Name the file after the text you want, or leave -Format at Auto (and -Out off) and let the asset decide.

DSH9086

Severity error

Message

The decompile was asked for 2.0 text and was handed the 1.x decompiler, which writes '.dsm' and '.dsf' only; build the service with GetIRDecompiler() for Format = Dss.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderDecompileService.cpp:312, Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:356

Cause. The decompile cannot take what it was handed. From the command line: the asset is of a class no DreamShader source describes -- a decompile takes a material, a material function, layer or blend, or a material instance. From code: a request for 2.0 text was routed to the 1.x decompiler, which writes .dsm / .dsf only.

Fix. Pass one of the supported asset classes. The second case is a wiring error in the caller: build the service with GetIRDecompiler() for Format = Dss, and report it if it comes from the editor.

DSH9087

Severity error

Message

'{0}' does not resolve to the assets it builds, so there is nothing to decompile for it.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:297, Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:328

Cause. -SourceFile names a source, and the assets it builds could not be resolved: the source does not compile far enough to list its products, or none of them exists yet.

Fix. Compile the source first, or name the asset directly.

DSH9088

Severity error

Message

The graph of '{0}' did not read into a valid module; the errors above say where. This is a defect of the decompiler, not of the asset.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:428

Cause. The imported graph failed IR validation. The importer produced something the compiler's own rules reject, which is a defect of the decompiler; the errors above it say what.

Fix. Report it with the asset. -Format Legacy still gives 1.x text for the same asset.

DSH9089

Severity warning

Message

The decompiled text does not parse back: {0}: {1}. It is written as it is; this is a defect of the decompiler.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:483

Cause. The text the decompiler printed does not parse back. It is written anyway so that nothing is lost; the message names the first parse error.

Fix. Report it with the asset; fixing the named line by hand usually gets a working file.

DSH9090

Severity error

Message

'{0}' fails conditional compilation ({1}: {2}), and a source with '#if' lines is not migrated in any case.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:106, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:117

Cause. The source uses #if conditional compilation (or fails it). A migration would only see the branch taken with today's defines and silently drop the others.

Fix. Remove or resolve the conditionals first, or migrate the file by hand.

DSH9091

Severity error

Message

'{0}' names a source root in front of the path, which '#include' cannot; write the path from the root's own folder (a leading '/') or relative to this file, then migrate again.

Raised by Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:502

Cause. An import names a source root in front of the path (import "MoonToon:Shared/Common.dsh"). #include has no such form.

Fix. Write the path from the root's own folder with a leading /, or relative to the file, then migrate again.

DSH9092

Severity error

Message

{0} comment(s) of '{1}' would not be in the migrated file ({2}), so nothing was written; this is a fault of the migration, not of the source.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:609

Cause. A comment of the 1.x file would be missing from the migrated text. Every rewrite is checked against the comments of its source, and nothing is written when one is lost.

Fix. This is a defect of the migrator, not of the source. Report it with the file; the message quotes the comments.

DSH9093

Severity error

Message

'{0}' has no 1.x declaration left; there is nothing to migrate.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:548

Cause. The file is a .dsh that holds 2.0 declarations only. There is nothing left to migrate.

Fix. Nothing to do.

DSH9094

Severity warning

Message

'{0}' keeps its '/// @root', the 1.x spelling of where its asset goes, because the place the new file would put it could not be worked out; check the asset path the first build reports.

Raised by Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:2133, Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:437, Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:483, Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:609, Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:916, Source/DreamShaderLang/Private/Migrate/LangMigrate.cpp:926

Cause. The migrated text differs from the 1.x source in a way the migrator could not avoid and that does not stop the build: /// @root kept because the new file's place could not be worked out, an optional input of a type that has no default to write (it becomes required), a multi-line text flattened onto one /// line, a selected output with no variable to read from. And a call of a 1.x function another file declares, written for that function as it is now: once that file is migrated, a function that returned nothing returns its first out (rule L9) -- a graph call then passes one argument too many -- and a Namespace function keeps its outs, so a body that read its value has none to read.

Fix. Read the message: each case says what changed. Check the asset path or the input the first build reports.

DSH9095

Severity error

Message

'{0}' is not a 1.x source; migrate takes '.dsm', '.dsf' and '.dsh' files.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:514, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:522

Cause. dsc migrate was given a file that is not a 1.x source, or that cannot be read.

Fix. Pass a .dsm, .dsf or .dsh.

DSH9097

Severity error

Message

The migrated text of '{0}' does not build as 2.0 source ({1}), so nothing was written; the text is in '{2}'.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:627

Cause. The rewritten text was parsed, bound and lowered as 2.0 source before being written, and every call in its @custom bodies was matched against the HLSL its callee becomes (DSH6262, DSH6265, DSH6266) -- a header lowers to nothing, so nothing else reads its bodies -- and it does not build. Nothing was written; the rejected text is kept under Saved/DreamShader/Migrated/Rejected/ and the diagnostics that follow point into it.

Fix. Read the first error in the rejected file. It is either a construct the migrator does not handle yet (report it) or a 1.x leniency the source leaned on that has no 2.0 spelling -- fix that in the 1.x source and migrate again.

DSH9098

Severity warning

Message

The migrated text of '{0}' does not build the graph the 1.x file builds: {1}

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:661, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:676

Cause. The migrated text builds, and its IR is not equivalent to the 1.x file's: either the graph differs (the message walks down to the first differing node) or the asset would land at another path. Differences that are one asset written two ways -- a constant on a pin against its Const* twin, an identity swizzle, spacing in Custom code -- are not reported.

Fix. For a graph difference, compare the two nodes named; typical causes are a 1.x OutputType that lied about a node's width, and an explicit swizzle where 1.x wired a wider value as it was. For a path difference, add the /// @name the message gives.

DSH9099

Severity error

Message

'{0}' already exists and is not written over; move it away, or migrate into another folder with -Out.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:148, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:555, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:704, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:720, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:732, Source/DreamShaderEditor/Private/Commandlet/DreamShaderMigrate.cpp:750

Cause. The migration could not read, write or replace a file: the builtin catalog is empty (nothing names a UE.* node), the .dss already exists, the output or the backup location is not writable, or the 1.x file could not be moved away -- in which case the new file is not written either, because the two would declare the same assets.

Fix. Free the path the message names, or migrate into another folder with -Out.

DSH9100

Severity error

Message

'{0}' has no parent material, and a '.dsi' is nothing but overrides of one.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:175

Cause. The material instance has no parent. A .dsi is nothing but overrides of a parent, so there is nothing to write.

Fix. Set the instance's parent in the asset.

DSH9101

Severity warning

Message

'{0}' overrides {1} parameter(s) of its material layers or blends, which a '.dsi' cannot address; they are left out.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:300

Cause. The instance overrides parameters of its material layers or blends. A .dsi addresses global parameters only, so those overrides are left out of the text and would be lost on a rebuild.

Fix. Keep such an instance hand-made, or move the values to global parameters in the parent.

DSH9102

Severity info

Message

The parameter '{0}' is not a name a variable can have; it is written under another with '/// @name {0}'.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:289

Cause. A parameter's name is not an identifier (Base Color, UV-Scale). The override is declared under an identifier and carries /// @name <real name>.

Fix. Nothing to fix.

DSH9103

Severity error

Message

DSH9103: The Parent of '{0}' no longer resolves, so the overrides of '{1}' cannot be written back into it: {2}

Raised by Source/DreamShaderEditor/Private/Provenance/DreamShaderProvenanceActions.cpp:747

Cause. Adopt (or a tweak action) has to rewrite a .dsi, and the file's Parent no longer resolves, so the instance's overrides cannot be checked against a parameter list.

Fix. Fix the Parent key in the .dsi, then adopt again.

DSH9104

Severity warning

Message

'{0}' overrides '{1}', which '#pragma instance' has no key for; the rebuilt instance has the parent's.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:320

Cause. The instance overrides a base property #pragma instance has no key for. The rebuilt instance takes the parent's value.

Fix. Set it on the rebuilt asset by hand, or on the parent.

DSH9105

Severity warning

Message

'{0}' is a curve atlas row, and '{1}' picks its curve; a '.dsi' can state the row's number and nothing else, so the rebuilt instance loses the curve.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:281

Cause. A scalar override is a curve-atlas row: the engine stores the curve and atlas beside the number. A .dsi can state the number only.

Fix. Keep that instance hand-made if the curve matters.

DSH9106

Severity warning

Message

'{0}' is declared 'bool' by the parent's source and '{1}' sets it to {2}; the override is written as a 'float'.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderInstanceDecompiler.cpp:270

Cause. The parent's source declares the parameter bool (a scalar 0/1 parameter), and the instance holds a value that is neither 0 nor 1. It is written as a float override so that the value survives.

Fix. Nothing to fix; correct the value in the asset if 0 or 1 was meant.

DSH9107

Severity error

Message

Expected '{0}' to be declared alone to rewrite its value, found it in a declaration shared with other names; split the declaration first.

Raised by Source/DreamShaderLang/Private/Lang/LangInstanceSource.cpp:656, Source/DreamShaderLang/Private/Lang/LangPipelineSource.cpp:1227

Cause. An editor action has to rewrite one override's value in a .dsi, and that name shares its declaration with others (uniform float a = 1, b = 2;). The rewriter edits one declaration at a time.

Fix. Split the declaration into one line per name.

DSH9108

Severity error

Message

Expected every change to this file to touch its own stretch of text, found an edit at line {0} that overlaps another or runs past the end; the file was left unchanged.

Raised by Source/DreamShaderLang/Private/Lang/LangInstanceSource.cpp:803, Source/DreamShaderLang/Private/Lang/LangPipelineSource.cpp:1150

Cause. Two text edits computed for one .dsi overlap, or one runs past the end of the file. The file is left as it was. Internal error of the instance source rewriter.

Fix. Report it with the file and the action that was taken.

DSH9109

Severity error

Message

Expected a '#pragma instance(...)' line in this .dsi file, found none; the file was left unchanged.

Raised by Source/DreamShaderLang/Private/Lang/LangInstanceSource.cpp:1109, Source/DreamShaderLang/Private/Lang/LangInstanceSource.cpp:1122, Source/DreamShaderLang/Private/Lang/LangInstanceSource.cpp:954, Source/DreamShaderLang/Private/Lang/LangPipelineSource.cpp:2355

Cause. An editor action that rewrites a source in place found nothing to anchor its edit on: a .dsi without a #pragma instance(...) line, or -- when an instance's value is written back as the default of its parent's uniform -- no uniform of that parameter name declared in the file itself (one in an included header cannot be spliced), or one declared as another kind of parameter. The action also refuses a scalar value that the .dss uniform's bool, int or uint type cannot represent: changing a shader input's type implicitly could change its callers.

Fix. Add the pragma (#pragma instance(Parent = "...")), or declare the uniform in the file the action targets, and repeat the action. For an unrepresentable scalar, change the source type explicitly or extract the tweak into a .dsi instance.

DSH9110

Severity error

Message

'-{0}={1}' is neither on nor off. A flag takes true, 1, yes or on, or false, 0, no or off, and '-{0}' alone is on; the command did nothing.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderCommandletRunner.cpp:228

Cause. a boolean flag of a commandlet verb -- -Force, -All, -Check, -DryRun, -NoBackup, -Shaders, -Json, -IncludeEphemeral, -KeepAssetPath, -Readable, -Gc or -Rebuild -- was written with a value that is neither on (true, 1, yes, on) nor off (false, 0, no, off), in any case. An empty value counts as neither: -Force= is usually a script variable that was never set. Nothing guesses what was meant. A verb reads all of its flags before it touches a file, and on this error it runs nothing and exits 1. In 2.1.0 and earlier a flag written with any value read as absent, so migrate -Check=true migrated and fmt -Check=true rewrote.

Fix. write the flag bare to turn it on (-Force), or with one of the eight words; leave it out, or write =false, to keep it off. Only the flags a verb reads are checked: one it does not take is ignored, whatever its value.

See Commandlet — Boolean flags

DSH9111

Severity warning

Message

'{0}' is in a package's asset folder and no source builds it any more: its package was removed or stopped generating it. Delete it if nothing uses it.

Raised by Source/DreamShaderEditor/Private/Tools/DreamShaderCompilerTools.cpp:1216

Cause. list-generated -All found an asset under a package asset root (/Game/DreamShaderPackages, /<Plugin>/DreamShaderPackages) that no source builds any more: its package was removed, or the package stopped generating it (a function renamed, an annotation taken off). Packages build into these folders only, so the asset is a leftover. Nothing is deleted: a material may still use it.

Fix. Check what references the asset (the Reference Viewer), replace those uses, and delete it. Reinstalling the package, or restoring the annotation, makes a source build it again and the warning goes away.

DSH9200

Severity error

Message

The Custom Pass slot registry cannot be read: {0}. 'dsc pass-registry -Rebuild' moves it aside and gives every HLSL pass a slot again.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:164

Cause. pass-registry could not read Registry.json to list it: the file cannot be opened, it is not valid JSON — a merge conflict left in it is the usual reason — or an entry has no slot number, pipeline or pass. Nothing is listed and the run fails (exit code 1). A compile of any .dsp refuses the same file (DSH8315).

Fix. Run ./dsc.ps1 pass-registry -Rebuild: it moves the file aside to Registry.json.unreadable and compiles every .dsp, which gives every HLSL pass a slot again. Taking either side of the conflict and compiling the .dsp files again works too; never merge the JSON by hand. See pass-registry.

DSH9201

Severity warning

Message

No .dsp builds '{0}' any more, but the asset is still there and its pass '{1}' points at {2} slot {3}. Delete the asset or restore its source: once the slot is collected and given to another pass, that pass's shader is what this one would run.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:98

Cause. No .dsp under the source roots builds this slot's pipeline any more — the .dsp was deleted or renamed — and the pipeline asset is still there, loaded or on disk, with its pass pointing at the slot. -Gc frees such a slot, and once a new HLSL pass takes it, the old pipeline dispatches that pass's shader with its own bindings wherever it still runs (a volume, a component, the project's global pipelines). Raised by the listing, -Gc and -Rebuild.

Fix. Delete the old pipeline asset and whatever activates it, or restore its .dsp and compile it, which gives the pass a slot of its own again. A renamed .dsp builds a new pipeline under its new name; the asset under the old one is the orphan.

DSH9202

Severity info

Message

{0} slot {1} was freed: {2}

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:213

Cause. Informational. pass-registry -Gc, or the collection step of -Rebuild, freed a slot: no .dsp builds its pipeline any more, or its pipeline's .dsp compiles and no longer runs that pass in HLSL in that table. Its entry in Registry.json, its section in the registry file and its snapshot are deleted. A commandlet recompiles no shader; the next editor start compiles the changed registry.

Fix. Nothing. Commit the changed .dreampass/ folder.

DSH9203

Severity warning

Message

Registry.json did not parse and was moved aside to '{0}'; the compiles that follow give every HLSL pass a slot afresh.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:343

Cause. pass-registry -Rebuild found a Registry.json that does not parse — a merge conflict left in it is the usual reason — moved it aside to Registry.json.unreadable and started from an empty registry. The compiles that follow give every HLSL pass a slot afresh, in path order, so slot numbers can change, and every pipeline with an HLSL pass is rebuilt and saved with its new slots.

Fix. Nothing to repair. Commit the rebuilt .dreampass/ folder, and the rebuilt pipelines if you commit generated assets. Nothing reads Registry.json.unreadable: look at it to see what the conflict was, then delete it rather than commit it.

DSH9204

Severity error

Message

'{0}' did not compile, so its pipeline keeps the slots it had: {1}

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:395

Cause. pass-registry -Rebuild compiles every .dsp under the source roots, forced, and this one failed; the message ends with the compile's report. Its pipeline keeps the slots the registry has for it — none, if this rebuild reset an unreadable registry (DSH9203) — and its asset is not updated. The run fails (exit code 1) and still finishes its remaining steps.

Fix. Fix the .dsp from the report and compile it (./dsc.ps1 compile <file>.dsp): that plans its slots against the rebuilt registry and updates its asset. DSH9205 names each of its passes that points at a slot it no longer owns, and DSH8337 each of its slots left without a snapshot.

DSH9205

Severity warning

Message

Pass '{1}' of '{0}' points at {2} slot {3}, which the registry {4}. Its source '{5}' did not compile, so the asset was not updated: fix the source and compile it, or that pass runs whatever the slot holds.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:314

Cause. After pass-registry -Rebuild, a pipeline whose .dsp failed in the rebuild (DSH9204) has a pass that points at a slot the registry now gives to another pass, or leaves free — typically because the rebuild reset an unreadable registry and gave every slot out afresh. The asset was not updated, so until its source compiles, that pass dispatches whatever the slot holds: another pass's shader with this pass's bindings, or the empty stub.

Fix. Fix the .dsp the message names and compile it; the compile gives the pass a slot of its own and writes it into the asset. Until then r.DreamPass.DisablePipelines keeps the pipeline from running.

DSH9206

Severity info

Message

No .dsp under the source roots; the registry is rewritten from Registry.json as it stands.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:363

Cause. Informational. pass-registry -Rebuild found no .dsp under the source roots (Packages folders excluded), so there was nothing to compile. The rest of the rebuild still runs: the slots of pipelines no .dsp builds are freed — a slot whose recorded .dsp is still on disk is kept — and the registry files are rewritten from Registry.json.

Fix. Nothing, when the project has no pipelines. If it has, the source roots do not reach their .dsp files: check the Source Directory project setting and the plugins' DShader folders.

DSH9208

Severity warning

Message

The snapshot of {0} slot {1} (pass '{2}' of '{3}') is not on disk, and the registry file includes it: the next start takes the slot's section out of the registry file, and the pass does nothing until its source is compiled again -- unless the registry file is read-only, and then the global shaders fail to compile, which is fatal. Compile '{4}', or run 'dsc pass-registry -Rebuild'; commit the Slots folder with the registry.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:114

Cause. Registry.json records a snapshot for this slot and its files are not under .dreampass/Slots/ — a Slots folder that was not committed, or not synced — and the registry file still includes them. At its next start the DreamShaderPass module takes such a section out of the registry file (an error in the log), and the pass does nothing until its .dsp compiles again. Only a registry file that is read-only — not checked out — cannot be rewritten that way: it keeps including the missing file, and the global shaders then fail to compile, which is fatal. Raised by the listing and -Gc; -Rebuild reserves such slots itself (DSH8337).

Fix. Compile the .dsp the message names: that writes the snapshot back, and the section with it. ./dsc.ps1 pass-registry -Rebuild does every slot at once. Commit the Slots folder with the registry. If the registry files are read-only, check them out before the editor next starts.

DSH9209

Severity warning

Message

'{0}' does not compile far enough to tell whether it still runs pass '{1}' in {2} slot {3}, so the slot is kept. Fix the source and compile it.

Raised by Source/DreamShaderEditor/Private/Commandlet/DreamShaderPassRegistryCommandlet.cpp:124

Cause. The .dsp that owns this slot does not compile far enough to tell whether it still runs the pass in HLSL in that table: its front end fails, its pipeline's asset path does not resolve, or the file is on disk and did not make it into the product index (a preprocessor error stops the index's parse). A slot is freed only on evidence, so this one is kept. Raised by the listing, -Gc and -Rebuild.

Fix. Fix the .dsp — ./dsc.ps1 check <file>.dsp says what is wrong — and compile it; the listing can then judge the slot. If the .dsp is meant to go, delete it, and -Gc frees its slots.

DSH9210

Severity error

Message

'{0}' is a pass pipeline, which decompiles to a '.dsp', and '{1}' is not one.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderIRDecompiler.cpp:247

Cause. A pipeline decompiles to .dsp text, and the output file asked for — -Out, or the request's output path — has another extension. (-Format=Legacy, or an -Out ending in .dsm / .dsf, hands the pipeline to the 1.x decompiler instead, which refuses it: a pipeline has no 1.x text.)

Fix. End -Out in .dsp, or leave it off: the default is <SourceDirectory>/Decompiled/Pipelines/<package path>.dsp.

DSH9211

Severity warning

Message

The pass '{0}' has neither a material nor a shader, so the text names neither, and it does not build until one is given.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:435

Cause. A fullscreen pass of the pipeline has neither a material nor a shader — the material it named no longer loads, or both were cleared in the pipeline's details panel. A .dsp fullscreen pass names one of the two, so the text names neither and does not build until one is given. dsc decompile writes the warning at the head of the file; Adopt refuses the pipeline and writes nothing.

Fix. Give the pass its material, or its shader and entry, in the details panel and decompile or adopt again — or, after a decompile, write Material (or Shader and Entry) into the text.

DSH9212

Severity warning

Message

The pass '{0}' has both a material, '{1}', and a shader, '{2}'; a fullscreen pass names one of the two, and the text keeps the material, which is what the pass draws.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:413

Cause. A fullscreen pass of the pipeline has both a material and a shader, which only an edit in its details panel makes: a compile sets one of the two. The pass draws the material, so the text keeps it and leaves the shader out. Adopt refuses the pipeline rather than drop the shader from the .dsp.

Fix. Clear the one the pass should not have in the details panel, then decompile or adopt again.

DSH9214

Severity info

Message

A layer filter of the pass '{0}' kept no spelling of its layers, so they are written as the project's layer table names its bits today: {1}.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:534

Cause. Informational. A Layer(...) filter term of a mesh pass holds layer bits and none of the names it was written with — an edit by hand, or an asset compiled before the names were kept beside the bits. The text names the bits by the project's layer table as it is today.

Fix. Check that the names are the layers meant: if the table was reordered since the bits were set, the same bits name other layers now.

DSH9215

Severity warning

Message

A layer filter of the pass '{0}' selects layer bit(s) {1}, which the project's layer table has no name for; the text cannot say them and leaves them out.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:541

Cause. A Layer(...) filter term of a mesh pass selects layer bits that the project's layer table names nothing at (the table is shorter, or the entry is empty), and no stored name says what they were. A .dsp names layers, so the text leaves those bits out. Adopt refuses the pipeline rather than drop them.

Fix. Name those positions in Project Settings ▸ DreamPlugin ▸ DreamShader Custom Pass ▸ Layer Names (bit n is the n-th name, counting from 0), or take the bits out of the filter in the details panel; then decompile or adopt again.

DSH9216

Severity warning

Message

'{0}' runs in no kind of view, which a '.dsp' cannot say; the text leaves 'Views' out, and a rebuild runs in {1}.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:834

Cause. The pipeline runs in no kind of view: its Views is empty, which only an edit in its details panel makes. A .dsp has no spelling for that — leaving Views out means Game | Editor — so the text leaves it out, and a pipeline rebuilt from it runs in Game | Editor. Adopt refuses the pipeline.

Fix. Turn the pipeline off another way — Enabled bound to a bool uniform (a constant Enabled = false is DSH7322), taking it out of what activates it, or r.DreamPass.DisablePipelines for a session — and give it back the views it should run in; then decompile or adopt again.

DSH9217

Severity warning

Message

The pass '{0}' checks its override material for no usage flag at all, which a '.dsp' cannot say; the text leaves 'Usage' out, and a rebuild checks the default set ({1}).

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:584

Cause. A mesh pass checks its override material for no usage flag at all: its Usage is empty, which only an edit in its details panel makes. A .dsp has no spelling for that — leaving Usage out means the default set — so the text leaves it out, and a rebuild checks StaticMesh, InstancedStaticMeshes and SkeletalMesh. Adopt refuses the pipeline.

Fix. Set the flags the override material needs in the details panel (the default set, if nothing else), then decompile or adopt again.

DSH9218

Severity warning

Message

The parameter '{0}' defaults to '{1}', which is not a 2D texture. A '.dsp' declares every texture parameter 'Texture2D', and the text does so here too, keeping this default; it builds as it is.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:230

Cause. A texture parameter of the pipeline defaults to a texture that is not 2D — a cube, a volume, an array. A .dsp declares every texture parameter Texture2D, so the text states a type its default does not have, and keeps the default. The text builds as it is: a build takes any texture as the default, so the pipeline rebuilt from it keeps this one.

Fix. If the parameter is meant to be 2D, give it a 2D default, in the details panel or in the /// @default of the text.

DSH9219

Severity warning

Message

The pass '{0}' binds '{1}' to a texture constant, which a 'param' cannot state; the binding is left out of the text.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:333

Cause. A pass binds a param to a texture constant, which only an edit in its details panel makes. A param takes a uniform, a static const, a literal or DreamPassWeight, and has no spelling for a texture constant, so the text leaves the binding out. Adopt refuses the pipeline.

Fix. Declare a Texture2D uniform with that texture as its /// @default and bind the param to it, in the details panel or in the text; then decompile or adopt again.

DSH9220

Severity warning

Message

The pass '{0}' tests against its own depth but names no Depth32 buffer for it; the text writes 'Own()' empty, and it does not build until one is named.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:573

Cause. A mesh pass tests against its own depth (Depth = Own) but names no Depth32 buffer for it, which only an edit in its details panel leaves. The text writes Own() empty, which does not build until a buffer is named. Adopt refuses the pipeline.

Fix. Name a Depth32 buffer for it in the details panel — declare one if the pipeline has none — or choose TestScene or None; then decompile or adopt again.

DSH9221

Severity warning

Message

The decompiled pipeline does not parse back: {0}: {1}. It is written as it is; this is a defect of the decompiler.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:951

Cause. The .dsp text the decompiler printed does not parse back; the message names the first parse error. The file is written anyway, so nothing is lost. A defect of the decompiler, not of the asset.

Fix. Report it with the asset; fixing the named line by hand usually gives a working file.

DSH9222

Severity warning

Message

The decompiled pipeline parses but does not bind back into a pipeline: {0}: {1}. It is written as it is; either the asset breaks a rule a '.dsp' is checked against (an edit by hand can), or this is a defect of the decompiler.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:967

Cause. The printed text parses, and binding it — without the engine: references taken as written, the checks that need the project skipped — fails or gives no pipeline; the message quotes the first error. Either the asset breaks a rule every .dsp is checked against, which an edit in its details panel can (two passes or buffers of one name, a pass that reads and writes one buffer, a read before the first write of a Clear = None buffer, a kind at an injection point it cannot run at), or the decompiler is at fault. The file is written as it is.

Fix. Look up the quoted code: it names the rule, at its line in the text. Fix the asset in its details panel, or the text; if the pipeline was never edited by hand, report it with the asset.

DSH9223

Severity warning

Message

The decompiled pipeline reads back as a different pipeline ({0} difference(s); the first: {1}). It is written as it is; this is a defect of the decompiler or the printer.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:981

Cause. The printed text parses and binds, and the pipeline it binds to differs from the asset — the message counts the differences and names the first — even with the facts only the engine knows (what a reference resolves to, a .usf's [numthreads]) taken from the asset. A defect of the decompiler or of the printer; the file is written as it is.

Fix. Report it with the asset. Correct the named value in the text before building from it.

DSH9224

Severity warning

Message

A '.dsp' names its pipeline after its file and has no '/// @name', so '{0}' builds '{1}' where it is written, not '{2}'; move the file to where the pipeline's source belongs to keep its path.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:910

Cause. -KeepAssetPath asked to keep the pipeline where it is, and a .dsp cannot say where its pipeline goes: it names it after its file and has no /// @name, and the file's folder under its source root gives the package. Where the text is written, it would build the pipeline at the path the message names, not at the asset's.

Fix. Write the file (with -Out), or move it, to the folder and name that give the asset's path — usually where the pipeline's own .dsp was. Compiled where it is, it builds a second pipeline.

DSH9225

Severity error

Message

There is no pass pipeline to decompile.

Raised by Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:821, Source/DreamShaderEditor/Private/Decompiler/DreamShaderPipelineDecompiler.cpp:921

Cause. Internal. The pipeline decompiler was handed no pipeline at all, or the payload it read could not be laid out as a .dsp for the printer. Neither is a property of the asset; nothing is written.

Fix. Report it with the asset and the command that ran.

DSH9226

Severity error

Message

DSH9226: '{0}' is built from the pipeline file '{1}' but is not a pass pipeline, so nothing was adopted.

Raised by Source/DreamShaderEditor/Private/Provenance/DreamShaderProvenanceActions.cpp:489

Cause. Adopt was asked for an asset whose source stamp (DreamShader.SourceFile) names a .dsp, and the asset is not a UDreamPassPipeline. The one other asset a .dsp makes is the render target of an exported buffer, which carries the same stamp and holds nothing a .dsp states; anything else with a .dsp stamp had its metadata copied or edited. Nothing was adopted.

Fix. Adopt the pipeline itself — from its details panel, the divergence notification or the Material Content Browser. A render target follows its buffer's declaration: change the buffer in the .dsp.

DSH9227

Severity error

Message

DSH9227: '{0}' is not a .dsp pipeline file, so the settings of '{1}' cannot be spliced into it.

Raised by Source/DreamShaderEditor/Private/Provenance/DreamShaderProvenanceActions.cpp:880

Cause. The .dsp Adopt was handed a file that is not a .dsp. Adopt chooses the pipeline route by the extension of the asset's source stamp, so the editor's own entries always hand it a .dsp; this guards a direct call with another file. Nothing was written.

Fix. Adopt from the editor — the pipeline's details panel, the divergence notification, the Material Content Browser — which uses the .dsp the pipeline is stamped with.

DSH9228

Severity error

Message

DSH9228: '{0}' builds no pass pipeline any more, so '{1}' has nothing to be spliced into.

Raised by Source/DreamShaderEditor/Private/Provenance/DreamShaderProvenanceActions.cpp:935

Cause. The .dsp the pipeline is stamped with checks — it parses, binds and lowers — and nothing it builds is a pass pipeline, so there is nothing to splice the asset's values into. A .dsp that checks always builds exactly one pipeline, named after the file, so this guards a case a file does not normally reach. Nothing was written.

Fix. Run ./dsc.ps1 dump-ir <file>.dsp to see what the file builds, and report it with the file.

On this page