summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-28 00:39:32 +0100
committerskal <pascal.massimino@gmail.com>2026-02-28 00:51:27 +0100
commit75e561bd092895a031ae4475f7d1fdc35b1b1832 (patch)
tree8e193d59fa2c01148e625703d65ba0de5c6a4ce8 /src
parenta1e2159b0ff2cb1ecf2c4bc1dc95bf576fda282b (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.cc2
-rw-r--r--src/gpu/shader_composer.cc42
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
}