using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Profiling; namespace Unity.Barracuda { /// /// Stores compute kernel cache for GPU pixel shader backends /// public sealed class PixelShaderSingleton { /// /// Enable kernel usage tracking /// public bool EnableDebug = false; private static readonly PixelShaderSingleton instance = new PixelShaderSingleton(); // Maps shader name -> Shader private Dictionary m_shaderNameToPixelShader = new Dictionary(); private HashSet m_usedShaders = new HashSet(); internal Shader FindShader(string kernelName) { if (EnableDebug) m_usedShaders.Add(kernelName); if (!m_shaderNameToPixelShader.ContainsKey(kernelName)) { Profiler.BeginSample(kernelName); m_shaderNameToPixelShader[kernelName] = Shader.Find(kernelName); Profiler.EndSample(); } return m_shaderNameToPixelShader[kernelName]; } /// /// Warmup pixel shaders /// /// list of shaders to warm up /// IEnumerator public IEnumerator WarmupPixelShaderKernels(List shaders) { foreach (var shader in shaders) { if (!m_shaderNameToPixelShader.ContainsKey(shader)) { FindShader(shader); yield return null; } } yield break; } /// /// Get used pixel shader list /// /// list of kernels public List GetUsedPixelShaders() { if (!EnableDebug) { D.LogWarning("List of used pixel shaders was requested while PixelShaderSingleton.EnableDebug == false"); return null; } return m_usedShaders.ToList(); } /// /// Singleton /// public static PixelShaderSingleton Instance { get { return instance; } } } }