diff --git a/src/Ryujinx.Graphics.GAL/Capabilities.cs b/src/Ryujinx.Graphics.GAL/Capabilities.cs index 1eec80e51..fbda13f8e 100644 --- a/src/Ryujinx.Graphics.GAL/Capabilities.cs +++ b/src/Ryujinx.Graphics.GAL/Capabilities.cs @@ -27,6 +27,7 @@ namespace Ryujinx.Graphics.GAL public readonly bool SupportsSparseBuffer; public readonly bool Supports5BitComponentFormat; public readonly bool SupportsBlendEquationAdvanced; + public readonly bool SupportsFastDmaTextureCopy; public readonly bool SupportsFragmentShaderInterlock; public readonly bool SupportsFragmentShaderOrderingIntel; public readonly bool SupportsGeometryShader; @@ -95,6 +96,7 @@ namespace Ryujinx.Graphics.GAL bool supports5BitComponentFormat, bool supportsSparseBuffer, bool supportsBlendEquationAdvanced, + bool supportsFastDmaTextureCopy, bool supportsFragmentShaderInterlock, bool supportsFragmentShaderOrderingIntel, bool supportsGeometryShader, @@ -157,6 +159,7 @@ namespace Ryujinx.Graphics.GAL Supports5BitComponentFormat = supports5BitComponentFormat; SupportsSparseBuffer = supportsSparseBuffer; SupportsBlendEquationAdvanced = supportsBlendEquationAdvanced; + SupportsFastDmaTextureCopy = supportsFastDmaTextureCopy; SupportsFragmentShaderInterlock = supportsFragmentShaderInterlock; SupportsFragmentShaderOrderingIntel = supportsFragmentShaderOrderingIntel; SupportsGeometryShader = supportsGeometryShader; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs index c10085335..f650e4de1 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs @@ -288,9 +288,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma bool completeSource = IsTextureCopyComplete(src, srcLinear, srcBpp, srcStride, xCount, yCount); bool completeDest = IsTextureCopyComplete(dst, dstLinear, dstBpp, dstStride, xCount, yCount); - // Check if the source texture exists on the GPU, if it does, do a GPU side copy. + // Check if the source texture exists on the GPU, if it does, do a GPU-side copy. // Otherwise, we would need to flush the source texture which is costly. - // We don't expect the source to be linear in such cases, as linear source usually indicates buffer or CPU written data. + // We don't expect the source to be linear in such cases, as linear source usually indicates buffer or CPU-written data. if (completeSource && completeDest && !srcLinear && isIdentityRemap) { @@ -308,9 +308,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma if (source != null && source.Height == yCount) { - // HACK: Exclude RGBA16Float texture format for fast DMA copy on Apple silicon. + // HACK: Exclude RGBA16Float texture format for fast DMA copy on Apple Silicon. // Fixes Sonic Frontiers when VK_EXT_external_memory_host is not available. - bool skipDma = _context.Capabilities.VendorName == "Apple" && + bool skipDma = !_context.Capabilities.SupportsFastDmaTextureCopy && source.Info.FormatInfo.Format == Format.R16G16B16A16Float; if (!skipDma) diff --git a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs index af1494bbe..049d226d4 100644 --- a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs +++ b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs @@ -169,6 +169,7 @@ namespace Ryujinx.Graphics.OpenGL supports5BitComponentFormat: true, supportsSparseBuffer: false, supportsBlendEquationAdvanced: HwCapabilities.SupportsBlendEquationAdvanced, + supportsFastDmaTextureCopy: true, supportsFragmentShaderInterlock: HwCapabilities.SupportsFragmentShaderInterlock, supportsFragmentShaderOrderingIntel: HwCapabilities.SupportsFragmentShaderOrdering, supportsGeometryShader: true, diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 5f1c50b00..c9342cdfe 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -760,6 +760,7 @@ namespace Ryujinx.Graphics.Vulkan supports5BitComponentFormat: supports5BitComponentFormat, supportsSparseBuffer: features2.Features.SparseBinding && mainQueueProperties.QueueFlags.HasFlag(QueueFlags.SparseBindingBit), supportsBlendEquationAdvanced: Capabilities.SupportsBlendEquationAdvanced, + supportsFastDmaTextureCopy: !IsMoltenVk, supportsFragmentShaderInterlock: Capabilities.SupportsFragmentShaderInterlock, supportsFragmentShaderOrderingIntel: false, supportsGeometryShader: Capabilities.SupportsGeometryShader,