using Ghost.Graphics.Data; using Win32.Graphics.Direct3D12; namespace Ghost.Graphics.RenderGraphModule; /// /// Context passed to render pass execution functions /// public readonly struct RenderPassContext { internal readonly int PassIndex; // TODO: Add command list and other rendering context when available internal RenderPassContext(int passIndex) { PassIndex = passIndex; } } /// /// Builder for configuring render pass resource dependencies /// public sealed class RenderPassBuilder { private readonly RenderGraph _renderGraph; private readonly int _passIndex; private readonly List _resourceAccesses; internal RenderPassBuilder(RenderGraph renderGraph, int passIndex) { _renderGraph = renderGraph; _passIndex = passIndex; _resourceAccesses = new List(); } internal IReadOnlyList ResourceAccesses => _resourceAccesses; /// /// Declare a texture read dependency /// public RGTextureHandle ReadTexture(RGTextureHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid texture handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.Read, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Declare a texture write dependency /// public RGTextureHandle WriteTexture(RGTextureHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid texture handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.Write, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Declare a texture read-write dependency /// public RGTextureHandle ReadWriteTexture(RGTextureHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid texture handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.ReadWrite, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Declare a buffer read dependency /// public RGBufferHandle ReadBuffer(RGBufferHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid buffer handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.Read, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Declare a buffer write dependency /// public RGBufferHandle WriteBuffer(RGBufferHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid buffer handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.Write, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Declare a buffer read-write dependency /// public RGBufferHandle ReadWriteBuffer(RGBufferHandle handle) { if (!handle.IsValid) throw new ArgumentException("Invalid buffer handle", nameof(handle)); _resourceAccesses.Add(new ResourceAccess(handle._resourceId, ResourceAccessType.ReadWrite, _passIndex)); _renderGraph.UpdateResourceLifetime(handle._resourceId, _passIndex); return handle; } /// /// Create a new transient texture within this pass /// public RGTextureHandle CreateTexture(string name, TextureDescription description) { return _renderGraph.CreateTexture(name, ResourceLifetime.Transient, description); } /// /// Create a new transient buffer within this pass /// public RGBufferHandle CreateBuffer(string name, BufferDescription description) { return _renderGraph.CreateBuffer(name, ResourceLifetime.Transient, description); } }