using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using SharpMetal.Foundation; using SharpMetal.Metal; using System; using System.Collections.Generic; using System.Runtime.Versioning; namespace Ryujinx.Graphics.Metal { [SupportedOSPlatform("macos")] public struct DepthStencilHash { public struct StencilHash { public MTLStencilOperation StencilFailureOperation; public MTLStencilOperation DepthFailureOperation; public MTLStencilOperation DepthStencilPassOperation; public MTLCompareFunction StencilCompareFunction; public uint ReadMask; public uint WriteMask; } public StencilHash FrontFace; public StencilHash BackFace; public MTLCompareFunction DepthCompareFunction; public bool DepthWriteEnabled; } [SupportedOSPlatform("macos")] public class DepthStencilCache : StateCache { private readonly MTLDevice _device; public DepthStencilCache(MTLDevice device) { _device = device; } protected override DepthStencilHash GetHash(MTLDepthStencilDescriptor descriptor) { var hash = new DepthStencilHash(); // Front face hash.FrontFace = new DepthStencilHash.StencilHash { StencilFailureOperation = descriptor.FrontFaceStencil.StencilFailureOperation, DepthFailureOperation = descriptor.FrontFaceStencil.DepthFailureOperation, DepthStencilPassOperation = descriptor.FrontFaceStencil.DepthStencilPassOperation, StencilCompareFunction = descriptor.FrontFaceStencil.StencilCompareFunction, ReadMask = descriptor.FrontFaceStencil.ReadMask, WriteMask = descriptor.FrontFaceStencil.WriteMask }; // Back face hash.BackFace = new DepthStencilHash.StencilHash { StencilFailureOperation = descriptor.BackFaceStencil.StencilFailureOperation, DepthFailureOperation = descriptor.BackFaceStencil.DepthFailureOperation, DepthStencilPassOperation = descriptor.BackFaceStencil.DepthStencilPassOperation, StencilCompareFunction = descriptor.BackFaceStencil.StencilCompareFunction, ReadMask = descriptor.BackFaceStencil.ReadMask, WriteMask = descriptor.BackFaceStencil.WriteMask }; // Depth hash.DepthCompareFunction = descriptor.DepthCompareFunction; hash.DepthWriteEnabled = descriptor.DepthWriteEnabled; return hash; } protected override MTLDepthStencilState CreateValue(MTLDepthStencilDescriptor descriptor) { return _device.NewDepthStencilState(descriptor); } } }