diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-28 00:39:32 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-28 00:51:27 +0100 |
| commit | 75e561bd092895a031ae4475f7d1fdc35b1b1832 (patch) | |
| tree | 8e193d59fa2c01148e625703d65ba0de5c6a4ce8 /src | |
| parent | a1e2159b0ff2cb1ecf2c4bc1dc95bf576fda282b (diff) | |
fix(shaders): deduplicate VertexOutput/vs_main via render/fullscreen_uv_vs snippet
- Fix vs_main return type (VertexOutput, not vec4<f32>)
- Fix #include paths in passthrough, gaussian_blur, heptagon, combined_postprocess
- ShaderComposer: assert + suggest correct path on missing #include (non-STRIP_ALL)
- VerifyIncludes: upgrade WARNING to ERROR + assert, add "did you mean?" hint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/effects/shaders.cc | 2 | ||||
| -rw-r--r-- | src/gpu/shader_composer.cc | 42 |
2 files changed, 42 insertions, 2 deletions
diff --git a/src/effects/shaders.cc b/src/effects/shaders.cc index 3ba00bc..7e32aa6 100644 --- a/src/effects/shaders.cc +++ b/src/effects/shaders.cc @@ -53,6 +53,8 @@ void InitShaderComposer() { register_if_exists("render/fullscreen_vs", AssetId::ASSET_SHADER_RENDER_FULLSCREEN_VS); + register_if_exists("render/fullscreen_uv_vs", + AssetId::ASSET_SHADER_RENDER_FULLSCREEN_UV_VS); register_if_exists("math/color", AssetId::ASSET_SHADER_MATH_COLOR); register_if_exists("math/utils", AssetId::ASSET_SHADER_MATH_UTILS); register_if_exists("render/raymarching", diff --git a/src/gpu/shader_composer.cc b/src/gpu/shader_composer.cc index fce6de4..be311dd 100644 --- a/src/gpu/shader_composer.cc +++ b/src/gpu/shader_composer.cc @@ -2,6 +2,7 @@ // It implements the ShaderComposer class. #include "gpu/shader_composer.h" +#include <cassert> #include <set> #include <sstream> @@ -44,6 +45,27 @@ void ShaderComposer::ResolveRecursive(const std::string& source, ss << "// --- End Include: " << name << " ---\n"; } else { ss << "// ERROR: Snippet not found: " << name << "\n"; +#if !defined(STRIP_ALL) + // Find suggestions: registered snippets whose basename matches. + std::string suggestion; + for (const auto& [sname, _] : snippets_) { + auto slash = sname.rfind('/'); + std::string basename = + (slash == std::string::npos) ? sname : sname.substr(slash + 1); + if (basename == name) { + suggestion = sname; + break; + } + } + fprintf(stderr, + "FATAL: #include \"%s\" - snippet not registered.\n", + name.c_str()); + if (!suggestion.empty()) { + fprintf(stderr, " Fix: use #include \"%s\"\n", + suggestion.c_str()); + } + assert(false && "Unresolved shader #include"); +#endif } } } @@ -111,10 +133,26 @@ void ShaderComposer::VerifyIncludes() const { } } if (!missing.empty()) { - fprintf(stderr, "WARNING: Unregistered shader snippets:\n"); + fprintf(stderr, "ERROR: Unregistered shader snippets referenced in #include:\n"); for (const auto& name : missing) { - fprintf(stderr, " - %s\n", name.c_str()); + std::string suggestion; + for (const auto& [sname, _] : snippets_) { + auto slash = sname.rfind('/'); + std::string basename = + (slash == std::string::npos) ? sname : sname.substr(slash + 1); + if (basename == name) { + suggestion = sname; + break; + } + } + if (!suggestion.empty()) { + fprintf(stderr, " - \"%s\" (did you mean \"%s\"?)\n", name.c_str(), + suggestion.c_str()); + } else { + fprintf(stderr, " - \"%s\"\n", name.c_str()); + } } + assert(false && "Unregistered shader snippets - fix #include paths"); } #endif } |
