Refactor Cull Mode to only send face.

This commit is contained in:
sunshineinabox 2024-09-09 21:50:18 -07:00
parent 2fd093d4b4
commit 5a391f38fd
11 changed files with 27 additions and 18 deletions

View file

@ -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,

View file

@ -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);

View file

@ -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);
} }
} }
} }

View file

@ -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();
} }

View file

@ -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;

View file

@ -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);
} }

View file

@ -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}.");

View file

@ -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;

View file

@ -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),
}; };
} }

View file

@ -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();
} }

View file

@ -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;