diff options
Diffstat (limited to 'src/gpu/sampler_cache.h')
| -rw-r--r-- | src/gpu/sampler_cache.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/gpu/sampler_cache.h b/src/gpu/sampler_cache.h new file mode 100644 index 0000000..0f012a8 --- /dev/null +++ b/src/gpu/sampler_cache.h @@ -0,0 +1,61 @@ +// Sampler cache - deduplicates samplers across effects +#pragma once +#include <map> + +// 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<SamplerSpec, WGPUSampler> cache_; + SamplerCache() = default; + +public: + static SamplerCache& Get() { + static SamplerCache instance; + return instance; + } + + WGPUSampler get_or_create(WGPUDevice device, const SamplerSpec& spec) { + auto it = cache_.find(spec); + if (it != cache_.end()) return it->second; + + WGPUSamplerDescriptor desc{}; + desc.addressModeU = spec.u; + desc.addressModeV = spec.v; + desc.magFilter = spec.mag; + desc.minFilter = spec.min; + desc.maxAnisotropy = spec.anisotropy; + WGPUSampler sampler = wgpuDeviceCreateSampler(device, &desc); + cache_[spec] = sampler; + return sampler; + } + + // 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}; + } +}; |
