diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2019-12-05 17:34:47 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | e25b7c9848b6ec486eb513297b5c536857665c7f (patch) | |
| tree | c1ccb6c58bed0f7ece835359516330104feb8f4d /Ryujinx.Graphics.OpenGL | |
| parent | 6a98c643cabeea25dc42e19fe475a687a034a532 (diff) | |
Initial support for the guest OpenGL driver (NVIDIA and Nouveau)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
6 files changed, 141 insertions, 53 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Converters/BlendFactorConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/BlendFactorConverter.cs index 1dc40522..db5099a7 100644 --- a/Ryujinx.Graphics.OpenGL/Converters/BlendFactorConverter.cs +++ b/Ryujinx.Graphics.OpenGL/Converters/BlendFactorConverter.cs @@ -10,25 +10,59 @@ namespace Ryujinx.Graphics.OpenGL { switch (factor) { - case BlendFactor.Zero: return All.Zero; - case BlendFactor.One: return All.One; - case BlendFactor.SrcColor: return All.SrcColor; - case BlendFactor.OneMinusSrcColor: return All.OneMinusSrcColor; - case BlendFactor.SrcAlpha: return All.SrcAlpha; - case BlendFactor.OneMinusSrcAlpha: return All.OneMinusSrcAlpha; - case BlendFactor.DstAlpha: return All.DstAlpha; - case BlendFactor.OneMinusDstAlpha: return All.OneMinusDstAlpha; - case BlendFactor.DstColor: return All.DstColor; - case BlendFactor.OneMinusDstColor: return All.OneMinusDstColor; - case BlendFactor.SrcAlphaSaturate: return All.SrcAlphaSaturate; - case BlendFactor.Src1Color: return All.Src1Color; - case BlendFactor.OneMinusSrc1Color: return All.OneMinusSrc1Color; - case BlendFactor.Src1Alpha: return All.Src1Alpha; - case BlendFactor.OneMinusSrc1Alpha: return All.OneMinusSrc1Alpha; - case BlendFactor.ConstantColor: return All.ConstantColor; - case BlendFactor.OneMinusConstantColor: return All.OneMinusConstantColor; - case BlendFactor.ConstantAlpha: return All.ConstantAlpha; - case BlendFactor.OneMinusConstantAlpha: return All.OneMinusConstantAlpha; + case BlendFactor.Zero: + case BlendFactor.ZeroGl: + return All.Zero; + case BlendFactor.One: + case BlendFactor.OneGl: + return All.One; + case BlendFactor.SrcColor: + case BlendFactor.SrcColorGl: + return All.SrcColor; + case BlendFactor.OneMinusSrcColor: + case BlendFactor.OneMinusSrcColorGl: + return All.OneMinusSrcColor; + case BlendFactor.SrcAlpha: + case BlendFactor.SrcAlphaGl: + return All.SrcAlpha; + case BlendFactor.OneMinusSrcAlpha: + case BlendFactor.OneMinusSrcAlphaGl: + return All.OneMinusSrcAlpha; + case BlendFactor.DstAlpha: + case BlendFactor.DstAlphaGl: + return All.DstAlpha; + case BlendFactor.OneMinusDstAlpha: + case BlendFactor.OneMinusDstAlphaGl: + return All.OneMinusDstAlpha; + case BlendFactor.DstColor: + case BlendFactor.DstColorGl: + return All.DstColor; + case BlendFactor.OneMinusDstColor: + case BlendFactor.OneMinusDstColorGl: + return All.OneMinusDstColor; + case BlendFactor.SrcAlphaSaturate: + case BlendFactor.SrcAlphaSaturateGl: + return All.SrcAlphaSaturate; + case BlendFactor.Src1Color: + case BlendFactor.Src1ColorGl: + return All.Src1Color; + case BlendFactor.OneMinusSrc1Color: + case BlendFactor.OneMinusSrc1ColorGl: + return All.OneMinusSrc1Color; + case BlendFactor.Src1Alpha: + case BlendFactor.Src1AlphaGl: + return All.Src1Alpha; + case BlendFactor.OneMinusSrc1Alpha: + case BlendFactor.OneMinusSrc1AlphaGl: + return All.OneMinusSrc1Alpha; + case BlendFactor.ConstantColor: + return All.ConstantColor; + case BlendFactor.OneMinusConstantColor: + return All.OneMinusConstantColor; + case BlendFactor.ConstantAlpha: + return All.ConstantAlpha; + case BlendFactor.OneMinusConstantAlpha: + return All.OneMinusConstantAlpha; } return All.Zero; diff --git a/Ryujinx.Graphics.OpenGL/Converters/BlendOpConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/BlendOpConverter.cs index b33a3bf8..66d6a145 100644 --- a/Ryujinx.Graphics.OpenGL/Converters/BlendOpConverter.cs +++ b/Ryujinx.Graphics.OpenGL/Converters/BlendOpConverter.cs @@ -10,11 +10,21 @@ namespace Ryujinx.Graphics.OpenGL { switch (op) { - case BlendOp.Add: return BlendEquationMode.FuncAdd; - case BlendOp.Subtract: return BlendEquationMode.FuncSubtract; - case BlendOp.ReverseSubtract: return BlendEquationMode.FuncReverseSubtract; - case BlendOp.Minimum: return BlendEquationMode.Min; - case BlendOp.Maximum: return BlendEquationMode.Max; + case BlendOp.Add: + case BlendOp.AddGl: + return BlendEquationMode.FuncAdd; + case BlendOp.Subtract: + case BlendOp.SubtractGl: + return BlendEquationMode.FuncSubtract; + case BlendOp.ReverseSubtract: + case BlendOp.ReverseSubtractGl: + return BlendEquationMode.FuncReverseSubtract; + case BlendOp.Minimum: + case BlendOp.MinimumGl: + return BlendEquationMode.Min; + case BlendOp.Maximum: + case BlendOp.MaximumGl: + return BlendEquationMode.Max; } return BlendEquationMode.FuncAdd; diff --git a/Ryujinx.Graphics.OpenGL/Converters/CompareOpConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/CompareOpConverter.cs index f592735b..a30ca02e 100644 --- a/Ryujinx.Graphics.OpenGL/Converters/CompareOpConverter.cs +++ b/Ryujinx.Graphics.OpenGL/Converters/CompareOpConverter.cs @@ -1,6 +1,5 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Graphics.GAL; -using System; namespace Ryujinx.Graphics.OpenGL { @@ -10,19 +9,33 @@ namespace Ryujinx.Graphics.OpenGL { switch (op) { - case CompareOp.Never: return All.Never; - case CompareOp.Less: return All.Less; - case CompareOp.Equal: return All.Equal; - case CompareOp.LessOrEqual: return All.Lequal; - case CompareOp.Greater: return All.Greater; - case CompareOp.NotEqual: return All.Notequal; - case CompareOp.GreaterOrEqual: return All.Gequal; - case CompareOp.Always: return All.Always; + case CompareOp.Never: + case CompareOp.NeverGl: + return All.Never; + case CompareOp.Less: + case CompareOp.LessGl: + return All.Less; + case CompareOp.Equal: + case CompareOp.EqualGl: + return All.Equal; + case CompareOp.LessOrEqual: + case CompareOp.LessOrEqualGl: + return All.Lequal; + case CompareOp.Greater: + case CompareOp.GreaterGl: + return All.Greater; + case CompareOp.NotEqual: + case CompareOp.NotEqualGl: + return All.Notequal; + case CompareOp.GreaterOrEqual: + case CompareOp.GreaterOrEqualGl: + return All.Gequal; + case CompareOp.Always: + case CompareOp.AlwaysGl: + return All.Always; } return All.Never; - - throw new ArgumentException($"Invalid compare operation \"{op}\"."); } } } diff --git a/Ryujinx.Graphics.OpenGL/Converters/MagFilterConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/MagFilterConverter.cs index d86d8014..cb75ee89 100644 --- a/Ryujinx.Graphics.OpenGL/Converters/MagFilterConverter.cs +++ b/Ryujinx.Graphics.OpenGL/Converters/MagFilterConverter.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.OpenGL case MagFilter.Linear: return TextureMagFilter.Linear; } - throw new ArgumentException($"Invalid filter \"{filter}\"."); + return TextureMagFilter.Nearest; } } } diff --git a/Ryujinx.Graphics.OpenGL/Converters/MinFilterConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/MinFilterConverter.cs index 128577f8..01436299 100644 --- a/Ryujinx.Graphics.OpenGL/Converters/MinFilterConverter.cs +++ b/Ryujinx.Graphics.OpenGL/Converters/MinFilterConverter.cs @@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.OpenGL case MinFilter.LinearMipmapLinear: return TextureMinFilter.LinearMipmapLinear; } - throw new ArgumentException($"Invalid filter \"{filter}\"."); + return TextureMinFilter.Nearest; } } } diff --git a/Ryujinx.Graphics.OpenGL/TextureView.cs b/Ryujinx.Graphics.OpenGL/TextureView.cs index 8fced290..769f0339 100644 --- a/Ryujinx.Graphics.OpenGL/TextureView.cs +++ b/Ryujinx.Graphics.OpenGL/TextureView.cs @@ -165,7 +165,29 @@ namespace Ryujinx.Graphics.OpenGL _renderer.TextureCopy.Copy(this, (TextureView)destination, srcRegion, dstRegion, linearFilter); } - public byte[] GetData(int face) + public byte[] GetData() + { + int size = 0; + + for (int level = 0; level < _info.Levels; level++) + { + size += _info.GetMipSize(level); + } + + byte[] data = new byte[size]; + + unsafe + { + fixed (byte* ptr = data) + { + WriteTo((IntPtr)ptr); + } + } + + return data; + } + + private void WriteTo(IntPtr ptr) { TextureTarget target = Target.Convert(); @@ -173,28 +195,37 @@ namespace Ryujinx.Graphics.OpenGL FormatInfo format = FormatTable.GetFormatInfo(_info.Format); - int depth = _info.GetDepthOrLayers(); + int faces = 1; if (target == TextureTarget.TextureCubeMap) { - target = TextureTarget.TextureCubeMapPositiveX + face; - } - - if (format.IsCompressed) - { - byte[] data = new byte[_info.Width * _info.Height * depth * 4]; - - GL.GetTexImage(target, 0, PixelFormat.Rgba, PixelType.UnsignedByte, data); + target = TextureTarget.TextureCubeMapPositiveX; - return data; + faces = 6; } - else - { - byte[] data = new byte[_info.GetMipSize(0)]; - GL.GetTexImage(target, 0, format.PixelFormat, format.PixelType, data); + for (int level = 0; level < _info.Levels; level++) + { + for (int face = 0; face < faces; face++) + { + int faceOffset = face * _info.GetMipSize2D(level); + + if (format.IsCompressed) + { + GL.GetCompressedTexImage(target + face, level, ptr + faceOffset); + } + else + { + GL.GetTexImage( + target + face, + level, + format.PixelFormat, + format.PixelType, + ptr + faceOffset); + } + } - return data; + ptr += _info.GetMipSize(level); } } |
