From 75bdd2f8c17169422d175ed2d9dfceb9acb0fe77 Mon Sep 17 00:00:00 2001 From: skal Date: Fri, 6 Feb 2026 02:14:30 +0100 Subject: refactor(gpu): Implement compile-time BVH toggle via shader composition Completed Task #18-B optimization and refactoring. - Replaced runtime branching in shader with compile-time snippet substitution in ShaderComposer. - Added 'scene_query_bvh.wgsl' and 'scene_query_linear.wgsl' as distinct snippets. - Refactored Renderer3D to manage two separate pipelines (with and without BVH). - Updated ShaderComposer to support snippet substitution during composition. - Verified both paths with test_3d_render (default and --no-bvh). - Removed temporary shader hacks and cleaned up renderer_3d.wgsl. --- src/gpu/effects/shader_composer.cc | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/gpu/effects/shader_composer.cc') diff --git a/src/gpu/effects/shader_composer.cc b/src/gpu/effects/shader_composer.cc index 8d66ad7..055b996 100644 --- a/src/gpu/effects/shader_composer.cc +++ b/src/gpu/effects/shader_composer.cc @@ -17,7 +17,8 @@ void ShaderComposer::RegisterSnippet(const std::string& name, void ShaderComposer::ResolveRecursive(const std::string& source, std::stringstream& ss, - std::set& included) { + std::set& included, + const CompositionMap& substitutions) { std::istringstream stream(source); std::string line; while (std::getline(stream, line)) { @@ -27,12 +28,19 @@ void ShaderComposer::ResolveRecursive(const std::string& source, size_t end = line.find('"', start + 1); if (start != std::string::npos && end != std::string::npos) { std::string name = line.substr(start + 1, end - start - 1); + + // Apply substitution if available + auto sub_it = substitutions.find(name); + if (sub_it != substitutions.end()) { + name = sub_it->second; + } + if (included.find(name) == included.end()) { included.insert(name); auto it = snippets_.find(name); if (it != snippets_.end()) { ss << "// --- Included: " << name << " ---\n"; - ResolveRecursive(it->second, ss, included); + ResolveRecursive(it->second, ss, included, substitutions); ss << "// --- End Include: " << name << " ---\n"; } else { ss << "// ERROR: Snippet not found: " << name << "\n"; @@ -47,7 +55,8 @@ void ShaderComposer::ResolveRecursive(const std::string& source, std::string ShaderComposer::Compose(const std::vector& dependencies, - const std::string& main_code) { + const std::string& main_code, + const CompositionMap& substitutions) { std::stringstream ss; ss << "// Generated by ShaderComposer\n\n"; @@ -55,19 +64,25 @@ ShaderComposer::Compose(const std::vector& dependencies, // Process explicit dependencies first for (const auto& dep : dependencies) { - if (included.find(dep) == included.end()) { - included.insert(dep); - auto it = snippets_.find(dep); + std::string name = dep; + auto sub_it = substitutions.find(name); + if (sub_it != substitutions.end()) { + name = sub_it->second; + } + + if (included.find(name) == included.end()) { + included.insert(name); + auto it = snippets_.find(name); if (it != snippets_.end()) { - ss << "// --- Dependency: " << dep << " ---\n"; - ResolveRecursive(it->second, ss, included); + ss << "// --- Dependency: " << name << " ---\n"; + ResolveRecursive(it->second, ss, included, substitutions); ss << "\n"; } } } ss << "// --- Main Code ---\n"; - ResolveRecursive(main_code, ss, included); + ResolveRecursive(main_code, ss, included, substitutions); return ss.str(); } -- cgit v1.2.3