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); }