forked from Mirror/Ryujinx
Use copy dependencies for the Intel/AMD view format workaround (#2144)
* This might help AMD a bit * Removal of old workaround.
This commit is contained in:
parent
bec67dbef7
commit
212e472c9f
7 changed files with 15 additions and 68 deletions
|
@ -5,6 +5,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
public bool SupportsAstcCompression { get; }
|
public bool SupportsAstcCompression { get; }
|
||||||
public bool SupportsImageLoadFormatted { get; }
|
public bool SupportsImageLoadFormatted { get; }
|
||||||
public bool SupportsNonConstantTextureOffset { get; }
|
public bool SupportsNonConstantTextureOffset { get; }
|
||||||
|
public bool SupportsMismatchingViewFormat { get; }
|
||||||
public bool SupportsViewportSwizzle { get; }
|
public bool SupportsViewportSwizzle { get; }
|
||||||
|
|
||||||
public int MaximumComputeSharedMemorySize { get; }
|
public int MaximumComputeSharedMemorySize { get; }
|
||||||
|
@ -15,6 +16,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
bool supportsAstcCompression,
|
bool supportsAstcCompression,
|
||||||
bool supportsImageLoadFormatted,
|
bool supportsImageLoadFormatted,
|
||||||
bool supportsNonConstantTextureOffset,
|
bool supportsNonConstantTextureOffset,
|
||||||
|
bool supportsMismatchingViewFormat,
|
||||||
bool supportsViewportSwizzle,
|
bool supportsViewportSwizzle,
|
||||||
int maximumComputeSharedMemorySize,
|
int maximumComputeSharedMemorySize,
|
||||||
float maximumSupportedAnisotropy,
|
float maximumSupportedAnisotropy,
|
||||||
|
@ -23,6 +25,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
SupportsAstcCompression = supportsAstcCompression;
|
SupportsAstcCompression = supportsAstcCompression;
|
||||||
SupportsImageLoadFormatted = supportsImageLoadFormatted;
|
SupportsImageLoadFormatted = supportsImageLoadFormatted;
|
||||||
SupportsNonConstantTextureOffset = supportsNonConstantTextureOffset;
|
SupportsNonConstantTextureOffset = supportsNonConstantTextureOffset;
|
||||||
|
SupportsMismatchingViewFormat = supportsMismatchingViewFormat;
|
||||||
SupportsViewportSwizzle = supportsViewportSwizzle;
|
SupportsViewportSwizzle = supportsViewportSwizzle;
|
||||||
MaximumComputeSharedMemorySize = maximumComputeSharedMemorySize;
|
MaximumComputeSharedMemorySize = maximumComputeSharedMemorySize;
|
||||||
MaximumSupportedAnisotropy = maximumSupportedAnisotropy;
|
MaximumSupportedAnisotropy = maximumSupportedAnisotropy;
|
||||||
|
|
|
@ -1014,6 +1014,15 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
result = TextureCompatibility.PropagateViewCompatibility(result, TextureCompatibility.ViewTargetCompatible(Info, info));
|
result = TextureCompatibility.PropagateViewCompatibility(result, TextureCompatibility.ViewTargetCompatible(Info, info));
|
||||||
result = TextureCompatibility.PropagateViewCompatibility(result, TextureCompatibility.ViewSubImagesInBounds(Info, info, firstLayer, firstLevel));
|
result = TextureCompatibility.PropagateViewCompatibility(result, TextureCompatibility.ViewSubImagesInBounds(Info, info, firstLayer, firstLevel));
|
||||||
|
|
||||||
|
if (result == TextureViewCompatibility.Full && Info.FormatInfo.Format != info.FormatInfo.Format && !_context.Capabilities.SupportsMismatchingViewFormat)
|
||||||
|
{
|
||||||
|
// AMD and Intel have a bug where the view format is always ignored;
|
||||||
|
// they use the parent format instead.
|
||||||
|
// Create a copy dependency to avoid this issue.
|
||||||
|
|
||||||
|
result = TextureViewCompatibility.CopyOnly;
|
||||||
|
}
|
||||||
|
|
||||||
return (Info.SamplesInX == info.SamplesInX &&
|
return (Info.SamplesInX == info.SamplesInX &&
|
||||||
Info.SamplesInY == info.SamplesInY) ? result : TextureViewCompatibility.Incompatible;
|
Info.SamplesInY == info.SamplesInY) ? result : TextureViewCompatibility.Incompatible;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,15 +40,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
FramebufferAttachment attachment = FramebufferAttachment.ColorAttachment0 + index;
|
FramebufferAttachment attachment = FramebufferAttachment.ColorAttachment0 + index;
|
||||||
|
|
||||||
if (HwCapabilities.Vendor == HwCapabilities.GpuVendor.Amd ||
|
GL.FramebufferTexture(FramebufferTarget.Framebuffer, attachment, color?.Handle ?? 0, 0);
|
||||||
HwCapabilities.Vendor == HwCapabilities.GpuVendor.IntelWindows)
|
|
||||||
{
|
|
||||||
GL.FramebufferTexture(FramebufferTarget.Framebuffer, attachment, color?.GetIncompatibleFormatViewHandle() ?? 0, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GL.FramebufferTexture(FramebufferTarget.Framebuffer, attachment, color?.Handle ?? 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_colors[index] = color;
|
_colors[index] = color;
|
||||||
}
|
}
|
||||||
|
@ -92,21 +84,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SignalModified()
|
|
||||||
{
|
|
||||||
if (HwCapabilities.Vendor == HwCapabilities.GpuVendor.Amd ||
|
|
||||||
HwCapabilities.Vendor == HwCapabilities.GpuVendor.IntelWindows)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
if (_colors[i] != null)
|
|
||||||
{
|
|
||||||
_colors[i].SignalModified();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetDualSourceBlend(bool enable)
|
public void SetDualSourceBlend(bool enable)
|
||||||
{
|
{
|
||||||
bool oldEnable = _dualSourceBlend;
|
bool oldEnable = _dualSourceBlend;
|
||||||
|
|
|
@ -36,6 +36,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
public static bool SupportsSeamlessCubemapPerTexture => _supportsSeamlessCubemapPerTexture.Value;
|
public static bool SupportsSeamlessCubemapPerTexture => _supportsSeamlessCubemapPerTexture.Value;
|
||||||
public static bool SupportsNonConstantTextureOffset => _gpuVendor.Value == GpuVendor.Nvidia;
|
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.Amd || _gpuVendor.Value == GpuVendor.IntelWindows || _gpuVendor.Value == GpuVendor.IntelUnix;
|
||||||
|
public static bool SupportsMismatchingViewFormat => _gpuVendor.Value != GpuVendor.Amd && _gpuVendor.Value != GpuVendor.IntelWindows;
|
||||||
|
|
||||||
public static int MaximumComputeSharedMemorySize => _maximumComputeSharedMemorySize.Value;
|
public static int MaximumComputeSharedMemorySize => _maximumComputeSharedMemorySize.Value;
|
||||||
public static int StorageBufferOffsetAlignment => _storageBufferOffsetAlignment.Value;
|
public static int StorageBufferOffsetAlignment => _storageBufferOffsetAlignment.Value;
|
||||||
|
|
|
@ -10,8 +10,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
|
|
||||||
private readonly TextureStorage _parent;
|
private readonly TextureStorage _parent;
|
||||||
|
|
||||||
private TextureView _incompatibleFormatView;
|
|
||||||
|
|
||||||
public ITextureInfo Storage => _parent;
|
public ITextureInfo Storage => _parent;
|
||||||
|
|
||||||
public int FirstLayer { get; private set; }
|
public int FirstLayer { get; private set; }
|
||||||
|
@ -102,35 +100,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
return _parent.CreateView(info, firstLayer, firstLevel);
|
return _parent.CreateView(info, firstLayer, firstLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetIncompatibleFormatViewHandle()
|
|
||||||
{
|
|
||||||
// AMD and Intel have a bug where the view format is always ignored;
|
|
||||||
// they use the parent format instead.
|
|
||||||
// As a workaround we create a new texture with the correct
|
|
||||||
// format, and then do a copy after the draw.
|
|
||||||
if (_parent.Info.Format != Format)
|
|
||||||
{
|
|
||||||
if (_incompatibleFormatView == null)
|
|
||||||
{
|
|
||||||
_incompatibleFormatView = (TextureView)_renderer.CreateTexture(Info, ScaleFactor);
|
|
||||||
}
|
|
||||||
|
|
||||||
_renderer.TextureCopy.CopyUnscaled(_parent, _incompatibleFormatView, FirstLayer, 0, FirstLevel, 0);
|
|
||||||
|
|
||||||
return _incompatibleFormatView.Handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SignalModified()
|
|
||||||
{
|
|
||||||
if (_incompatibleFormatView != null)
|
|
||||||
{
|
|
||||||
_renderer.TextureCopy.CopyUnscaled(_incompatibleFormatView, _parent, 0, FirstLayer, 0, FirstLevel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo(ITexture destination, int firstLayer, int firstLevel)
|
public void CopyTo(ITexture destination, int firstLayer, int firstLevel)
|
||||||
{
|
{
|
||||||
TextureView destinationView = (TextureView)destination;
|
TextureView destinationView = (TextureView)destination;
|
||||||
|
@ -634,13 +603,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
|
|
||||||
private void DisposeHandles()
|
private void DisposeHandles()
|
||||||
{
|
{
|
||||||
if (_incompatibleFormatView != null)
|
|
||||||
{
|
|
||||||
_incompatibleFormatView.Dispose();
|
|
||||||
|
|
||||||
_incompatibleFormatView = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Handle != 0)
|
if (Handle != 0)
|
||||||
{
|
{
|
||||||
GL.DeleteTexture(Handle);
|
GL.DeleteTexture(Handle);
|
||||||
|
|
|
@ -110,8 +110,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
GL.ClearBuffer(OpenTK.Graphics.OpenGL.ClearBuffer.Color, index, colors);
|
GL.ClearBuffer(OpenTK.Graphics.OpenGL.ClearBuffer.Color, index, colors);
|
||||||
|
|
||||||
RestoreComponentMask(index);
|
RestoreComponentMask(index);
|
||||||
|
|
||||||
_framebuffer.SignalModified();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearRenderTargetDepthStencil(float depthValue, bool depthMask, int stencilValue, int stencilMask)
|
public void ClearRenderTargetDepthStencil(float depthValue, bool depthMask, int stencilValue, int stencilMask)
|
||||||
|
@ -154,8 +152,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
{
|
{
|
||||||
GL.DepthMask(_depthMask);
|
GL.DepthMask(_depthMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
_framebuffer.SignalModified();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyBuffer(BufferHandle source, BufferHandle destination, int srcOffset, int dstOffset, int size)
|
public void CopyBuffer(BufferHandle source, BufferHandle destination, int srcOffset, int dstOffset, int size)
|
||||||
|
@ -1224,8 +1220,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
private void PostDraw()
|
private void PostDraw()
|
||||||
{
|
{
|
||||||
_framebuffer?.SignalModified();
|
|
||||||
|
|
||||||
if (_tfEnabled)
|
if (_tfEnabled)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Constants.MaxTransformFeedbackBuffers; i++)
|
for (int i = 0; i < Constants.MaxTransformFeedbackBuffers; i++)
|
||||||
|
|
|
@ -97,6 +97,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
HwCapabilities.SupportsAstcCompression,
|
HwCapabilities.SupportsAstcCompression,
|
||||||
HwCapabilities.SupportsImageLoadFormatted,
|
HwCapabilities.SupportsImageLoadFormatted,
|
||||||
HwCapabilities.SupportsNonConstantTextureOffset,
|
HwCapabilities.SupportsNonConstantTextureOffset,
|
||||||
|
HwCapabilities.SupportsMismatchingViewFormat,
|
||||||
HwCapabilities.SupportsViewportSwizzle,
|
HwCapabilities.SupportsViewportSwizzle,
|
||||||
HwCapabilities.MaximumComputeSharedMemorySize,
|
HwCapabilities.MaximumComputeSharedMemorySize,
|
||||||
HwCapabilities.MaximumSupportedAnisotropy,
|
HwCapabilities.MaximumSupportedAnisotropy,
|
||||||
|
|
Loading…
Reference in a new issue