コード例 #1
0
        /// <summary>
        /// Releases the adapter and associated unmanaged references.
        /// </summary>
        private void ReleaseAdapter()
        {
            if (CurrentAdapterInfo.AdapterHandle != 0)
            {
                try
                {
                    var closeInfo = default(CloseAdapterInfo);
                    closeInfo.AdapterHandle = CurrentAdapterInfo.AdapterHandle;

                    // This will return 0 on success, and another value for failure.
                    var closeAdapterResult = NativeMethods.D3DKMTCloseAdapter(ref closeInfo);
                }
                catch
                {
                    // ignore
                }
            }

            if (CurrentAdapterInfo.DCHandle != IntPtr.Zero)
            {
                try
                {
                    // this will return 1 on success, 0 on failure.
                    var deleteContextResult = NativeMethods.DeleteDC(CurrentAdapterInfo.DCHandle);
                }
                catch
                {
                    // ignore
                }
            }

            DisplayDevice      = null;
            CurrentAdapterInfo = default;
            VerticalSyncEvent  = default;
        }
コード例 #2
0
        /// <summary>
        /// Ensures the adapter is avaliable.
        /// If the adapter cannot be created, the <see cref="IsAvailable"/> property is permanently set to false.
        /// </summary>
        /// <returns>True if the adapter is available, and false otherwise.</returns>
        private bool EnsureAdapter()
        {
            if (DisplayDevice == null)
            {
                DisplayDevice = PrimaryDisplayDevice;
                if (DisplayDevice == null)
                {
                    IsAvailable = false;
                    return(false);
                }
            }

            if (CurrentAdapterInfo.DCHandle == IntPtr.Zero)
            {
                try
                {
                    CurrentAdapterInfo          = default;
                    CurrentAdapterInfo.DCHandle = NativeMethods.CreateDC(DisplayDevice.Value.DeviceName, null, null, IntPtr.Zero);
                    if (CurrentAdapterInfo.DCHandle == IntPtr.Zero)
                    {
                        throw new NotSupportedException("Unable to create DC for adapter.");
                    }
                }
                catch
                {
                    ReleaseAdapter();
                    IsAvailable = false;
                    return(false);
                }
            }

            if (VerticalSyncEvent.AdapterHandle == 0 && CurrentAdapterInfo.DCHandle != IntPtr.Zero)
            {
                try
                {
                    var openAdapterResult = NativeMethods.D3DKMTOpenAdapterFromHdc(ref CurrentAdapterInfo);
                    if (openAdapterResult == 0)
                    {
                        VerticalSyncEvent = default;
                        VerticalSyncEvent.AdapterHandle   = CurrentAdapterInfo.AdapterHandle;
                        VerticalSyncEvent.DeviceHandle    = 0;
                        VerticalSyncEvent.PresentSourceId = CurrentAdapterInfo.PresentSourceId;
                    }
                    else
                    {
                        throw new NotSupportedException("Unable to open D3D adapter.");
                    }
                }
                catch
                {
                    ReleaseAdapter();
                    IsAvailable = false;
                    return(false);
                }
            }

            return(VerticalSyncEvent.AdapterHandle != 0);
        }
コード例 #3
0
        private bool EnsureAdapter()
        {
            if (IsAdapterOpen)
            {
                return(true);
            }

            var displayDevices = EnumerateDisplayDevices();

            if (displayDevices.Length == 0)
            {
                ReleaseAdapter();
                return(false);
            }

            var primaryDisplayName = displayDevices.FirstOrDefault(d => d.StateFlags.HasFlag(DisplayDeviceStateFlags.PrimaryDevice)).DeviceName;

            CurrentAdapterInfo          = default;
            CurrentAdapterInfo.DCHandle = NativeMethods.CreateDC(primaryDisplayName, null, null, IntPtr.Zero);

            var openAdapterResult = NativeMethods.D3DKMTOpenAdapterFromHdc(ref CurrentAdapterInfo);

            if (openAdapterResult == 0)
            {
                IsAdapterOpen     = true;
                VerticalSyncEvent = default;
                VerticalSyncEvent.AdapterHandle   = CurrentAdapterInfo.AdapterHandle;
                VerticalSyncEvent.DeviceHandle    = 0;
                VerticalSyncEvent.PresentSourceId = CurrentAdapterInfo.PresentSourceId;
            }
            else
            {
                IsAdapterOpen     = false;
                VerticalSyncEvent = default;
            }

            return(IsAdapterOpen);
        }
コード例 #4
0
 public static extern uint D3DKMTWaitForVerticalBlankEvent(ref VerticalSyncEventInfo eventInfo);