using Ghost.Core;
using Ghost.Graphics.Core;
namespace Ghost.Graphics.RHI;
///
/// D3D12-style command buffer interface for recording rendering commands
///
public interface ICommandBuffer : IDisposable
{
///
/// Gets the type 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();
///
/// Ends recording commands and prepares for submission
///
void 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 a resource barrier for state transitions
///
/// Resource to transition
/// Current resource state
/// Target resource state
void ResourceBarrier(Handle resource, ResourceState before, ResourceState after);
///
/// Sets the pipeline state object
///
/// Pipeline state to set
void SetPipelineState(GraphicsPipelineKey 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 type 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);
///
/// 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 type 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 type
/// .
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, params 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);
}