forked from Mirror/Ryujinx
Disable push descriptors for Intel ARC GPUs on Windows (#6551)
* Move some init logic out of PrintGpuInformation, then delete it * Disable push descriptors for Intel ARC on Windows * Re-add PrintGpuInformation just to show it in the log
This commit is contained in:
parent
43514771bf
commit
72bdc24db8
2 changed files with 58 additions and 44 deletions
|
@ -111,8 +111,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
bool usePushDescriptors = !isMinimal &&
|
bool usePushDescriptors = !isMinimal &&
|
||||||
VulkanConfiguration.UsePushDescriptors &&
|
VulkanConfiguration.UsePushDescriptors &&
|
||||||
_gd.Capabilities.SupportsPushDescriptors &&
|
_gd.Capabilities.SupportsPushDescriptors &&
|
||||||
!_gd.IsNvidiaPreTuring &&
|
|
||||||
!IsCompute &&
|
!IsCompute &&
|
||||||
|
!HasPushDescriptorsBug(gd) &&
|
||||||
CanUsePushDescriptors(gd, resourceLayout, IsCompute);
|
CanUsePushDescriptors(gd, resourceLayout, IsCompute);
|
||||||
|
|
||||||
ReadOnlyCollection<ResourceDescriptorCollection> sets = usePushDescriptors ?
|
ReadOnlyCollection<ResourceDescriptorCollection> sets = usePushDescriptors ?
|
||||||
|
@ -147,6 +147,12 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
_firstBackgroundUse = !fromCache;
|
_firstBackgroundUse = !fromCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool HasPushDescriptorsBug(VulkanRenderer gd)
|
||||||
|
{
|
||||||
|
// Those GPUs/drivers do not work properly with push descriptors, so we must force disable them.
|
||||||
|
return gd.IsNvidiaPreTuring || (gd.IsIntelArc && gd.IsIntelWindows);
|
||||||
|
}
|
||||||
|
|
||||||
private static bool CanUsePushDescriptors(VulkanRenderer gd, ResourceLayout layout, bool isCompute)
|
private static bool CanUsePushDescriptors(VulkanRenderer gd, ResourceLayout layout, bool isCompute)
|
||||||
{
|
{
|
||||||
// If binding 3 is immediately used, use an alternate set of reserved bindings.
|
// If binding 3 is immediately used, use an alternate set of reserved bindings.
|
||||||
|
|
|
@ -87,6 +87,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
internal bool IsIntelWindows { get; private set; }
|
internal bool IsIntelWindows { get; private set; }
|
||||||
internal bool IsAmdGcn { get; private set; }
|
internal bool IsAmdGcn { get; private set; }
|
||||||
internal bool IsNvidiaPreTuring { get; private set; }
|
internal bool IsNvidiaPreTuring { get; private set; }
|
||||||
|
internal bool IsIntelArc { get; private set; }
|
||||||
internal bool IsMoltenVk { get; private set; }
|
internal bool IsMoltenVk { get; private set; }
|
||||||
internal bool IsTBDR { get; private set; }
|
internal bool IsTBDR { get; private set; }
|
||||||
internal bool IsSharedMemory { get; private set; }
|
internal bool IsSharedMemory { get; private set; }
|
||||||
|
@ -310,6 +311,51 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
ref var properties = ref properties2.Properties;
|
ref var properties = ref properties2.Properties;
|
||||||
|
|
||||||
|
var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
|
||||||
|
|
||||||
|
string vendorName = VendorUtils.GetNameFromId(properties.VendorID);
|
||||||
|
|
||||||
|
Vendor = VendorUtils.FromId(properties.VendorID);
|
||||||
|
|
||||||
|
IsAmdWindows = Vendor == Vendor.Amd && OperatingSystem.IsWindows();
|
||||||
|
IsIntelWindows = Vendor == Vendor.Intel && OperatingSystem.IsWindows();
|
||||||
|
IsTBDR =
|
||||||
|
Vendor == Vendor.Apple ||
|
||||||
|
Vendor == Vendor.Qualcomm ||
|
||||||
|
Vendor == Vendor.ARM ||
|
||||||
|
Vendor == Vendor.Broadcom ||
|
||||||
|
Vendor == Vendor.ImgTec;
|
||||||
|
|
||||||
|
GpuVendor = vendorName;
|
||||||
|
GpuDriver = hasDriverProperties ? Marshal.PtrToStringAnsi((IntPtr)driverProperties.DriverName) : vendorName; // Fall back to vendor name if driver name isn't available.
|
||||||
|
|
||||||
|
fixed (byte* deviceName = properties.DeviceName)
|
||||||
|
{
|
||||||
|
GpuRenderer = Marshal.PtrToStringAnsi((IntPtr)deviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}";
|
||||||
|
|
||||||
|
IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer);
|
||||||
|
|
||||||
|
if (Vendor == Vendor.Nvidia)
|
||||||
|
{
|
||||||
|
var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
|
||||||
|
|
||||||
|
if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber))
|
||||||
|
{
|
||||||
|
IsNvidiaPreTuring = gpuNumber < 2000;
|
||||||
|
}
|
||||||
|
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
|
||||||
|
{
|
||||||
|
IsNvidiaPreTuring = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Vendor == Vendor.Intel)
|
||||||
|
{
|
||||||
|
IsIntelArc = GpuRenderer.StartsWith("Intel(R) Arc(TM)");
|
||||||
|
}
|
||||||
|
|
||||||
ulong minResourceAlignment = Math.Max(
|
ulong minResourceAlignment = Math.Max(
|
||||||
Math.Max(
|
Math.Max(
|
||||||
properties.Limits.MinStorageBufferOffsetAlignment,
|
properties.Limits.MinStorageBufferOffsetAlignment,
|
||||||
|
@ -732,49 +778,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
return ParseStandardVulkanVersion(driverVersionRaw);
|
return ParseStandardVulkanVersion(driverVersionRaw);
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe void PrintGpuInformation()
|
|
||||||
{
|
|
||||||
var properties = _physicalDevice.PhysicalDeviceProperties;
|
|
||||||
|
|
||||||
var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
|
|
||||||
|
|
||||||
string vendorName = VendorUtils.GetNameFromId(properties.VendorID);
|
|
||||||
|
|
||||||
Vendor = VendorUtils.FromId(properties.VendorID);
|
|
||||||
|
|
||||||
IsAmdWindows = Vendor == Vendor.Amd && OperatingSystem.IsWindows();
|
|
||||||
IsIntelWindows = Vendor == Vendor.Intel && OperatingSystem.IsWindows();
|
|
||||||
IsTBDR =
|
|
||||||
Vendor == Vendor.Apple ||
|
|
||||||
Vendor == Vendor.Qualcomm ||
|
|
||||||
Vendor == Vendor.ARM ||
|
|
||||||
Vendor == Vendor.Broadcom ||
|
|
||||||
Vendor == Vendor.ImgTec;
|
|
||||||
|
|
||||||
GpuVendor = vendorName;
|
|
||||||
GpuDriver = hasDriverProperties ? Marshal.PtrToStringAnsi((IntPtr)driverProperties.DriverName) : vendorName; // Fall back to vendor name if driver name isn't available.
|
|
||||||
GpuRenderer = Marshal.PtrToStringAnsi((IntPtr)properties.DeviceName);
|
|
||||||
GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}";
|
|
||||||
|
|
||||||
IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer);
|
|
||||||
|
|
||||||
if (Vendor == Vendor.Nvidia)
|
|
||||||
{
|
|
||||||
var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
|
|
||||||
|
|
||||||
if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber))
|
|
||||||
{
|
|
||||||
IsNvidiaPreTuring = gpuNumber < 2000;
|
|
||||||
}
|
|
||||||
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
|
|
||||||
{
|
|
||||||
IsNvidiaPreTuring = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})");
|
|
||||||
}
|
|
||||||
|
|
||||||
internal PrimitiveTopology TopologyRemap(PrimitiveTopology topology)
|
internal PrimitiveTopology TopologyRemap(PrimitiveTopology topology)
|
||||||
{
|
{
|
||||||
return topology switch
|
return topology switch
|
||||||
|
@ -798,6 +801,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void PrintGpuInformation()
|
||||||
|
{
|
||||||
|
Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})");
|
||||||
|
}
|
||||||
|
|
||||||
public void Initialize(GraphicsDebugLevel logLevel)
|
public void Initialize(GraphicsDebugLevel logLevel)
|
||||||
{
|
{
|
||||||
SetupContext(logLevel);
|
SetupContext(logLevel);
|
||||||
|
|
Reference in a new issue