forked from Misaki/GhostEngine
Major overhaul of Render Graph system: - Replaced texture handles with generic Identifier<T> for unified, type-safe resource management (textures, buffers, etc.) - Refactored resource registry and pooling for performance and extensibility - Added AccessFlags and TextureAccess for precise resource usage tracking - Split passes into Raster and Compute types; introduced builder interfaces for safer pass construction - Modernized pass setup API (SetColorAttachment, UseTexture, etc.) - Updated command buffer and context structs to use new resource system - Refactored barrier and aliasing logic for improved correctness - Integrated BenchmarkDotNet for performance/memory benchmarking - Improved blackboard type safety and removed obsolete code/extensions - Added BenchmarkDotNet NuGet package These changes make the Render Graph more extensible, efficient, and ready for future resource types and advanced features.
63 lines
1.5 KiB
C#
63 lines
1.5 KiB
C#
namespace Ghost.RenderGraph.Concept;
|
|
|
|
/// <summary>
|
|
/// Blackboard for sharing data between render passes.
|
|
/// Uses a dictionary with type keys to store different pass data types.
|
|
/// Avoids allocations by reusing the same dictionary across frames.
|
|
/// </summary>
|
|
public sealed class RenderGraphBlackboard
|
|
{
|
|
private readonly Dictionary<Type, IPassData> _data = new(16);
|
|
|
|
/// <summary>
|
|
/// Adds or updates pass data in the blackboard.
|
|
/// </summary>
|
|
public void Add<T>(T data)
|
|
where T : class, IPassData
|
|
{
|
|
var type = typeof(T);
|
|
_data[type] = data;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Retrieves pass data from the blackboard.
|
|
/// </summary>
|
|
public T Get<T>()
|
|
where T : class, IPassData
|
|
{
|
|
var type = typeof(T);
|
|
if (_data.TryGetValue(type, out var obj))
|
|
{
|
|
return (T)obj;
|
|
}
|
|
|
|
throw new KeyNotFoundException($"Pass data of type {type.Name} not found in blackboard");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get pass data from the blackboard.
|
|
/// </summary>
|
|
public bool TryGet<T>(out T? data)
|
|
where T : class, IPassData
|
|
{
|
|
var type = typeof(T);
|
|
if (_data.TryGetValue(type, out var obj))
|
|
{
|
|
data = (T)obj;
|
|
return true;
|
|
}
|
|
|
|
data = null;
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clears all data from the blackboard.
|
|
/// Does not deallocate the backing dictionary to avoid allocations.
|
|
/// </summary>
|
|
public void Clear()
|
|
{
|
|
_data.Clear();
|
|
}
|
|
}
|