/// <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; }
/// <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); }
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); }
public static extern uint D3DKMTWaitForVerticalBlankEvent(ref VerticalSyncEventInfo eventInfo);