// Sampler cache - deduplicates WGPUSampler objects across effects // Single entry point: SamplerCache::Get().get_or_create(device, spec) #pragma once #include // Forward declarations (users must include gpu.h) struct WGPUDeviceImpl; typedef struct WGPUDeviceImpl* WGPUDevice; struct WGPUSamplerImpl; typedef struct WGPUSamplerImpl* WGPUSampler; #include "platform/platform.h" struct SamplerSpec { WGPUAddressMode u, v; WGPUFilterMode mag, min; uint16_t anisotropy; bool operator<(const SamplerSpec& o) const { if (u != o.u) return u < o.u; if (v != o.v) return v < o.v; if (mag != o.mag) return mag < o.mag; if (min != o.min) return min < o.min; return anisotropy < o.anisotropy; } }; class SamplerCache { std::map cache_; SamplerCache() = default; public: static SamplerCache& Get() { static SamplerCache instance; return instance; } WGPUSampler get_or_create(WGPUDevice device, const SamplerSpec& spec); void clear(); // Common presets static SamplerSpec linear() { return {WGPUAddressMode_Repeat, WGPUAddressMode_Repeat, WGPUFilterMode_Linear, WGPUFilterMode_Linear, 1}; } static SamplerSpec clamp() { return {WGPUAddressMode_ClampToEdge, WGPUAddressMode_ClampToEdge, WGPUFilterMode_Linear, WGPUFilterMode_Linear, 1}; } };