using Ghost.Core; using System.Runtime.CompilerServices; namespace Ghost.RenderGraph.Concept; internal enum RenderGraphResourceType : int { Texture, Buffer, // AccelerationStructure, Count } public struct RGResource; public struct RGTexture; public struct RGBuffer; public static class RGResourceExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Identifier AsResource(this Identifier texture) { return new Identifier(texture.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Identifier AsResource(this Identifier buffer) { return new Identifier(buffer.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Identifier AsTexture(this Identifier resource) { return new Identifier(resource.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Identifier AsBuffer(this Identifier resource) { return new Identifier(resource.Value); } } internal readonly struct TextureAccess { public readonly Identifier id; public readonly AccessFlags accessFlags; public TextureAccess(Identifier id, AccessFlags accessFlags) { this.id = id; this.accessFlags = accessFlags; } } /// /// Texture formats supported by the render graph. /// public enum TextureFormat : int { RGBA8, RGBA16F, RGBA32F, Depth32F, Depth24Stencil8 } /// /// Descriptor for creating a texture resource. /// public readonly struct TextureDescriptor : IEquatable { public readonly int width; public readonly int height; public readonly TextureFormat format; public readonly string name; public TextureDescriptor(int width, int height, TextureFormat format, string name) { this.width = width; this.height = height; this.format = format; this.name = name; } public readonly bool Equals(TextureDescriptor other) { return width == other.width && height == other.height && format == other.format && name == other.name; } public override readonly bool Equals(object? obj) => obj is TextureDescriptor other && Equals(other); public override readonly int GetHashCode() => HashCode.Combine(width, height, format, name); public static bool operator ==(TextureDescriptor left, TextureDescriptor right) { return left.Equals(right); } public static bool operator !=(TextureDescriptor left, TextureDescriptor right) { return !(left == right); } } [Flags] public enum BufferUsage { None = 0, Vertex = 1 << 0, Index = 1 << 1, IndirectArgument = 1 << 7, Constant = 1 << 2, ShaderResource = 1 << 3, UnorderedAccess = 1 << 4, Structured = 1 << 5, Raw = 1 << 6, Upload = 1 << 8, Readback = 1 << 9, } public readonly struct BufferDescriptor : IEquatable { public readonly uint sizeInBytes; public readonly uint stride; public readonly BufferUsage usage; public readonly string name; public BufferDescriptor(uint sizeInBytes, uint stride, BufferUsage usage, string name) { this.sizeInBytes = sizeInBytes; this.stride = stride; this.usage = usage; this.name = name; } public readonly bool Equals(BufferDescriptor other) { return sizeInBytes == other.sizeInBytes && stride == other.stride && usage == other.usage && name == other.name; } public override readonly bool Equals(object? obj) => obj is BufferDescriptor other && Equals(other); public override readonly int GetHashCode() => HashCode.Combine(sizeInBytes, name); public static bool operator ==(BufferDescriptor left, BufferDescriptor right) { return left.Equals(right); } public static bool operator !=(BufferDescriptor left, BufferDescriptor right) { return !(left == right); } } /// /// Base interface for pass data that can be stored in the blackboard. /// public interface IPassData { }