mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:59:04 -06:00 
			
		
		
		
	Use draw clear on Adreno, instead of vkCmdClearAttachments (#7013)
* Use draw clear on Adreno, instead of vkCmdClearAttachments * Fix GTX TITAN detection
This commit is contained in:
		@@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                        queue,
 | 
			
		||||
                        queueLock,
 | 
			
		||||
                        _gd.QueueFamilyIndex,
 | 
			
		||||
                        _gd.IsConcurrentFenceWaitUnsupported,
 | 
			
		||||
                        _gd.IsQualcommProprietary,
 | 
			
		||||
                        isLight: true);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -1021,7 +1021,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            _newState.RasterizerDiscardEnable = discard;
 | 
			
		||||
            SignalStateChange();
 | 
			
		||||
 | 
			
		||||
            if (!discard && Gd.Vendor == Vendor.Qualcomm)
 | 
			
		||||
            if (!discard && Gd.IsQualcommProprietary)
 | 
			
		||||
            {
 | 
			
		||||
                // On Adreno, enabling rasterizer discard somehow corrupts the viewport state.
 | 
			
		||||
                // Force it to be updated on next use to work around this bug.
 | 
			
		||||
 
 | 
			
		||||
@@ -47,10 +47,11 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (componentMask != 0xf)
 | 
			
		||||
            if (componentMask != 0xf || Gd.IsQualcommProprietary)
 | 
			
		||||
            {
 | 
			
		||||
                // We can't use CmdClearAttachments if not writing all components,
 | 
			
		||||
                // because on Vulkan, the pipeline state does not affect clears.
 | 
			
		||||
                // On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
 | 
			
		||||
                var dstTexture = FramebufferParams.GetColorView(index);
 | 
			
		||||
                if (dstTexture == null)
 | 
			
		||||
                {
 | 
			
		||||
@@ -87,10 +88,11 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (stencilMask != 0 && stencilMask != 0xff)
 | 
			
		||||
            if ((stencilMask != 0 && stencilMask != 0xff) || Gd.IsQualcommProprietary)
 | 
			
		||||
            {
 | 
			
		||||
                // We can't use CmdClearAttachments if not clearing all (mask is all ones, 0xFF) or none (mask is 0) of the stencil bits,
 | 
			
		||||
                // because on Vulkan, the pipeline state does not affect clears.
 | 
			
		||||
                // On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
 | 
			
		||||
                var dstTexture = FramebufferParams.GetDepthStencilView();
 | 
			
		||||
                if (dstTexture == null)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            Templates = BuildTemplates(usePushDescriptors);
 | 
			
		||||
 | 
			
		||||
            // Updating buffer texture bindings using template updates crashes the Adreno driver on Windows.
 | 
			
		||||
            UpdateTexturesWithoutTemplate = gd.Vendor == Vendor.Qualcomm && usesBufferTextures;
 | 
			
		||||
            UpdateTexturesWithoutTemplate = gd.IsQualcommProprietary && usesBufferTextures;
 | 
			
		||||
 | 
			
		||||
            _compileTask = Task.CompletedTask;
 | 
			
		||||
            _firstBackgroundUse = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -87,10 +87,10 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
        internal bool IsAmdGcn { get; private set; }
 | 
			
		||||
        internal bool IsNvidiaPreTuring { get; private set; }
 | 
			
		||||
        internal bool IsIntelArc { get; private set; }
 | 
			
		||||
        internal bool IsQualcommProprietary { get; private set; }
 | 
			
		||||
        internal bool IsMoltenVk { get; private set; }
 | 
			
		||||
        internal bool IsTBDR { get; private set; }
 | 
			
		||||
        internal bool IsSharedMemory { get; private set; }
 | 
			
		||||
        internal bool IsConcurrentFenceWaitUnsupported { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public string GpuVendor { get; private set; }
 | 
			
		||||
        public string GpuDriver { get; private set; }
 | 
			
		||||
@@ -325,8 +325,6 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                Vendor == Vendor.Broadcom ||
 | 
			
		||||
                Vendor == Vendor.ImgTec;
 | 
			
		||||
 | 
			
		||||
            IsConcurrentFenceWaitUnsupported = Vendor == Vendor.Qualcomm;
 | 
			
		||||
 | 
			
		||||
            GpuVendor = VendorUtils.GetNameFromId(properties.VendorID);
 | 
			
		||||
            GpuDriver = hasDriverProperties && !OperatingSystem.IsMacOS() ?
 | 
			
		||||
                VendorUtils.GetFriendlyDriverName(driverProperties.DriverID) : GpuVendor; // Fallback to vendor name if driver is unavailable or on MacOS where vendor is preferred.
 | 
			
		||||
@@ -348,7 +346,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                {
 | 
			
		||||
                    IsNvidiaPreTuring = gpuNumber < 2000;
 | 
			
		||||
                }
 | 
			
		||||
                else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
 | 
			
		||||
                else if (GpuRenderer.Contains("TITAN") && !GpuRenderer.Contains("RTX"))
 | 
			
		||||
                {
 | 
			
		||||
                    IsNvidiaPreTuring = true;
 | 
			
		||||
                }
 | 
			
		||||
@@ -358,6 +356,8 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                IsIntelArc = GpuRenderer.StartsWith("Intel(R) Arc(TM)");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IsQualcommProprietary = hasDriverProperties && driverProperties.DriverID == DriverId.QualcommProprietary;
 | 
			
		||||
 | 
			
		||||
            ulong minResourceAlignment = Math.Max(
 | 
			
		||||
                Math.Max(
 | 
			
		||||
                    properties.Limits.MinStorageBufferOffsetAlignment,
 | 
			
		||||
@@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtExternalMemoryHost hostMemoryApi);
 | 
			
		||||
            HostMemoryAllocator = new HostMemoryAllocator(MemoryAllocator, Api, hostMemoryApi, _device);
 | 
			
		||||
 | 
			
		||||
            CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsConcurrentFenceWaitUnsupported);
 | 
			
		||||
            CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsQualcommProprietary);
 | 
			
		||||
 | 
			
		||||
            PipelineLayoutCache = new PipelineLayoutCache();
 | 
			
		||||
 | 
			
		||||
@@ -692,7 +692,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                GpuVendor,
 | 
			
		||||
                memoryType: memoryType,
 | 
			
		||||
                hasFrontFacingBug: IsIntelWindows,
 | 
			
		||||
                hasVectorIndexingBug: Vendor == Vendor.Qualcomm,
 | 
			
		||||
                hasVectorIndexingBug: IsQualcommProprietary,
 | 
			
		||||
                needsFragmentOutputSpecialization: IsMoltenVk,
 | 
			
		||||
                reduceShaderPrecision: IsMoltenVk,
 | 
			
		||||
                supportsAstcCompression: features2.Features.TextureCompressionAstcLdr && supportsAstcFormats,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user