public Device(InstanceBase instance, DeviceType type, AdapterInfo[] adapters) : base(instance, type) { if (adapters == null || adapters.Length <= 1) { throw new ArgumentException("Adapters must be at least two in length"); } devices = new DeviceBase[adapters.Length]; for (int i = 0; i != devices.Length; ++i) { // allocate API specific device if (instance is D3D12.Instance) { devices[i] = new D3D12.Device((D3D12.Instance)instance, adapters[i].isPrimary ? type : DeviceType.Background); } else if (instance is Vulkan.Instance) { devices[i] = new Vulkan.Device((Vulkan.Instance)instance, adapters[i].isPrimary ? type : DeviceType.Background); } else { throw new NotImplementedException("Failed to create devices based on instance type: " + instance.GetType().ToString()); } // set primary device if (adapters[i].isPrimary) { primaryDevice = devices[i]; } } }
public static bool InitFirstAvaliable(AbstractionDesc desc, out InstanceBase instance, out DeviceBase device) { if (desc.supportedAPIs == null) { instance = null; device = null; return(false); } foreach (var api in desc.supportedAPIs) { switch (api) { #if WIN32 || WIN32 case AbstractionAPI.D3D12: { if (!LoadNativeLib(Path.Combine(desc.nativeLibPathD3D12, D3D12.Instance.lib))) { continue; } var instanceD3D12 = new D3D12.Instance(); if (instanceD3D12.Init(desc.instanceDescD3D12)) { var deviceD3D12 = new D3D12.Device(instanceD3D12, desc.type); if (deviceD3D12.Init(desc.deviceDescD3D12)) { instance = instanceD3D12; device = deviceD3D12; return(true); } deviceD3D12.Dispose(); instanceD3D12.Dispose(); } else { instanceD3D12.Dispose(); } } break; case AbstractionAPI.Vulkan: { if (!LoadNativeLib(Path.Combine(desc.nativeLibPathVulkan, "vulkan-1.dll"))) { continue; } if (!LoadNativeLib(Path.Combine(desc.nativeLibPathVulkan, Vulkan.Instance.lib))) { continue; } var instanceVulkan = new Vulkan.Instance(); if (instanceVulkan.Init(desc.instanceDescVulkan)) { var deviceVulkan = new Vulkan.Device(instanceVulkan, desc.type); if (deviceVulkan.Init(desc.deviceDescVulkan)) { instance = instanceVulkan; device = deviceVulkan; return(true); } deviceVulkan.Dispose(); instanceVulkan.Dispose(); } else { instanceVulkan.Dispose(); } } break; #endif } } instance = null; device = null; return(false); }