using Ghost.Core; using Ghost.Graphics.Core; namespace Ghost.Graphics.RHI; // TODO: Add ICommandAllocator support for thread local command buffers. We often use one allocator for multiple command buffers in a single frame. /// /// D3D12-style command buffer interface for recording rendering commands /// public interface ICommandBuffer : IDisposable { /// /// Gets the space of the command buffer. /// CommandBufferType Type { get; } /// /// Indicates whether the command buffer contains any recorded commands. /// bool IsEmpty { get; } string Name { get; set; } /// /// Begins recording commands into this command buffer /// void Begin(ICommandAllocator allocator); /// /// Ends recording commands and prepares for submission /// Result End(); /// /// Sets the viewport for rendering /// /// Viewport to set void SetViewport(ViewportDesc viewport); /// /// Sets the scissor rectangle /// /// Scissor rectangle to set void SetScissorRect(RectDesc rect); /// /// Sets the optional render targets and optional depth Target for subsequent rendering operations. /// /// /// To specify no render targets, provide an empty span for . /// Use for if no depth Target is required. /// /// A read-only span of handles to textures that will be used as render targets. /// The order of handles determines the order in which render targets are bound. /// A handle to the texture to be used as the depth Target. Specify a invalid handle if no depth Target is required. void SetRenderTargets(ReadOnlySpan> renderTargets, Handle depthTarget); /// /// Begins a render pass with the specified render Target /// /// Render Target descriptions /// Depth stencil description /// Whether UAV writes are allowed during the render pass void BeginRenderPass(ReadOnlySpan rtDescs, PassDepthStencilDesc depthDesc, bool allowUAVWrites = false); /// /// Ends the current render pass /// void EndRenderPass(); /// /// Inserts multiple resource barriers for state transitions. /// /// Resource barrier descriptions void ResourceBarrier(ReadOnlySpan barrierDescs); /// /// Inserts a resource barrier for state transitions. /// /// A handle to the GPU resource to transition. /// The current state of the resource before the transition. /// The desired state of the resource after the transition. void ResourceBarrier(Handle resource, ResourceState stateBefore, ResourceState stateAfter); /// /// Inserts a resource barrier for state transitions. The current state is tracked internally. /// /// A handle to the GPU resource to transition. /// The desired state of the resource after the transition. void ResourceBarrier(Handle resource, ResourceState stateAfter); /// /// Sets the pipeline state object /// /// Pipeline state to set void SetPipelineState(Key128 pipelineKey); /// /// Sets the constant buffer view for the specified slot in the graphics pipeline. /// /// The zero-based index of the slot to bind the constant buffer view to. /// A graphics buffer to use as the constant buffer view. void SetConstantBufferView(uint slot, Handle buffer); /// /// Binds a vertex buffer to the specified slot for subsequent draw calls. /// /// The vertex buffer slot to bind to. /// The handle to the graphics buffer containing vertex data. /// The offset in bytes from the start of the buffer. void SetVertexBuffer(uint slot, Handle buffer, ulong offset = 0); /// /// Binds an index buffer for indexed drawing. /// /// The handle to the graphics buffer containing index data. /// The space of indices (e.g., 16-bit or 32-bit). /// The offset in bytes from the start of the buffer. void SetIndexBuffer(Handle buffer, IndexType type, ulong offset = 0); /// /// Sets the primitive topology to be used for subsequent drawing operations. /// /// The primitive topology that determines how the input vertices are interpreted during rendering. void SetPrimitiveTopology(PrimitiveTopology topology); /// /// Sets a 32-bit constant value in the graphics root signature at the specified index. /// /// The zero-based index of the root parameter in the graphics root signature to set the constant for. /// A read-only span containing the 32-bit constant values to set. /// The offset, in 32-bit values, from the start of the root parameter where the constants will be set. void SetGraphicsRoot32Constants(uint rootIndex, ReadOnlySpan constantBuffer, uint offsetIn32Bits = 0); /// /// Issues a non-indexed draw call. /// /// Number of vertices to draw. /// Number of instances to draw. /// Index of the first vertex to draw. /// Index of the first instance to draw. void Draw(uint vertexCount, uint instanceCount = 1, uint startVertex = 0, uint startInstance = 0); /// /// Issues an indexed draw call. /// /// Number of indices to draw. /// Number of instances to draw. /// Index of the first index to draw. /// Value added to each index before indexing the vertex buffer. /// Index of the first instance to draw. void DrawIndexed(uint indexCount, uint instanceCount = 1, uint startIndex = 0, int baseVertex = 0, uint startInstance = 0); /// /// Dispatches compute threads /// /// Thread groups in X dimension /// Thread groups in Y dimension /// Thread groups in Z dimension void DispatchCompute(uint threadGroupCountX, uint threadGroupCountY, uint threadGroupCountZ); /// /// Dispatches mesh shader threads /// /// Thread groups in X dimension /// Thread groups in Y dimension /// Thread groups in Z dimension void DispatchMesh(uint threadGroupCountX, uint threadGroupCountY, uint threadGroupCountZ); /// /// Dispatches ray tracing threads /// // TODO: This method is not supported yet. void DispatchRay(); /// /// Uploads the specified data to the buffer represented by the given handle. /// /// The unmanaged Value space of the elements to upload to the buffer. /// A handle to the buffer that will receive the uploaded data. /// A read-only span containing the data to upload to the buffer. The span must contain elements of space /// . void UploadBuffer(Handle buffer, ReadOnlySpan data) where T : unmanaged; /// /// Uploads texture data to the specified texture resource starting at the given subresource index. /// /// The texture resource to which the subresource data will be uploaded. Must be a valid, initialized texture handle. /// The index of the first subresource in the texture to receive data. Must be less than the total number of subresources in the texture. /// A reference to the structure containing the subresource data to upload. The data must match the Format and layout expected by the texture. /// The number of subresources to upload, starting from . /// Must be greater than zero and not exceed the remaining subresources in the texture. void UploadTexture(Handle texture, ReadOnlySpan subresources); /// /// Copies a specified number of bytes from the source graphics buffer to the destination graphics buffer. /// /// The handle to the destination graphics buffer where data will be written. Cannot be null. /// The handle to the source graphics buffer from which data will be read. Cannot be null. /// The byte offset in the destination buffer at which to begin writing. Must be zero or greater. /// The byte offset in the source buffer at which to begin reading. Must be zero or greater. /// The number of bytes to copy. If zero, copies the remaining bytes from the source buffer starting at . void CopyBuffer(Handle dest, Handle src, ulong destOffset = 0, ulong srcOffset = 0, ulong numBytes = 0); }