Exemplo n.º 1
0
        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);
        }