forked from Misaki/GhostEngine
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.
This commit is contained in:
71
Ghost.Shader.Concept/GlobalKeywordState.cs
Normal file
71
Ghost.Shader.Concept/GlobalKeywordState.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user