Exemplo n.º 1
0
        /// <summary>
        ///     Returns the adapter for the specified device.
        /// </summary>
        /// <param name="adapter">
        ///     The address of an <seealso cref="IDXGIAdapter" /> interface pointer to the adapter. This
        ///     parameter must not be <seealso langword="null" />.
        /// </param>
        public int GetAdapter(out IDXGIAdapter adapter)
        {
            int result = GetMethodDelegate <GetAdapterDelegate>().Invoke(this, out IntPtr adapterPtr);

            adapter = result == 0 ? new DXGIAdapter(adapterPtr) : null;
            return(result);
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            using var factory = new IDXGIFactory();

            var hr = dxgi.CreateDXGIFactory(ref factory.GetIID(), ref factory.NewPtr);

            if (hr != 0)
            {
                throw new System.Runtime.InteropServices.COMException("CreateDXGIFactory", hr);
            }

            for (uint i = 0; ; ++i)
            {
                using var adapter = new IDXGIAdapter();
                hr = factory.EnumAdapters(i, ref adapter.NewPtr);
                if (hr != 0)
                {
                    break;
                }

                DXGI_ADAPTER_DESC desc = default;
                adapter.GetDesc(ref desc);
                Console.WriteLine(desc.Description);
            }
        }
Exemplo n.º 3
0
        public static int GetIndex(this IDXGIAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            using (var fac = DXGIFunctions.CreateDXGIFactory1())
            {
                var desc = adapter.GetDesc();
                int i    = 0;
                do
                {
                    if (fac.Object.EnumAdapters((uint)i, out var a).IsError)
#if DEBUG
                    { throw new InvalidOperationException(); }
#else
                    { return(-1);  // wot?
                    }
#endif

                    var desca = a.GetDesc();
                    if (desca.AdapterLuid.luid == desc.AdapterLuid.luid)
                    {
                        return(i);
                    }

                    i++;
                }while (true);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Gets the highest supported hardware feature level of the primary adapter.
        /// </summary>
        /// <param name="adapter">The <see cref="IDXGIAdapter"/>.</param>
        /// <returns>The highest supported hardware feature level.</returns>
        public static FeatureLevel GetSupportedFeatureLevel(IDXGIAdapter adapter)
        {
            var                 featureLevel = FeatureLevel.Level_9_1;
            ID3D11Device        device       = null;
            ID3D11DeviceContext context      = null;

            try
            {
                D3D11CreateDevice(
                    adapter,
                    DriverType.Unknown,
                    IntPtr.Zero,
                    0,
                    null, 0,
                    SdkVersion,
                    out device, out featureLevel, out context);
            }
            finally
            {
                context?.Dispose();
                device?.Dispose();
            }

            return(featureLevel);
        }
Exemplo n.º 5
0
        private static Result RawD3D11CreateDeviceNoDeviceAndContext(
            IDXGIAdapter adapter,
            DriverType driverType,
            DeviceCreationFlags flags,
            FeatureLevel[] featureLevels,
            out FeatureLevel featureLevel)
        {
            unsafe
            {
                var adapterPtr = CppObject.ToCallbackPtr <IDXGIAdapter>(adapter);
                fixed(void *featureLevelPtr = &featureLevel)
                {
                    Result result = D3D11CreateDevice_(
                        (void *)adapterPtr,
                        (int)driverType,
                        null,
                        (int)flags,
                        featureLevels != null && featureLevels.Length > 0 ? Unsafe.AsPointer(ref featureLevels[0]) : null,
                        featureLevels?.Length ?? 0,
                        SdkVersion,
                        null,
                        featureLevelPtr,
                        null);

                    GC.KeepAlive(adapter);
                    return(result);
                }
            }
        }
Exemplo n.º 6
0
        public static Result D3D11CreateDevice(IDXGIAdapter adapter,
                                               DriverType driverType,
                                               DeviceCreationFlags flags,
                                               FeatureLevel[] featureLevels,
                                               out ID3D11Device device,
                                               out FeatureLevel featureLevel,
                                               out ID3D11DeviceContext immediateContext)
        {
            var result = D3D11CreateDevice(adapter, driverType, IntPtr.Zero,
                                           (int)flags,
                                           featureLevels,
                                           (featureLevels != null) ? featureLevels.Length : 0,
                                           SdkVersion,
                                           out device,
                                           out featureLevel,
                                           out immediateContext);

            if (result.Failure)
            {
                return(result);
            }

            if (immediateContext != null)
            {
                device.AddRef();
                device.ImmediateContext__ = immediateContext;
                immediateContext.Device__ = device;
            }

            return(result);
        }
Exemplo n.º 7
0
        public static IComObject <ID3D11Device> D3D11CreateDevice(
            IDXGIAdapter adapter,
            D3D_DRIVER_TYPE driverType,
            D3D11_CREATE_DEVICE_FLAG flags,
            D3D_FEATURE_LEVEL[] featureLevels = null,
            uint sdkVersion = Constants.D3D11_SDK_VERSION)
        {
            //featureLevels = featureLevels ?? new D3D_FEATURE_LEVEL[]
            //{
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_1,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_0,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_10_1,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_10_0,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_3,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_2,
            //        D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_1
            //};

            D3D11CreateDevice(
                adapter,
                driverType,
                IntPtr.Zero,
                (uint)flags,
                featureLevels,
                (uint)(featureLevels?.Length).GetValueOrDefault(),
                sdkVersion,
                out ID3D11Device device,
                out D3D_FEATURE_LEVEL level,
                out ID3D11DeviceContext dc).ThrowOnError();
            if (dc != null)
            {
                Marshal.ReleaseComObject(dc);
            }
            return(new ComObject <ID3D11Device>(device));
        }
Exemplo n.º 8
0
        public static T D3D12CreateDevice <T>(IDXGIAdapter adapter, FeatureLevel minFeatureLevel) where T : ID3D12Device
        {
            Result result = D3D12CreateDevice(adapter, minFeatureLevel, typeof(T).GUID, out IntPtr nativePtr);

            if (result.Failure)
            {
                return(default);
Exemplo n.º 9
0
        /// <summary>Enumerates the adapters (video cards).</summary>
        /// <param name="adapterIndex">The index of the adapter to enumerate.</param>
        /// <param name="adapter">
        ///     The address of a pointer to as <seealso cref="IDXGIAdapter" /> interface at the position specified by the Adapter
        ///     parameter. This parameter must not be NULL.
        /// </param>
        /// <returns>
        ///     Returns S_OK if successful; otherwise, returns DXGI_ERR_NOT_FOUND if the index is greater than or equal to the
        ///     number of adapters in the local system, or DXGI_ERR_INVALID_CALL if ppAdapter parameter is NULL.
        /// </returns>
        public int EnumAdapters(uint adapterIndex, out IDXGIAdapter adapter)
        {
            int result = GetMethodDelegate <EnumAdaptersDelegate>().Invoke(this, adapterIndex, out IntPtr adapterPtr);

            adapter = result == 0 ? new DXGIAdapter(adapterPtr) : null;

            return(result);
        }
Exemplo n.º 10
0
 public static Result D3D11CreateDevice(IDXGIAdapter adapter,
                                        DriverType driverType,
                                        DeviceCreationFlags flags,
                                        FeatureLevel[] featureLevels,
                                        out ID3D11Device device)
 {
     return(D3D11CreateDevice(adapter, driverType, flags, featureLevels, out device, out var featureLevel, out var immediateContext));
 }
Exemplo n.º 11
0
        internal static unsafe Result D3D12CreateDeviceNoDevice(IDXGIAdapter adapter, FeatureLevel minFeatureLevel)
        {
            var adapterPtr = CppObject.ToCallbackPtr <IDXGIAdapter>(adapter);
            var riid       = typeof(ID3D12Device).GUID;
            var result     = D3D12CreateDevice_((void *)adapterPtr, (int)minFeatureLevel, &riid, null);

            GC.KeepAlive(adapter);
            return(result);
        }
Exemplo n.º 12
0
        public static DXGI_ADAPTER_DESC GetDesc(this IDXGIAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            adapter.GetDesc(out var desc).ThrowOnError();
            return(desc);
        }
Exemplo n.º 13
0
 public static Result D3D11CreateDevice(IDXGIAdapter adapter, DriverType driverType, DeviceCreationFlags flags, FeatureLevel[] featureLevels,
                                        out ID3D11Device?device)
 {
     return(RawD3D11CreateDeviceNoContext(
                adapter != null ? adapter.NativePointer : IntPtr.Zero,
                driverType,
                flags,
                featureLevels,
                out device,
                out _));
 }
Exemplo n.º 14
0
 public static extern int D3D11CreateDevice(
     [MarshalAs(UnmanagedType.Interface)] IDXGIAdapter pAdapter,
     D3D_DRIVER_TYPE DriverType,
     IntPtr Software,
     D3D11_CREATE_DEVICE_FLAG Flags,
     D3D_FEATURE_LEVEL[] pFeatureLevels,
     UINT FeatureLevels,
     UINT SDKVersion,
     [MarshalAs(UnmanagedType.Interface)] out ID3D11Device ppDevice,
     out D3D_FEATURE_LEVEL pFeatureLevel,
     [MarshalAs(UnmanagedType.Interface)] out ID3D11DeviceContext ppImmediateContext
     );
Exemplo n.º 15
0
 /// <summary>
 /// Checks whether Direct3D12 is supported with given adapter and minimum feature level.
 /// </summary>
 /// <param name="adapter">The <see cref="IDXGIAdapter"/> to use.</param>
 /// <param name="minFeatureLevel">Minimum feature level.</param>
 /// <returns>True if supported, false otherwise.</returns>
 public static bool IsSupported(IDXGIAdapter adapter, FeatureLevel minFeatureLevel = FeatureLevel.Level_11_0)
 {
     try
     {
         return(D3D12CreateDeviceNoDevice(adapter, minFeatureLevel).Success);
     }
     catch (DllNotFoundException)
     {
         // On pre Windows 10 d3d12.dll is not present and therefore not supported.
         return(false);
     }
 }
Exemplo n.º 16
0
        public static Result D3D12CreateDevice <T>(IDXGIAdapter adapter, FeatureLevel minFeatureLevel, out T device) where T : ID3D12Device
        {
            Result result = D3D12CreateDevice(adapter, minFeatureLevel, typeof(T).GUID, out IntPtr nativePtr);

            if (result.Failure)
            {
                device = default;
                return(result);
            }

            device = CppObject.FromPointer <T>(nativePtr);
            return(result);
        }
Exemplo n.º 17
0
        public static Result D3D12CreateDevice(IDXGIAdapter adapter, FeatureLevel minFeatureLevel, out ID3D12Device device)
        {
            var result = D3D12CreateDevice(adapter, minFeatureLevel, typeof(ID3D12Device).GUID, out var nativePtr);

            if (result.Failure)
            {
                device = null;
                return(result);
            }

            device = new ID3D12Device(nativePtr);
            return(result);
        }
Exemplo n.º 18
0
 public static Result D3D11CreateDevice(IDXGIAdapter adapter,
                                        DriverType driverType,
                                        DeviceCreationFlags flags,
                                        FeatureLevel[] featureLevels,
                                        out ID3D11Device device)
 {
     return(RawD3D11CreateDeviceNoContext(
                adapter,
                driverType,
                flags,
                featureLevels,
                out device,
                out _));
 }
Exemplo n.º 19
0
        /// <summary>
        /// Gets the highest supported hardware feature level of the primary adapter.
        /// </summary>
        /// <param name="adapter">The <see cref="IDXGIAdapter"/>.</param>
        /// <returns>The highest supported hardware feature level.</returns>
        public static FeatureLevel GetSupportedFeatureLevel(IDXGIAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter), "Invalid adapter");
            }

            RawD3D11CreateDeviceNoDeviceAndContext(
                adapter,
                DriverType.Unknown,
                DeviceCreationFlags.None,
                null,
                out var featureLevel);
            return(featureLevel);
        }
Exemplo n.º 20
0
        /// <summary>
        /// Checks whether Direct3D12 is supported with given adapter and minimum feature level.
        /// </summary>
        /// <param name="adapter">The <see cref="IDXGIAdapter"/> to use.</param>
        /// <param name="minFeatureLevel">Minimum feature level.</param>
        /// <returns>True if supported, false otherwise.</returns>
        public static bool IsSupported(IDXGIAdapter adapter, FeatureLevel minFeatureLevel = FeatureLevel.Level_11_0)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            try
            {
                return(D3D12CreateDeviceNoDevice(adapter.NativePointer, minFeatureLevel).Success);
            }
            catch (DllNotFoundException)
            {
                // On pre Windows 10 d3d12.dll is not present and therefore not supported.
                return(false);
            }
        }
Exemplo n.º 21
0
        public static Result D3D11CreateDevice(IDXGIAdapter adapter,
                                               DriverType driverType,
                                               DeviceCreationFlags flags,
                                               FeatureLevel[] featureLevels,
                                               out ID3D11Device device)
        {
            ID3D11DeviceContext context = null;

            try
            {
                return(D3D11CreateDevice(adapter, driverType, flags, featureLevels, out device, out var featureLevel, out context));
            }
            finally
            {
                context?.Dispose();
            }
        }
Exemplo n.º 22
0
        /// <summary>
        /// Gets the highest supported hardware feature level of the primary adapter.
        /// </summary>
        /// <param name="adapter">The <see cref="IDXGIAdapter"/>.</param>
        /// <param name="minFeatureLevel">Thje</param>
        /// <returns>The highest supported hardware feature level.</returns>
        public static FeatureLevel GetMaxSupportedFeatureLevel(IDXGIAdapter adapter, FeatureLevel minFeatureLevel = FeatureLevel.Level_11_0)
        {
            ID3D12Device device = null;

            try
            {
                D3D12CreateDevice(adapter, minFeatureLevel, out device);
                return(device.CheckMaxSupportedFeatureLevel(FeatureLevels));
            }
            catch
            {
                return(FeatureLevel.Level_9_1);
            }
            finally
            {
                device?.Dispose();
            }
        }
Exemplo n.º 23
0
        public static IEnumerable <ComObject <IDXGIOutput1> > EnumOutputs(this IDXGIAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            uint i = 0;

            do
            {
                if (adapter.EnumOutputs(i++, out var output).IsError)
                {
                    yield break;
                }

                yield return(new ComObject <IDXGIOutput1>((IDXGIOutput1)output));
            }while (true);
        }
Exemplo n.º 24
0
        /// <summary>
        /// Check if a feature level is supported by a particular adapter.
        /// </summary>
        /// <param name="adapter">The adapter.</param>
        /// <param name="featureLevel">The feature level.</param>
        /// <param name="flags">The <see cref="DeviceCreationFlags"/> flags.</param>
        /// <returns><c>true</c> if the specified adapter is supporting this feature level; otherwise, <c>false</c>.</returns>
        public static unsafe bool IsSupportedFeatureLevel(
            IDXGIAdapter adapter,
            FeatureLevel featureLevel,
            DeviceCreationFlags flags = DeviceCreationFlags.None)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter), "Invalid adapter");
            }

            var result = RawD3D11CreateDeviceNoDeviceAndContext(
                adapter,
                DriverType.Unknown,
                flags,
                new[] { featureLevel },
                out var outputLevel);

            return(result.Success && outputLevel == featureLevel);
        }
Exemplo n.º 25
0
        public static ID3D11Device CreateDevice(IDXGIAdapter adapter)
        {
            IntPtr adapterPointer = adapter != null ? adapter.NativePointer : IntPtr.Zero;
            IntPtr devicePointer  = IntPtr.Zero;
            IntPtr contextPointer = IntPtr.Zero;
            IntPtr featureLevel   = IntPtr.Zero;
            int    result         = CreateD3D11Device(
                adapterPointer,
                adapter != null ? 0 : 1,
                IntPtr.Zero,
                2,
                IntPtr.Zero,
                0,
                sdkVersion,
                out devicePointer,
                out featureLevel,
                out contextPointer
                );

            return(new ID3D11Device(devicePointer));
        }
Exemplo n.º 26
0
        public static ID3D11Device CreateDevice(IDXGIAdapter adapter)
        {
            IntPtr adapterPointer = adapter != null ? adapter.NativePointer : IntPtr.Zero;
            IntPtr devicePointer = IntPtr.Zero;
            IntPtr contextPointer = IntPtr.Zero;
            IntPtr featureLevel = IntPtr.Zero;
            int result = CreateD3D11Device(
                adapterPointer,
                adapter != null ? 0 : 1,
                IntPtr.Zero,
                2,
                IntPtr.Zero,
                0,
                sdkVersion,
                out devicePointer,
                out featureLevel,
                out contextPointer
            );

            return new ID3D11Device(devicePointer);
        }
Exemplo n.º 27
0
        private static Result RawD3D11CreateDeviceNoContext(
            IDXGIAdapter adapter,
            DriverType driverType,
            DeviceCreationFlags flags,
            FeatureLevel[] featureLevels,
            out ID3D11Device device,
            out FeatureLevel featureLevel)
        {
            unsafe
            {
                device = default;
                var adapterPtr = CppObject.ToCallbackPtr <IDXGIAdapter>(adapter);
                fixed(void *featureLevelsPtr = &featureLevels[0])
                fixed(void *featureLevelPtr = &featureLevel)
                {
                    var    devicePtr = IntPtr.Zero;
                    Result result    = D3D11CreateDevice_(
                        (void *)adapterPtr,
                        (int)driverType,
                        null,
                        (int)flags,
                        featureLevels != null && featureLevels.Length > 0 ? featureLevelsPtr : null,
                        featureLevels?.Length ?? 0,
                        SdkVersion,
                        &devicePtr,
                        featureLevelPtr,
                        null);

                    if (result.Success && devicePtr != IntPtr.Zero)
                    {
                        device = new ID3D11Device(devicePtr);
                    }

                    GC.KeepAlive(adapter);
                    return(result);
                }
            }
        }
Exemplo n.º 28
0
        /// <summary>
        /// Check if a feature level is supported by a particular adapter.
        /// </summary>
        /// <param name="adapter">The adapter.</param>
        /// <param name="featureLevel">The feature level.</param>
        /// <returns><c>true</c> if the specified adapter is supporting this feature level; otherwise, <c>false</c>.</returns>
        public static bool IsSupportedFeatureLevel(IDXGIAdapter adapter, FeatureLevel featureLevel)
        {
            ID3D11Device        device  = null;
            ID3D11DeviceContext context = null;

            try
            {
                var result = D3D11CreateDevice(
                    adapter,
                    DriverType.Unknown,
                    IntPtr.Zero,
                    0,
                    new[] { featureLevel }, 1,
                    SdkVersion,
                    out device, out var outputLevel, out context);
                return(result.Success && outputLevel == featureLevel);
            }
            finally
            {
                context?.Dispose();
                device?.Dispose();
            }
        }
Exemplo n.º 29
0
        internal void InitializeFromImpl()
        {
            if (CreateDXGIFactory2(true, out IDXGIFactory4 tempDXGIFactory4).Failure)
            {
                throw new InvalidOperationException("Cannot create IDXGIFactory4");
            }


            NativeFactory = tempDXGIFactory4;


            NativeFactory.EnumAdapters1(1, out var adapter);

            AdapterDescription1 desc = adapter.Description1;



            Adapters.Add(adapter);
            Description.Add(adapter.Description.Description);
            VendorId.Add(adapter.Description.DeviceId);


            Adapter = Adapters[0]; // TODO:
        }
Exemplo n.º 30
0
 public static extern HRESULT D3D11CreateDevice(IDXGIAdapter pAdapter, D3D_DRIVER_TYPE DriverType, IntPtr Software, uint Flags, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 5)] D3D_FEATURE_LEVEL[] pFeatureLevels, uint FeatureLevels, uint SDKVersion, out ID3D11Device ppDevice, out D3D_FEATURE_LEVEL pFeatureLevel, out ID3D11DeviceContext ppImmediateContext);
Exemplo n.º 31
0
 public static Result D3D12CreateDevice <T>(IDXGIAdapter adapter, out T device) where T : ID3D12Device
 {
     return(D3D12CreateDevice(adapter, FeatureLevel.Level_11_0, out device));
 }