Refactor Render Graph: unified resources, benchmarking
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.
This commit is contained in:
@@ -1,30 +1,57 @@
|
||||
using Ghost.Core;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Ghost.RenderGraph.Concept;
|
||||
|
||||
/// <summary>
|
||||
/// Opaque handle to a render graph texture resource.
|
||||
/// </summary>
|
||||
public readonly struct RenderGraphTextureHandle : IEquatable<RenderGraphTextureHandle>
|
||||
internal enum RenderGraphResourceType
|
||||
{
|
||||
public readonly int Index;
|
||||
public readonly int Version;
|
||||
internal readonly string InternalName;
|
||||
Texture,
|
||||
Buffer,
|
||||
AccelerationStructure,
|
||||
Count
|
||||
}
|
||||
|
||||
public RenderGraphTextureHandle(int index, int version, string name = "")
|
||||
public struct RGResource;
|
||||
public struct RGTexture;
|
||||
public struct RGBuffer;
|
||||
|
||||
public static class RGResourceExtensions
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Identifier<RGResource> AsResource(this Identifier<RGTexture> texture)
|
||||
{
|
||||
Index = index;
|
||||
Version = version;
|
||||
InternalName = name;
|
||||
return new Identifier<RGResource>(texture.Value);
|
||||
}
|
||||
|
||||
public string Name => InternalName;
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Identifier<RGResource> AsResource(this Identifier<RGBuffer> buffer)
|
||||
{
|
||||
return new Identifier<RGResource>(buffer.Value);
|
||||
}
|
||||
|
||||
public bool IsValid() => Index >= 0;
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
internal static Identifier<RGTexture> AsTexture(this Identifier<RGResource> resource)
|
||||
{
|
||||
return new Identifier<RGTexture>(resource.Value);
|
||||
}
|
||||
|
||||
public readonly bool Equals(RenderGraphTextureHandle other) => Index == other.Index && Version == other.Version;
|
||||
public override readonly bool Equals(object? obj) => obj is RenderGraphTextureHandle other && Equals(other);
|
||||
public override readonly int GetHashCode() => HashCode.Combine(Index, Version);
|
||||
public static bool operator ==(RenderGraphTextureHandle left, RenderGraphTextureHandle right) => left.Equals(right);
|
||||
public static bool operator !=(RenderGraphTextureHandle left, RenderGraphTextureHandle right) => !left.Equals(right);
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
internal static Identifier<RGBuffer> AsBuffer(this Identifier<RGResource> resource)
|
||||
{
|
||||
return new Identifier<RGBuffer>(resource.Value);
|
||||
}
|
||||
}
|
||||
|
||||
internal readonly struct TextureAccess
|
||||
{
|
||||
public readonly Identifier<RGTexture> id;
|
||||
public readonly AccessFlags accessFlags;
|
||||
|
||||
public TextureAccess(Identifier<RGTexture> id, AccessFlags accessFlags)
|
||||
{
|
||||
this.id = id;
|
||||
this.accessFlags = accessFlags;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user