aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.OpenGL/HwCapabilities.cs18
-rw-r--r--Ryujinx.Graphics.OpenGL/Image/TextureView.cs26
-rw-r--r--Ryujinx.Graphics.OpenGL/PersistentBuffers.cs9
-rw-r--r--Ryujinx.Graphics.OpenGL/Renderer.cs9
4 files changed, 48 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.OpenGL/HwCapabilities.cs b/Ryujinx.Graphics.OpenGL/HwCapabilities.cs
index a971d5fc..44365ca7 100644
--- a/Ryujinx.Graphics.OpenGL/HwCapabilities.cs
+++ b/Ryujinx.Graphics.OpenGL/HwCapabilities.cs
@@ -20,7 +20,8 @@ namespace Ryujinx.Graphics.OpenGL
public enum GpuVendor
{
Unknown,
- Amd,
+ AmdWindows,
+ AmdUnix,
IntelWindows,
IntelUnix,
Nvidia
@@ -28,10 +29,15 @@ namespace Ryujinx.Graphics.OpenGL
private static readonly Lazy<GpuVendor> _gpuVendor = new Lazy<GpuVendor>(GetGpuVendor);
+ private static bool _isAMD => _gpuVendor.Value == GpuVendor.AmdWindows || _gpuVendor.Value == GpuVendor.AmdUnix;
+ private static bool _isIntel => _gpuVendor.Value == GpuVendor.IntelWindows || _gpuVendor.Value == GpuVendor.IntelUnix;
+
public static GpuVendor Vendor => _gpuVendor.Value;
private static Lazy<float> _maxSupportedAnisotropy = new Lazy<float>(GL.GetFloat((GetPName)All.MaxTextureMaxAnisotropy));
+ public static bool UsePersistentBufferForFlush => _gpuVendor.Value == GpuVendor.AmdWindows || _gpuVendor.Value == GpuVendor.Nvidia;
+
public static bool SupportsAstcCompression => _supportsAstcCompression.Value;
public static bool SupportsImageLoadFormatted => _supportsImageLoadFormatted.Value;
public static bool SupportsParallelShaderCompile => _supportsParallelShaderCompile.Value;
@@ -41,9 +47,9 @@ namespace Ryujinx.Graphics.OpenGL
public static bool SupportsTextureShadowLod => _supportsTextureShadowLod.Value;
public static bool SupportsViewportSwizzle => _supportsViewportSwizzle.Value;
- public static bool SupportsMismatchingViewFormat => _gpuVendor.Value != GpuVendor.Amd && _gpuVendor.Value != GpuVendor.IntelWindows;
+ public static bool SupportsMismatchingViewFormat => _gpuVendor.Value != GpuVendor.AmdWindows && _gpuVendor.Value != GpuVendor.IntelWindows;
public static bool SupportsNonConstantTextureOffset => _gpuVendor.Value == GpuVendor.Nvidia;
- public static bool RequiresSyncFlush => _gpuVendor.Value == GpuVendor.Amd || _gpuVendor.Value == GpuVendor.IntelWindows || _gpuVendor.Value == GpuVendor.IntelUnix;
+ public static bool RequiresSyncFlush => _gpuVendor.Value == GpuVendor.AmdWindows || _isIntel;
public static int MaximumComputeSharedMemorySize => _maximumComputeSharedMemorySize.Value;
public static int StorageBufferOffsetAlignment => _storageBufferOffsetAlignment.Value;
@@ -86,7 +92,11 @@ namespace Ryujinx.Graphics.OpenGL
}
else if (vendor == "ati technologies inc." || vendor == "advanced micro devices, inc.")
{
- return GpuVendor.Amd;
+ return GpuVendor.AmdWindows;
+ }
+ else if (vendor == "amd" || vendor == "x.org")
+ {
+ return GpuVendor.AmdUnix;
}
else
{
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
index 770e99a0..5e7b5f22 100644
--- a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
+++ b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
@@ -121,7 +121,31 @@ namespace Ryujinx.Graphics.OpenGL.Image
public byte[] GetData()
{
- return _renderer.PersistentBuffers.Default.GetTextureData(this);
+ int size = 0;
+
+ for (int level = 0; level < Info.Levels; level++)
+ {
+ size += Info.GetMipSize(level);
+ }
+
+ if (HwCapabilities.UsePersistentBufferForFlush)
+ {
+ return _renderer.PersistentBuffers.Default.GetTextureData(this, size);
+ }
+ else
+ {
+ byte[] data = new byte[size];
+
+ unsafe
+ {
+ fixed (byte* ptr = data)
+ {
+ WriteTo((IntPtr)ptr);
+ }
+ }
+
+ return data;
+ }
}
public void WriteToPbo(int offset, bool forceBgra)
diff --git a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs b/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
index a7cefca3..740f8b98 100644
--- a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
+++ b/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
@@ -63,15 +63,8 @@ namespace Ryujinx.Graphics.OpenGL
GL.DeleteSync(sync);
}
- public byte[] GetTextureData(TextureView view)
+ public byte[] GetTextureData(TextureView view, int size)
{
- int size = 0;
-
- for (int level = 0; level < view.Info.Levels; level++)
- {
- size += view.Info.GetMipSize(level);
- }
-
EnsureBuffer(size);
GL.BindBuffer(BufferTarget.PixelPackBuffer, _copyBufferHandle);
diff --git a/Ryujinx.Graphics.OpenGL/Renderer.cs b/Ryujinx.Graphics.OpenGL/Renderer.cs
index 41629c1d..561f0684 100644
--- a/Ryujinx.Graphics.OpenGL/Renderer.cs
+++ b/Ryujinx.Graphics.OpenGL/Renderer.cs
@@ -93,7 +93,14 @@ namespace Ryujinx.Graphics.OpenGL
public byte[] GetBufferData(BufferHandle buffer, int offset, int size)
{
- return PersistentBuffers.Default.GetBufferData(buffer, offset, size);
+ if (HwCapabilities.UsePersistentBufferForFlush)
+ {
+ return PersistentBuffers.Default.GetBufferData(buffer, offset, size);
+ }
+ else
+ {
+ return Buffer.GetData(buffer, offset, size);
+ }
}
public Capabilities GetCapabilities()