Implement some GPU features (#209)

* Implement stencil testing

* Implement depth testing

* Implement face culling

* Implement front face

* Comparison functions now take OGL enums too

* Fix front facing when flipping was used

* Add depth and stencil clear values
This commit is contained in:
ReinUsesLisp 2018-07-05 15:47:29 -03:00 committed by gdkchan
parent c99b2884e4
commit 97ca974213
9 changed files with 334 additions and 18 deletions

View file

@ -5,17 +5,76 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{
static class OGLEnumConverter
{
public static FrontFaceDirection GetFrontFace(GalFrontFace FrontFace)
{
switch (FrontFace)
{
case GalFrontFace.CW: return FrontFaceDirection.Cw;
case GalFrontFace.CCW: return FrontFaceDirection.Ccw;
}
throw new ArgumentException(nameof(FrontFace));
}
public static CullFaceMode GetCullFace(GalCullFace CullFace)
{
switch (CullFace)
{
case GalCullFace.Front: return CullFaceMode.Front;
case GalCullFace.Back: return CullFaceMode.Back;
case GalCullFace.FrontAndBack: return CullFaceMode.FrontAndBack;
}
throw new ArgumentException(nameof(CullFace));
}
public static StencilOp GetStencilOp(GalStencilOp Op)
{
switch (Op)
{
case GalStencilOp.Keep: return StencilOp.Keep;
case GalStencilOp.Zero: return StencilOp.Zero;
case GalStencilOp.Replace: return StencilOp.Replace;
case GalStencilOp.Incr: return StencilOp.Incr;
case GalStencilOp.Decr: return StencilOp.Decr;
case GalStencilOp.Invert: return StencilOp.Invert;
case GalStencilOp.IncrWrap: return StencilOp.IncrWrap;
case GalStencilOp.DecrWrap: return StencilOp.DecrWrap;
}
throw new ArgumentException(nameof(Op));
}
public static DepthFunction GetDepthFunc(GalComparisonOp Func)
{
//Looks like the GPU can take it's own values (described in GalComparisonOp) and OpenGL values alike
if ((int)Func >= (int)DepthFunction.Never &&
(int)Func <= (int)DepthFunction.Always)
{
return (DepthFunction)Func;
}
switch (Func)
{
case GalComparisonOp.Never: return DepthFunction.Never;
case GalComparisonOp.Less: return DepthFunction.Less;
case GalComparisonOp.Equal: return DepthFunction.Equal;
case GalComparisonOp.Lequal: return DepthFunction.Lequal;
case GalComparisonOp.Greater: return DepthFunction.Greater;
case GalComparisonOp.NotEqual: return DepthFunction.Notequal;
case GalComparisonOp.Gequal: return DepthFunction.Gequal;
case GalComparisonOp.Always: return DepthFunction.Always;
}
throw new ArgumentException(nameof(Func));
}
public static StencilFunction GetStencilFunc(GalComparisonOp Func)
{
//OGL comparison values match, it's just an enum cast
return (StencilFunction)GetDepthFunc(Func);
}
public static DrawElementsType GetDrawElementsType(GalIndexFormat Format)
{
switch (Format)