Files
GhostEngine/Ghost.Shader.Concept/GlobalKeywordState.cs
Misaki f988c34b3d Add high-performance material/shader system (Ghost.Shader.Concept)
Introduces a new Ghost.Shader.Concept project implementing a modern, data-oriented material and shader system with:
- Global/local keyword bitsets (fast O(1) ops, 64 bytes)
- Multi-pass shader program and per-pass render state overrides
- Thread-safe, 16-byte aligned material property blocks
- Material pooling to reduce GC pressure
- Batch renderer for efficient PSO grouping and async variant warmup
- Full demo (Program.cs) and extensive documentation (ARCHITECTURE.md, README.md, PROJECT_SUMMARY.md)
- Minor integration: new enums, doc updates, and keyword handling in existing code

No breaking changes to the existing engine; all new code is isolated. This serves as a reference implementation for high-performance, extensible material/shader architectures.
2025-12-26 19:19:30 +09:00

72 lines
1.7 KiB
C#

namespace Ghost.Shader.Concept;
/// <summary>
/// Global keyword state manager. Singleton pattern for engine-wide keywords.
/// Keywords like platform settings, quality levels, etc.
/// </summary>
public sealed class GlobalKeywordState
{
private static readonly Lazy<GlobalKeywordState> _instance = new(() => new GlobalKeywordState());
public static GlobalKeywordState Instance => _instance.Value;
private KeywordSet _keywords;
private readonly object _lock = new();
private int _version = 0;
public int Version => _version;
private GlobalKeywordState()
{
_keywords = new KeywordSet();
}
public void EnableKeyword(ShaderKeyword keyword)
{
if (keyword.Scope != KeywordScope.Global)
throw new ArgumentException("Only global keywords can be set", nameof(keyword));
lock (_lock)
{
_keywords.Enable(keyword);
_version++;
}
}
public void DisableKeyword(ShaderKeyword keyword)
{
if (keyword.Scope != KeywordScope.Global)
throw new ArgumentException("Only global keywords can be set", nameof(keyword));
lock (_lock)
{
_keywords.Disable(keyword);
_version++;
}
}
public bool IsKeywordEnabled(ShaderKeyword keyword)
{
lock (_lock)
{
return _keywords.IsEnabled(keyword);
}
}
public KeywordSet GetKeywordSet()
{
lock (_lock)
{
return _keywords; // struct copy
}
}
public void Clear()
{
lock (_lock)
{
_keywords.Clear();
_version++;
}
}
}