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; }
}
}
}