Refactor Cull Mode to only send face.
This commit is contained in:
parent
2fd093d4b4
commit
5a391f38fd
11 changed files with 27 additions and 18 deletions
|
@ -2,6 +2,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
{
|
{
|
||||||
public enum Face
|
public enum Face
|
||||||
{
|
{
|
||||||
|
None = 0,
|
||||||
Front = 0x404,
|
Front = 0x404,
|
||||||
Back = 0x405,
|
Back = 0x405,
|
||||||
FrontAndBack = 0x408,
|
FrontAndBack = 0x408,
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
void SetDepthMode(DepthMode mode);
|
void SetDepthMode(DepthMode mode);
|
||||||
void SetDepthTest(DepthTestDescriptor depthTest);
|
void SetDepthTest(DepthTestDescriptor depthTest);
|
||||||
|
|
||||||
void SetFaceCulling(bool enable, Face face);
|
void SetFaceCulling(Face face);
|
||||||
|
|
||||||
void SetFrontFace(FrontFace frontFace);
|
void SetFrontFace(FrontFace frontFace);
|
||||||
|
|
||||||
|
|
|
@ -3,18 +3,16 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands
|
||||||
struct SetFaceCullingCommand : IGALCommand, IGALCommand<SetFaceCullingCommand>
|
struct SetFaceCullingCommand : IGALCommand, IGALCommand<SetFaceCullingCommand>
|
||||||
{
|
{
|
||||||
public readonly CommandType CommandType => CommandType.SetFaceCulling;
|
public readonly CommandType CommandType => CommandType.SetFaceCulling;
|
||||||
private bool _enable;
|
|
||||||
private Face _face;
|
private Face _face;
|
||||||
|
|
||||||
public void Set(bool enable, Face face)
|
public void Set(Face face)
|
||||||
{
|
{
|
||||||
_enable = enable;
|
|
||||||
_face = face;
|
_face = face;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Run(ref SetFaceCullingCommand command, ThreadedRenderer threaded, IRenderer renderer)
|
public static void Run(ref SetFaceCullingCommand command, ThreadedRenderer threaded, IRenderer renderer)
|
||||||
{
|
{
|
||||||
renderer.Pipeline.SetFaceCulling(command._enable, command._face);
|
renderer.Pipeline.SetFaceCulling(command._face);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,9 +165,9 @@ namespace Ryujinx.Graphics.GAL.Multithreading
|
||||||
_renderer.QueueCommand();
|
_renderer.QueueCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetFaceCulling(bool enable, Face face)
|
public void SetFaceCulling(Face face)
|
||||||
{
|
{
|
||||||
_renderer.New<SetFaceCullingCommand>().Set(enable, face);
|
_renderer.New<SetFaceCullingCommand>().Set(face);
|
||||||
_renderer.QueueCommand();
|
_renderer.QueueCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,6 @@ namespace Ryujinx.Graphics.GAL
|
||||||
public StencilTestDescriptor StencilTest;
|
public StencilTestDescriptor StencilTest;
|
||||||
public FrontFace FrontFace;
|
public FrontFace FrontFace;
|
||||||
public Face CullMode;
|
public Face CullMode;
|
||||||
public bool CullEnable;
|
|
||||||
|
|
||||||
public PolygonModeMask BiasEnable;
|
public PolygonModeMask BiasEnable;
|
||||||
|
|
||||||
|
|
|
@ -1198,9 +1198,16 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||||
var yControl = _state.State.YControl;
|
var yControl = _state.State.YControl;
|
||||||
var face = _state.State.FaceState;
|
var face = _state.State.FaceState;
|
||||||
|
|
||||||
_pipeline.CullEnable = face.CullEnable;
|
if (face.CullEnable)
|
||||||
|
{
|
||||||
_pipeline.CullMode = face.CullFace;
|
_pipeline.CullMode = face.CullFace;
|
||||||
_context.Renderer.Pipeline.SetFaceCulling(face.CullEnable, face.CullFace);
|
_context.Renderer.Pipeline.SetFaceCulling(face.CullFace);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_pipeline.CullMode = Face.None;
|
||||||
|
_context.Renderer.Pipeline.SetFaceCulling(Face.None);
|
||||||
|
}
|
||||||
|
|
||||||
UpdateFrontFace(yControl, face.FrontFace);
|
UpdateFrontFace(yControl, face.FrontFace);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ using OpenTK.Graphics.OpenGL;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using Ryujinx.Graphics.Shader;
|
using Ryujinx.Graphics.Shader;
|
||||||
|
using GL = OpenTK.Graphics.ES11.GL;
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.OpenGL
|
namespace Ryujinx.Graphics.OpenGL
|
||||||
{
|
{
|
||||||
|
@ -334,6 +335,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
return CullFaceMode.Front;
|
return CullFaceMode.Front;
|
||||||
case Face.FrontAndBack:
|
case Face.FrontAndBack:
|
||||||
return CullFaceMode.FrontAndBack;
|
return CullFaceMode.FrontAndBack;
|
||||||
|
case Face.None:
|
||||||
|
return (CullFaceMode)All.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Face)} enum value: {face}.");
|
Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Face)} enum value: {face}.");
|
||||||
|
|
|
@ -915,11 +915,11 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
_depthTestEnable = depthTest.TestEnable;
|
_depthTestEnable = depthTest.TestEnable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetFaceCulling(bool enable, Face face)
|
public void SetFaceCulling(Face face)
|
||||||
{
|
{
|
||||||
_cullEnable = enable;
|
_cullEnable = face != Face.None;
|
||||||
|
|
||||||
if (!enable)
|
if (!_cullEnable)
|
||||||
{
|
{
|
||||||
GL.Disable(EnableCap.CullFace);
|
GL.Disable(EnableCap.CullFace);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -238,6 +238,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
Face.Back => CullModeFlags.BackBit,
|
Face.Back => CullModeFlags.BackBit,
|
||||||
Face.Front => CullModeFlags.FrontBit,
|
Face.Front => CullModeFlags.FrontBit,
|
||||||
Face.FrontAndBack => CullModeFlags.FrontAndBack,
|
Face.FrontAndBack => CullModeFlags.FrontAndBack,
|
||||||
|
Face.None => CullModeFlags.None,
|
||||||
_ => LogInvalidAndReturn(face, nameof(Face), CullModeFlags.BackBit),
|
_ => LogInvalidAndReturn(face, nameof(Face), CullModeFlags.BackBit),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -908,15 +908,15 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
UpdatePassDepthStencil();
|
UpdatePassDepthStencil();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetFaceCulling(bool enable, Face face)
|
public void SetFaceCulling(Face face)
|
||||||
{
|
{
|
||||||
if (_supportExtDynamic)
|
if (_supportExtDynamic)
|
||||||
{
|
{
|
||||||
DynamicState.SetCullMode(enable ? face.Convert() : CullModeFlags.None);
|
DynamicState.SetCullMode(face.Convert());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_newState.CullMode = enable ? face.Convert() : CullModeFlags.None;
|
_newState.CullMode = face.Convert();
|
||||||
|
|
||||||
SignalStateChange();
|
SignalStateChange();
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
if (!extendedDynamicState)
|
if (!extendedDynamicState)
|
||||||
{
|
{
|
||||||
pipeline.DepthCompareOp = state.DepthTest.Func.Convert();
|
pipeline.DepthCompareOp = state.DepthTest.Func.Convert();
|
||||||
pipeline.CullMode = state.CullEnable ? state.CullMode.Convert() : CullModeFlags.None;
|
pipeline.CullMode = state.CullMode.Convert();
|
||||||
|
|
||||||
pipeline.DepthTestEnable = state.DepthTest.TestEnable;
|
pipeline.DepthTestEnable = state.DepthTest.TestEnable;
|
||||||
pipeline.DepthWriteEnable = state.DepthTest.WriteEnable;
|
pipeline.DepthWriteEnable = state.DepthTest.WriteEnable;
|
||||||
|
|
Loading…
Reference in a new issue