aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-12-05 17:34:47 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commite25b7c9848b6ec486eb513297b5c536857665c7f (patch)
treec1ccb6c58bed0f7ece835359516330104feb8f4d /Ryujinx.Graphics.OpenGL
parent6a98c643cabeea25dc42e19fe475a687a034a532 (diff)
Initial support for the guest OpenGL driver (NVIDIA and Nouveau)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/Converters/BlendFactorConverter.cs72
-rw-r--r--Ryujinx.Graphics.OpenGL/Converters/BlendOpConverter.cs20
-rw-r--r--Ryujinx.Graphics.OpenGL/Converters/CompareOpConverter.cs35
-rw-r--r--Ryujinx.Graphics.OpenGL/Converters/MagFilterConverter.cs2
-rw-r--r--Ryujinx.Graphics.OpenGL/Converters/MinFilterConverter.cs2
-rw-r--r--Ryujinx.Graphics.OpenGL/TextureView.cs63
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);
}
}