Store a boolean for if Fast DMA texture copy is supported instead of checking vendor every time

This commit is contained in:
GreemDev 2025-11-16 18:19:46 -06:00
parent 916350220b
commit 6eae694954
4 changed files with 9 additions and 4 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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,

View file

@ -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,