using Ryujinx.Common.Memory; using System; namespace Ryujinx.Graphics.GAL { /// /// Descriptor for a pipeline buffer binding. /// public readonly struct BufferPipelineDescriptor { public bool Enable { get; } public int Stride { get; } public int Divisor { get; } public BufferPipelineDescriptor(bool enable, int stride, int divisor) { Enable = enable; Stride = stride; Divisor = divisor; } } /// /// State required for a program to compile shaders. /// public struct ProgramPipelineState { // Some state is considered always dynamic and should not be included: // - Viewports/Scissors // - Bias values (not enable) public int SamplesCount; public Array8 AttachmentEnable; public Array8 AttachmentFormats; public bool DepthStencilEnable; public Format DepthStencilFormat; public bool LogicOpEnable; public LogicalOp LogicOp; public Array8 BlendDescriptors; public Array8 ColorWriteMask; public int VertexAttribCount; public Array32 VertexAttribs; public int VertexBufferCount; public Array32 VertexBuffers; // TODO: Min/max depth bounds. public DepthTestDescriptor DepthTest; public StencilTestDescriptor StencilTest; public FrontFace FrontFace; public Face CullMode; public bool CullEnable; public PolygonModeMask BiasEnable; public float LineWidth; // TODO: Polygon mode. public bool DepthClampEnable; public bool RasterizerDiscard; public PrimitiveTopology Topology; public bool PrimitiveRestartEnable; public uint PatchControlPoints; public void SetVertexAttribs(ReadOnlySpan vertexAttribs) { VertexAttribCount = vertexAttribs.Length; vertexAttribs.CopyTo(VertexAttribs.AsSpan()); } public void SetLogicOpState(bool enable, LogicalOp op) { LogicOp = op; LogicOpEnable = enable; } } }