diff options
Diffstat (limited to 'Ryujinx.Graphics/Gal/OpenGL/OglEnumConverter.cs')
| -rw-r--r-- | Ryujinx.Graphics/Gal/OpenGL/OglEnumConverter.cs | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OglEnumConverter.cs b/Ryujinx.Graphics/Gal/OpenGL/OglEnumConverter.cs new file mode 100644 index 00000000..a3f9957f --- /dev/null +++ b/Ryujinx.Graphics/Gal/OpenGL/OglEnumConverter.cs @@ -0,0 +1,427 @@ +using OpenTK.Graphics.OpenGL; +using System; + +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) + " \"" + frontFace + "\" is not valid!"); + } + + 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) + " \"" + cullFace + "\" is not valid!"); + } + + 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) + " \"" + op + "\" is not valid!"); + } + + public static DepthFunction GetDepthFunc(GalComparisonOp func) + { + return (DepthFunction)GetFunc(func); + } + + public static StencilFunction GetStencilFunc(GalComparisonOp func) + { + return (StencilFunction)GetFunc(func); + } + + private static All GetFunc(GalComparisonOp func) + { + if ((int)func >= (int)All.Never && + (int)func <= (int)All.Always) + { + return (All)func; + } + + switch (func) + { + case GalComparisonOp.Never: return All.Never; + case GalComparisonOp.Less: return All.Less; + case GalComparisonOp.Equal: return All.Equal; + case GalComparisonOp.Lequal: return All.Lequal; + case GalComparisonOp.Greater: return All.Greater; + case GalComparisonOp.NotEqual: return All.Notequal; + case GalComparisonOp.Gequal: return All.Gequal; + case GalComparisonOp.Always: return All.Always; + } + + throw new ArgumentException(nameof(func) + " \"" + func + "\" is not valid!"); + } + + public static DrawElementsType GetDrawElementsType(GalIndexFormat format) + { + switch (format) + { + case GalIndexFormat.Byte: return DrawElementsType.UnsignedByte; + case GalIndexFormat.Int16: return DrawElementsType.UnsignedShort; + case GalIndexFormat.Int32: return DrawElementsType.UnsignedInt; + } + + throw new ArgumentException(nameof(format) + " \"" + format + "\" is not valid!"); + } + + public static PrimitiveType GetPrimitiveType(GalPrimitiveType type) + { + switch (type) + { + case GalPrimitiveType.Points: return PrimitiveType.Points; + case GalPrimitiveType.Lines: return PrimitiveType.Lines; + case GalPrimitiveType.LineLoop: return PrimitiveType.LineLoop; + case GalPrimitiveType.LineStrip: return PrimitiveType.LineStrip; + case GalPrimitiveType.Triangles: return PrimitiveType.Triangles; + case GalPrimitiveType.TriangleStrip: return PrimitiveType.TriangleStrip; + case GalPrimitiveType.TriangleFan: return PrimitiveType.TriangleFan; + case GalPrimitiveType.Polygon: return PrimitiveType.Polygon; + case GalPrimitiveType.LinesAdjacency: return PrimitiveType.LinesAdjacency; + case GalPrimitiveType.LineStripAdjacency: return PrimitiveType.LineStripAdjacency; + case GalPrimitiveType.TrianglesAdjacency: return PrimitiveType.TrianglesAdjacency; + case GalPrimitiveType.TriangleStripAdjacency: return PrimitiveType.TriangleStripAdjacency; + case GalPrimitiveType.Patches: return PrimitiveType.Patches; + } + + throw new ArgumentException(nameof(type) + " \"" + type + "\" is not valid!"); + } + + public static ShaderType GetShaderType(GalShaderType type) + { + switch (type) + { + case GalShaderType.Vertex: return ShaderType.VertexShader; + case GalShaderType.TessControl: return ShaderType.TessControlShader; + case GalShaderType.TessEvaluation: return ShaderType.TessEvaluationShader; + case GalShaderType.Geometry: return ShaderType.GeometryShader; + case GalShaderType.Fragment: return ShaderType.FragmentShader; + } + + throw new ArgumentException(nameof(type) + " \"" + type + "\" is not valid!"); + } + + public static (PixelInternalFormat, PixelFormat, PixelType) GetImageFormat(GalImageFormat format) + { + switch (format) + { + case GalImageFormat.Rgba32 | GalImageFormat.Float: return (PixelInternalFormat.Rgba32f, PixelFormat.Rgba, PixelType.Float); + case GalImageFormat.Rgba32 | GalImageFormat.Sint: return (PixelInternalFormat.Rgba32i, PixelFormat.RgbaInteger, PixelType.Int); + case GalImageFormat.Rgba32 | GalImageFormat.Uint: return (PixelInternalFormat.Rgba32ui, PixelFormat.RgbaInteger, PixelType.UnsignedInt); + case GalImageFormat.Rgba16 | GalImageFormat.Float: return (PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.HalfFloat); + case GalImageFormat.Rgba16 | GalImageFormat.Sint: return (PixelInternalFormat.Rgba16i, PixelFormat.RgbaInteger, PixelType.Short); + case GalImageFormat.Rgba16 | GalImageFormat.Uint: return (PixelInternalFormat.Rgba16ui, PixelFormat.RgbaInteger, PixelType.UnsignedShort); + case GalImageFormat.Rgba16 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba16, PixelFormat.Rgba, PixelType.UnsignedShort); + case GalImageFormat.Rg32 | GalImageFormat.Float: return (PixelInternalFormat.Rg32f, PixelFormat.Rg, PixelType.Float); + case GalImageFormat.Rg32 | GalImageFormat.Sint: return (PixelInternalFormat.Rg32i, PixelFormat.RgInteger, PixelType.Int); + case GalImageFormat.Rg32 | GalImageFormat.Uint: return (PixelInternalFormat.Rg32ui, PixelFormat.RgInteger, PixelType.UnsignedInt); + case GalImageFormat.Rgbx8 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb8, PixelFormat.Rgba, PixelType.UnsignedByte); + case GalImageFormat.Rgba8 | GalImageFormat.Snorm: return (PixelInternalFormat.Rgba8Snorm, PixelFormat.Rgba, PixelType.Byte); + case GalImageFormat.Rgba8 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte); + case GalImageFormat.Rgba8 | GalImageFormat.Sint: return (PixelInternalFormat.Rgba8i, PixelFormat.RgbaInteger, PixelType.Byte); + case GalImageFormat.Rgba8 | GalImageFormat.Uint: return (PixelInternalFormat.Rgba8ui, PixelFormat.RgbaInteger, PixelType.UnsignedByte); + case GalImageFormat.Rgba8 | GalImageFormat.Srgb: return (PixelInternalFormat.Srgb8Alpha8, PixelFormat.Rgba, PixelType.UnsignedByte); + case GalImageFormat.Bgra8 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba8, PixelFormat.Bgra, PixelType.UnsignedByte); + case GalImageFormat.Bgra8 | GalImageFormat.Srgb: return (PixelInternalFormat.Srgb8Alpha8, PixelFormat.Bgra, PixelType.UnsignedByte); + case GalImageFormat.Rgba4 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba4, PixelFormat.Rgba, PixelType.UnsignedShort4444Reversed); + case GalImageFormat.Rgb10A2 | GalImageFormat.Uint: return (PixelInternalFormat.Rgb10A2ui, PixelFormat.RgbaInteger, PixelType.UnsignedInt2101010Reversed); + case GalImageFormat.Rgb10A2 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb10A2, PixelFormat.Rgba, PixelType.UnsignedInt2101010Reversed); + case GalImageFormat.R32 | GalImageFormat.Float: return (PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float); + case GalImageFormat.R32 | GalImageFormat.Sint: return (PixelInternalFormat.R32i, PixelFormat.Red, PixelType.Int); + case GalImageFormat.R32 | GalImageFormat.Uint: return (PixelInternalFormat.R32ui, PixelFormat.Red, PixelType.UnsignedInt); + case GalImageFormat.Bgr5A1 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb5A1, PixelFormat.Rgba, PixelType.UnsignedShort5551); + case GalImageFormat.Rgb5A1 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb5A1, PixelFormat.Rgba, PixelType.UnsignedShort1555Reversed); + case GalImageFormat.Rgb565 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba, PixelFormat.Rgb, PixelType.UnsignedShort565Reversed); + case GalImageFormat.Bgr565 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba, PixelFormat.Rgb, PixelType.UnsignedShort565); + case GalImageFormat.Rg16 | GalImageFormat.Float: return (PixelInternalFormat.Rg16f, PixelFormat.Rg, PixelType.HalfFloat); + case GalImageFormat.Rg16 | GalImageFormat.Sint: return (PixelInternalFormat.Rg16i, PixelFormat.RgInteger, PixelType.Short); + case GalImageFormat.Rg16 | GalImageFormat.Snorm: return (PixelInternalFormat.Rg16Snorm, PixelFormat.Rg, PixelType.Short); + case GalImageFormat.Rg16 | GalImageFormat.Uint: return (PixelInternalFormat.Rg16ui, PixelFormat.RgInteger, PixelType.UnsignedShort); + case GalImageFormat.Rg16 | GalImageFormat.Unorm: return (PixelInternalFormat.Rg16, PixelFormat.Rg, PixelType.UnsignedShort); + case GalImageFormat.Rg8 | GalImageFormat.Sint: return (PixelInternalFormat.Rg8i, PixelFormat.RgInteger, PixelType.Byte); + case GalImageFormat.Rg8 | GalImageFormat.Snorm: return (PixelInternalFormat.Rg8Snorm, PixelFormat.Rg, PixelType.Byte); + case GalImageFormat.Rg8 | GalImageFormat.Uint: return (PixelInternalFormat.Rg8ui, PixelFormat.RgInteger, PixelType.UnsignedByte); + case GalImageFormat.Rg8 | GalImageFormat.Unorm: return (PixelInternalFormat.Rg8, PixelFormat.Rg, PixelType.UnsignedByte); + case GalImageFormat.R16 | GalImageFormat.Float: return (PixelInternalFormat.R16f, PixelFormat.Red, PixelType.HalfFloat); + case GalImageFormat.R16 | GalImageFormat.Sint: return (PixelInternalFormat.R16i, PixelFormat.RedInteger, PixelType.Short); + case GalImageFormat.R16 | GalImageFormat.Snorm: return (PixelInternalFormat.R16Snorm, PixelFormat.Red, PixelType.Short); + case GalImageFormat.R16 | GalImageFormat.Uint: return (PixelInternalFormat.R16ui, PixelFormat.RedInteger, PixelType.UnsignedShort); + case GalImageFormat.R16 | GalImageFormat.Unorm: return (PixelInternalFormat.R16, PixelFormat.Red, PixelType.UnsignedShort); + case GalImageFormat.R8 | GalImageFormat.Sint: return (PixelInternalFormat.R8i, PixelFormat.RedInteger, PixelType.Byte); + case GalImageFormat.R8 | GalImageFormat.Snorm: return (PixelInternalFormat.R8Snorm, PixelFormat.Red, PixelType.Byte); + case GalImageFormat.R8 | GalImageFormat.Uint: return (PixelInternalFormat.R8ui, PixelFormat.RedInteger, PixelType.UnsignedByte); + case GalImageFormat.R8 | GalImageFormat.Unorm: return (PixelInternalFormat.R8, PixelFormat.Red, PixelType.UnsignedByte); + case GalImageFormat.R11G11B10 | GalImageFormat.Float: return (PixelInternalFormat.R11fG11fB10f, PixelFormat.Rgb, PixelType.UnsignedInt10F11F11FRev); + + case GalImageFormat.D16 | GalImageFormat.Unorm: return (PixelInternalFormat.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort); + case GalImageFormat.D24 | GalImageFormat.Unorm: return (PixelInternalFormat.DepthComponent24, PixelFormat.DepthComponent, PixelType.UnsignedInt); + case GalImageFormat.D24S8 | GalImageFormat.Uint: return (PixelInternalFormat.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248); + case GalImageFormat.D24S8 | GalImageFormat.Unorm: return (PixelInternalFormat.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248); + case GalImageFormat.D32 | GalImageFormat.Float: return (PixelInternalFormat.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float); + case GalImageFormat.D32S8 | GalImageFormat.Float: return (PixelInternalFormat.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev); + } + + throw new NotImplementedException($"{format & GalImageFormat.FormatMask} {format & GalImageFormat.TypeMask}"); + } + + public static All GetDepthCompareFunc(DepthCompareFunc depthCompareFunc) + { + switch (depthCompareFunc) + { + case DepthCompareFunc.LEqual: + return All.Lequal; + case DepthCompareFunc.GEqual: + return All.Gequal; + case DepthCompareFunc.Less: + return All.Less; + case DepthCompareFunc.Greater: + return All.Greater; + case DepthCompareFunc.Equal: + return All.Equal; + case DepthCompareFunc.NotEqual: + return All.Notequal; + case DepthCompareFunc.Always: + return All.Always; + case DepthCompareFunc.Never: + return All.Never; + default: + throw new ArgumentException(nameof(depthCompareFunc) + " \"" + depthCompareFunc + "\" is not valid!"); + } + } + + public static InternalFormat GetCompressedImageFormat(GalImageFormat format) + { + switch (format) + { + case GalImageFormat.BptcSfloat | GalImageFormat.Float: return InternalFormat.CompressedRgbBptcSignedFloat; + case GalImageFormat.BptcUfloat | GalImageFormat.Float: return InternalFormat.CompressedRgbBptcUnsignedFloat; + case GalImageFormat.BptcUnorm | GalImageFormat.Unorm: return InternalFormat.CompressedRgbaBptcUnorm; + case GalImageFormat.BptcUnorm | GalImageFormat.Srgb: return InternalFormat.CompressedSrgbAlphaBptcUnorm; + case GalImageFormat.BC1 | GalImageFormat.Unorm: return InternalFormat.CompressedRgbaS3tcDxt1Ext; + case GalImageFormat.BC1 | GalImageFormat.Srgb: return InternalFormat.CompressedSrgbAlphaS3tcDxt1Ext; + case GalImageFormat.BC2 | GalImageFormat.Unorm: return InternalFormat.CompressedRgbaS3tcDxt3Ext; + case GalImageFormat.BC2 | GalImageFormat.Srgb: return InternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; + case GalImageFormat.BC3 | GalImageFormat.Unorm: return InternalFormat.CompressedRgbaS3tcDxt5Ext; + case GalImageFormat.BC3 | GalImageFormat.Srgb: return InternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; + case GalImageFormat.BC4 | GalImageFormat.Snorm: return InternalFormat.CompressedSignedRedRgtc1; + case GalImageFormat.BC4 | GalImageFormat.Unorm: return InternalFormat.CompressedRedRgtc1; + case GalImageFormat.BC5 | GalImageFormat.Snorm: return InternalFormat.CompressedSignedRgRgtc2; + case GalImageFormat.BC5 | GalImageFormat.Unorm: return InternalFormat.CompressedRgRgtc2; + } + + throw new NotImplementedException($"{format & GalImageFormat.FormatMask} {format & GalImageFormat.TypeMask}"); + } + + public static All GetTextureSwizzle(GalTextureSource source) + { + switch (source) + { + case GalTextureSource.Zero: return All.Zero; + case GalTextureSource.Red: return All.Red; + case GalTextureSource.Green: return All.Green; + case GalTextureSource.Blue: return All.Blue; + case GalTextureSource.Alpha: return All.Alpha; + case GalTextureSource.OneInt: return All.One; + case GalTextureSource.OneFloat: return All.One; + } + + throw new ArgumentException(nameof(source) + " \"" + source + "\" is not valid!"); + } + + public static TextureWrapMode GetTextureWrapMode(GalTextureWrap wrap) + { + switch (wrap) + { + case GalTextureWrap.Repeat: return TextureWrapMode.Repeat; + case GalTextureWrap.MirroredRepeat: return TextureWrapMode.MirroredRepeat; + case GalTextureWrap.ClampToEdge: return TextureWrapMode.ClampToEdge; + case GalTextureWrap.ClampToBorder: return TextureWrapMode.ClampToBorder; + case GalTextureWrap.Clamp: return TextureWrapMode.Clamp; + } + + if (OglExtension.TextureMirrorClamp) + { + switch (wrap) + { + case GalTextureWrap.MirrorClampToEdge: return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToEdgeExt; + case GalTextureWrap.MirrorClampToBorder: return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToBorderExt; + case GalTextureWrap.MirrorClamp: return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampExt; + } + } + else + { + //Fallback to non-mirrored clamps + switch (wrap) + { + case GalTextureWrap.MirrorClampToEdge: return TextureWrapMode.ClampToEdge; + case GalTextureWrap.MirrorClampToBorder: return TextureWrapMode.ClampToBorder; + case GalTextureWrap.MirrorClamp: return TextureWrapMode.Clamp; + } + } + + throw new ArgumentException(nameof(wrap) + " \"" + wrap + "\" is not valid!"); + } + + public static TextureMinFilter GetTextureMinFilter( + GalTextureFilter minFilter, + GalTextureMipFilter mipFilter) + { + //TODO: Mip (needs mipmap support first). + switch (minFilter) + { + case GalTextureFilter.Nearest: return TextureMinFilter.Nearest; + case GalTextureFilter.Linear: return TextureMinFilter.Linear; + } + + throw new ArgumentException(nameof(minFilter) + " \"" + minFilter + "\" is not valid!"); + } + + public static TextureMagFilter GetTextureMagFilter(GalTextureFilter filter) + { + switch (filter) + { + case GalTextureFilter.Nearest: return TextureMagFilter.Nearest; + case GalTextureFilter.Linear: return TextureMagFilter.Linear; + } + + throw new ArgumentException(nameof(filter) + " \"" + filter + "\" is not valid!"); + } + + public static BlendEquationMode GetBlendEquation(GalBlendEquation blendEquation) + { + switch (blendEquation) + { + case GalBlendEquation.FuncAdd: + case GalBlendEquation.FuncAddGl: + return BlendEquationMode.FuncAdd; + + case GalBlendEquation.FuncSubtract: + case GalBlendEquation.FuncSubtractGl: + return BlendEquationMode.FuncSubtract; + + case GalBlendEquation.FuncReverseSubtract: + case GalBlendEquation.FuncReverseSubtractGl: + return BlendEquationMode.FuncReverseSubtract; + + case GalBlendEquation.Min: + case GalBlendEquation.MinGl: + return BlendEquationMode.Min; + + case GalBlendEquation.Max: + case GalBlendEquation.MaxGl: + return BlendEquationMode.Max; + } + + throw new ArgumentException(nameof(blendEquation) + " \"" + blendEquation + "\" is not valid!"); + } + + public static BlendingFactor GetBlendFactor(GalBlendFactor blendFactor) + { + switch (blendFactor) + { + case GalBlendFactor.Zero: + case GalBlendFactor.ZeroGl: + return BlendingFactor.Zero; + + case GalBlendFactor.One: + case GalBlendFactor.OneGl: + return BlendingFactor.One; + + case GalBlendFactor.SrcColor: + case GalBlendFactor.SrcColorGl: + return BlendingFactor.SrcColor; + + case GalBlendFactor.OneMinusSrcColor: + case GalBlendFactor.OneMinusSrcColorGl: + return BlendingFactor.OneMinusSrcColor; + + case GalBlendFactor.DstColor: + case GalBlendFactor.DstColorGl: + return BlendingFactor.DstColor; + + case GalBlendFactor.OneMinusDstColor: + case GalBlendFactor.OneMinusDstColorGl: + return BlendingFactor.OneMinusDstColor; + + case GalBlendFactor.SrcAlpha: + case GalBlendFactor.SrcAlphaGl: + return BlendingFactor.SrcAlpha; + + case GalBlendFactor.OneMinusSrcAlpha: + case GalBlendFactor.OneMinusSrcAlphaGl: + return BlendingFactor.OneMinusSrcAlpha; + + case GalBlendFactor.DstAlpha: + case GalBlendFactor.DstAlphaGl: + return BlendingFactor.DstAlpha; + + case GalBlendFactor.OneMinusDstAlpha: + case GalBlendFactor.OneMinusDstAlphaGl: + return BlendingFactor.OneMinusDstAlpha; + + case GalBlendFactor.OneMinusConstantColor: + case GalBlendFactor.OneMinusConstantColorGl: + return BlendingFactor.OneMinusConstantColor; + + case GalBlendFactor.ConstantAlpha: + case GalBlendFactor.ConstantAlphaGl: + return BlendingFactor.ConstantAlpha; + + case GalBlendFactor.OneMinusConstantAlpha: + case GalBlendFactor.OneMinusConstantAlphaGl: + return BlendingFactor.OneMinusConstantAlpha; + + case GalBlendFactor.SrcAlphaSaturate: + case GalBlendFactor.SrcAlphaSaturateGl: + return BlendingFactor.SrcAlphaSaturate; + + case GalBlendFactor.Src1Color: + case GalBlendFactor.Src1ColorGl: + return BlendingFactor.Src1Color; + + case GalBlendFactor.OneMinusSrc1Color: + case GalBlendFactor.OneMinusSrc1ColorGl: + return (BlendingFactor)BlendingFactorSrc.OneMinusSrc1Color; + + case GalBlendFactor.Src1Alpha: + case GalBlendFactor.Src1AlphaGl: + return BlendingFactor.Src1Alpha; + + case GalBlendFactor.OneMinusSrc1Alpha: + case GalBlendFactor.OneMinusSrc1AlphaGl: + return (BlendingFactor)BlendingFactorSrc.OneMinusSrc1Alpha; + + case GalBlendFactor.ConstantColor: + case GalBlendFactor.ConstantColorGl: + return BlendingFactor.ConstantColor; + } + + throw new ArgumentException(nameof(blendFactor) + " \"" + blendFactor + "\" is not valid!"); + } + } +} |
