#include "shader_manager.hpp" #include #include #include namespace fs = std::filesystem; void ShaderManager::scan(const std::string& root_dir) { root_dir_ = root_dir; names_.clear(); dirs_.clear(); std::error_code ec; for (const auto& entry : fs::directory_iterator(root_dir, ec)) { if (!entry.is_directory()) continue; fs::path ini = entry.path() / "preset.ini"; if (!fs::exists(ini)) continue; std::string preset_name = entry.path().filename().string(); names_.push_back(preset_name); dirs_[preset_name] = entry.path().string(); } if (ec) { SDL_Log("ShaderManager: scan error on %s: %s", root_dir.c_str(), ec.message().c_str()); } std::sort(names_.begin(), names_.end()); SDL_Log("ShaderManager: found %d preset(s) in %s", (int)names_.size(), root_dir.c_str()); } GpuShaderPreset* ShaderManager::load(SDL_GPUDevice* device, const std::string& name, SDL_GPUTextureFormat swapchain_fmt, int w, int h) { auto it = loaded_.find(name); if (it != loaded_.end()) return it->second.get(); auto dir_it = dirs_.find(name); if (dir_it == dirs_.end()) { SDL_Log("ShaderManager: preset '%s' not found", name.c_str()); return nullptr; } auto preset = std::make_unique(); if (!preset->load(device, dir_it->second, swapchain_fmt, w, h)) { SDL_Log("ShaderManager: failed to load preset '%s'", name.c_str()); return nullptr; } GpuShaderPreset* raw = preset.get(); loaded_[name] = std::move(preset); return raw; } void ShaderManager::onResize(SDL_GPUDevice* device, SDL_GPUTextureFormat /*swapchain_fmt*/, int w, int h) { for (auto& [name, preset] : loaded_) { preset->recreateTargets(device, w, h); } } void ShaderManager::destroyAll(SDL_GPUDevice* device) { for (auto& [name, preset] : loaded_) { preset->destroy(device); } loaded_.clear(); }