Skip to content

Commit 6f6a4a7

Browse files
committed
Fix Vulkan initialization on Parallels
1 parent 773efc4 commit 6f6a4a7

2 files changed

Lines changed: 4 additions & 37 deletions

File tree

src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ static List<string> GetDeviceExtensions(VulkanInstanceApi instance, VkPhysicalDe
128128
{
129129
instance.GetPhysicalDeviceProperties(physicalDevice, out var properties);
130130

131+
var deviceName = Marshal.PtrToStringAnsi((IntPtr)properties.deviceName);
132+
if (deviceName?.StartsWith("Parallels Display Adapter", StringComparison.OrdinalIgnoreCase) == true)
133+
return null;
134+
131135
var supportedExtensions = GetDeviceExtensions(instance, physicalDevice);
132136
if (options.RequireSwapchainExtension && !supportedExtensions.Contains(VK_KHR_swapchain))
133137
return null;

src/Windows/Avalonia.Win32/Vulkan/VulkanSupport.cs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
using Avalonia.Platform;
66
using Avalonia.Platform.Surfaces;
77
using Avalonia.Vulkan;
8-
using Avalonia.Win32.DirectX;
98
using Avalonia.Win32.Interop;
10-
using MicroCom.Runtime;
119

1210
namespace Avalonia.Win32.Vulkan;
1311

@@ -18,13 +16,6 @@ internal class VulkanSupport
1816

1917
public static VulkanPlatformGraphics? TryInitialize(VulkanOptions options)
2018
{
21-
if (IsParallelsDisplayAdapter())
22-
{
23-
Logger.TryGet(LogEventLevel.Warning, "Vulkan")?.Log(null,
24-
"Parallels Display Adapter detected; skipping Vulkan initialization and falling back to the next configured rendering mode.");
25-
return null;
26-
}
27-
2819
return VulkanPlatformGraphics.TryCreate(options ?? new(), new VulkanPlatformSpecificOptions
2920
{
3021
RequiredInstanceExtensions = { "VK_KHR_win32_surface" },
@@ -37,34 +28,6 @@ internal class VulkanSupport
3728
});
3829
}
3930

40-
private static unsafe bool IsParallelsDisplayAdapter()
41-
{
42-
var factoryGuid = MicroComRuntime.GetGuidFor(typeof(IDXGIFactory1));
43-
DirectXUnmanagedMethods.CreateDXGIFactory1(ref factoryGuid, out var factoryPointer);
44-
45-
if (factoryPointer == null)
46-
return false;
47-
48-
using var factory = MicroComRuntime.CreateProxyFor<IDXGIFactory1>(factoryPointer, true);
49-
50-
for (uint index = 0; ; index++)
51-
{
52-
void* adapterPointer = null;
53-
54-
if (factory.EnumAdapters1(index, &adapterPointer) != 0 || adapterPointer == null)
55-
return false;
56-
57-
using var adapter = MicroComRuntime.CreateProxyFor<IDXGIAdapter1>(adapterPointer, true);
58-
var desc = adapter.Desc1;
59-
var description = Marshal.PtrToStringUni((IntPtr)desc.Description);
60-
61-
if (description?.StartsWith(
62-
"Parallels Display Adapter",
63-
StringComparison.OrdinalIgnoreCase) == true)
64-
return true;
65-
}
66-
}
67-
6831
internal class VulkanSurfaceFactory : IVulkanKhrSurfacePlatformSurfaceFactory
6932
{
7033
public bool CanRenderToSurface(IVulkanPlatformGraphicsContext context, IPlatformRenderSurface surface) =>

0 commit comments

Comments
 (0)