DepthStencilCache.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Ryujinx.Graphics.Metal.State;
  2. using SharpMetal.Metal;
  3. using System.Runtime.Versioning;
  4. namespace Ryujinx.Graphics.Metal
  5. {
  6. [SupportedOSPlatform("macos")]
  7. class DepthStencilCache : StateCache<MTLDepthStencilState, DepthStencilUid, DepthStencilUid>
  8. {
  9. private readonly MTLDevice _device;
  10. public DepthStencilCache(MTLDevice device)
  11. {
  12. _device = device;
  13. }
  14. protected override DepthStencilUid GetHash(DepthStencilUid descriptor)
  15. {
  16. return descriptor;
  17. }
  18. protected override MTLDepthStencilState CreateValue(DepthStencilUid descriptor)
  19. {
  20. // Create descriptors
  21. ref StencilUid frontUid = ref descriptor.FrontFace;
  22. using MTLStencilDescriptor frontFaceStencil = new()
  23. {
  24. StencilFailureOperation = frontUid.StencilFailureOperation,
  25. DepthFailureOperation = frontUid.DepthFailureOperation,
  26. DepthStencilPassOperation = frontUid.DepthStencilPassOperation,
  27. StencilCompareFunction = frontUid.StencilCompareFunction,
  28. ReadMask = frontUid.ReadMask,
  29. WriteMask = frontUid.WriteMask
  30. };
  31. ref StencilUid backUid = ref descriptor.BackFace;
  32. using MTLStencilDescriptor backFaceStencil = new()
  33. {
  34. StencilFailureOperation = backUid.StencilFailureOperation,
  35. DepthFailureOperation = backUid.DepthFailureOperation,
  36. DepthStencilPassOperation = backUid.DepthStencilPassOperation,
  37. StencilCompareFunction = backUid.StencilCompareFunction,
  38. ReadMask = backUid.ReadMask,
  39. WriteMask = backUid.WriteMask
  40. };
  41. MTLDepthStencilDescriptor mtlDescriptor = new()
  42. {
  43. DepthCompareFunction = descriptor.DepthCompareFunction,
  44. DepthWriteEnabled = descriptor.DepthWriteEnabled
  45. };
  46. if (descriptor.StencilTestEnabled)
  47. {
  48. mtlDescriptor.BackFaceStencil = backFaceStencil;
  49. mtlDescriptor.FrontFaceStencil = frontFaceStencil;
  50. }
  51. using (mtlDescriptor)
  52. {
  53. return _device.NewDepthStencilState(mtlDescriptor);
  54. }
  55. }
  56. }
  57. }