Logic Operations
This commit is contained in:
parent
e928ec9708
commit
8a579b64be
5 changed files with 42 additions and 9 deletions
|
@ -38,7 +38,7 @@
|
||||||
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
||||||
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
||||||
<PackageVersion Include="shaderc.net" Version="0.1.0" />
|
<PackageVersion Include="shaderc.net" Version="0.1.0" />
|
||||||
<PackageVersion Include="SharpMetal" Version="1.0.0-preview18" />
|
<PackageVersion Include="SharpMetal" Version="1.0.0-preview20" />
|
||||||
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
||||||
<PackageVersion Include="Silk.NET.Vulkan" Version="2.21.0" />
|
<PackageVersion Include="Silk.NET.Vulkan" Version="2.21.0" />
|
||||||
<PackageVersion Include="Silk.NET.Vulkan.Extensions.EXT" Version="2.21.0" />
|
<PackageVersion Include="Silk.NET.Vulkan.Extensions.EXT" Version="2.21.0" />
|
||||||
|
|
|
@ -663,6 +663,14 @@ namespace Ryujinx.Graphics.Metal
|
||||||
SignalDirty(DirtyFlags.DepthBias);
|
SignalDirty(DirtyFlags.DepthBias);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readonly void UpdateLogicOpState(bool enable, LogicalOp op)
|
||||||
|
{
|
||||||
|
_currentState.Pipeline.LogicOpEnable = enable;
|
||||||
|
_currentState.Pipeline.LogicOp = op.Convert();
|
||||||
|
|
||||||
|
SignalDirty(DirtyFlags.RenderPipeline);
|
||||||
|
}
|
||||||
|
|
||||||
public readonly void UpdateMultisampleState(MultisampleDescriptor multisample)
|
public readonly void UpdateMultisampleState(MultisampleDescriptor multisample)
|
||||||
{
|
{
|
||||||
_currentState.Pipeline.AlphaToCoverageEnable = multisample.AlphaToCoverageEnable;
|
_currentState.Pipeline.AlphaToCoverageEnable = multisample.AlphaToCoverageEnable;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using SharpMetal.Metal;
|
using SharpMetal.Metal;
|
||||||
|
using System;
|
||||||
using System.Runtime.Versioning;
|
using System.Runtime.Versioning;
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Metal
|
namespace Ryujinx.Graphics.Metal
|
||||||
|
@ -112,6 +113,30 @@ namespace Ryujinx.Graphics.Metal
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MTLLogicOperation Convert(this LogicalOp op)
|
||||||
|
{
|
||||||
|
return op switch
|
||||||
|
{
|
||||||
|
LogicalOp.Clear => MTLLogicOperation.Clear,
|
||||||
|
LogicalOp.And => MTLLogicOperation.And,
|
||||||
|
LogicalOp.AndReverse => MTLLogicOperation.AndReverse,
|
||||||
|
LogicalOp.Copy => MTLLogicOperation.Copy,
|
||||||
|
LogicalOp.AndInverted => MTLLogicOperation.AndInverted,
|
||||||
|
LogicalOp.Noop => MTLLogicOperation.Noop,
|
||||||
|
LogicalOp.Xor => MTLLogicOperation.Xor,
|
||||||
|
LogicalOp.Or => MTLLogicOperation.Or,
|
||||||
|
LogicalOp.Nor => MTLLogicOperation.Nor,
|
||||||
|
LogicalOp.Equiv => MTLLogicOperation.Equivalence,
|
||||||
|
LogicalOp.Invert => MTLLogicOperation.Invert,
|
||||||
|
LogicalOp.OrReverse => MTLLogicOperation.OrReverse,
|
||||||
|
LogicalOp.CopyInverted => MTLLogicOperation.CopyInverted,
|
||||||
|
LogicalOp.OrInverted => MTLLogicOperation.OrInverted,
|
||||||
|
LogicalOp.Nand => MTLLogicOperation.Nand,
|
||||||
|
LogicalOp.Set => MTLLogicOperation.Set,
|
||||||
|
_ => LogInvalidAndReturn(op, nameof(LogicalOp), MTLLogicOperation.And)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public static MTLSamplerMinMagFilter Convert(this MagFilter filter)
|
public static MTLSamplerMinMagFilter Convert(this MagFilter filter)
|
||||||
{
|
{
|
||||||
return filter switch
|
return filter switch
|
||||||
|
|
|
@ -669,7 +669,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
|
|
||||||
public void SetLogicOpState(bool enable, LogicalOp op)
|
public void SetLogicOpState(bool enable, LogicalOp op)
|
||||||
{
|
{
|
||||||
// Metal does not support logic operations.
|
_encoderStateManager.UpdateLogicOpState(enable, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetMultisampleState(MultisampleDescriptor multisample)
|
public void SetMultisampleState(MultisampleDescriptor multisample)
|
||||||
|
|
|
@ -45,10 +45,9 @@ namespace Ryujinx.Graphics.Metal
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Reserved for when API is available.
|
public MTLLogicOperation LogicOp
|
||||||
public int LogicOp
|
|
||||||
{
|
{
|
||||||
readonly get => (int)((Internal.Id0 >> 32) & 0xF);
|
readonly get => (MTLLogicOperation)((Internal.Id0 >> 32) & 0xF);
|
||||||
set => Internal.Id0 = (Internal.Id0 & 0xFFFFFFF0FFFFFFFF) | ((ulong)value << 32);
|
set => Internal.Id0 = (Internal.Id0 & 0xFFFFFFF0FFFFFFFF) | ((ulong)value << 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +64,6 @@ namespace Ryujinx.Graphics.Metal
|
||||||
set => Internal.Id0 = (Internal.Id0 & 0xFFFFFFDFFFFFFFFF) | ((value ? 1UL : 0UL) << 37);
|
set => Internal.Id0 = (Internal.Id0 & 0xFFFFFFDFFFFFFFFF) | ((value ? 1UL : 0UL) << 37);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reserved for when API is available.
|
|
||||||
public bool LogicOpEnable
|
public bool LogicOpEnable
|
||||||
{
|
{
|
||||||
readonly get => ((Internal.Id0 >> 38) & 0x1) != 0UL;
|
readonly get => ((Internal.Id0 >> 38) & 0x1) != 0UL;
|
||||||
|
@ -208,9 +206,11 @@ namespace Ryujinx.Graphics.Metal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPipelineDescriptor.SetAlphaToCoverageEnabled(AlphaToCoverageEnable);
|
renderPipelineDescriptor.LogicOperationEnabled = LogicOpEnable;
|
||||||
renderPipelineDescriptor.SetAlphaToOneEnabled(AlphaToOneEnable);
|
renderPipelineDescriptor.LogicOperation = LogicOp;
|
||||||
renderPipelineDescriptor.SetRasterizationEnabled(!RasterizerDiscardEnable);
|
renderPipelineDescriptor.AlphaToCoverageEnabled = AlphaToCoverageEnable;
|
||||||
|
renderPipelineDescriptor.AlphaToOneEnabled = AlphaToOneEnable;
|
||||||
|
renderPipelineDescriptor.RasterizationEnabled = !RasterizerDiscardEnable;
|
||||||
renderPipelineDescriptor.SampleCount = Math.Max(1, SamplesCount);
|
renderPipelineDescriptor.SampleCount = Math.Max(1, SamplesCount);
|
||||||
|
|
||||||
var vertexDescriptor = BuildVertexDescriptor();
|
var vertexDescriptor = BuildVertexDescriptor();
|
||||||
|
|
Loading…
Reference in a new issue