summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.h
blob: ebeabf9b99a8bb4b2b8a30c94fe788ab11c62ec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#pragma once

#include <mutex>
#include <unordered_map>

#include "dxgi_interfaces.h"

#include "../wsi/wsi_mode.h"

namespace dxvk {

  class DxgiSwapChain;

  class DxgiMonitorInfo : public IDXGIVkMonitorInfo {

  public:

    DxgiMonitorInfo(IUnknown* pParent);

    ~DxgiMonitorInfo();

    ULONG STDMETHODCALLTYPE AddRef();
    
    ULONG STDMETHODCALLTYPE Release();
    
    HRESULT STDMETHODCALLTYPE QueryInterface(
            REFIID                  riid,
            void**                  ppvObject);
    
    HRESULT STDMETHODCALLTYPE InitMonitorData(
            HMONITOR                hMonitor,
      const DXGI_VK_MONITOR_DATA*   pData);

    HRESULT STDMETHODCALLTYPE AcquireMonitorData(
            HMONITOR                hMonitor,
            DXGI_VK_MONITOR_DATA**  ppData);

    void STDMETHODCALLTYPE ReleaseMonitorData();

  private:

    IUnknown* m_parent;

    dxvk::mutex                                        m_monitorMutex;
    std::unordered_map<HMONITOR, DXGI_VK_MONITOR_DATA> m_monitorData;

  };


  /**
   * \brief Queries bits per pixel for a format
   * 
   * The format must be a valid swap chain format.
   * \param [in] Format The DXGI format to query
   * \returns Bits per pixel for this format
   */
  uint32_t GetMonitorFormatBpp(
          DXGI_FORMAT             Format);

  /**
   * \brief Queries bits per pixel for a format
   *
   * \param [in] Bits per pixel to query
   * \returns Format The DXGI format
   */
  DXGI_FORMAT GetBppMonitorFormat(
          uint32_t                bpp);
  
  /**
   * \brief Converts two display modes
   */
  inline void ConvertDisplayMode(
    const wsi::WsiMode&          WsiMode,
          DXGI_MODE_DESC1*       pDxgiMode) {
    pDxgiMode->Width            = WsiMode.width;
    pDxgiMode->Height           = WsiMode.height;
    pDxgiMode->RefreshRate      = DXGI_RATIONAL{ WsiMode.refreshRate.numerator, WsiMode.refreshRate.denominator };
    pDxgiMode->Format           = GetBppMonitorFormat(WsiMode.bitsPerPixel);
    pDxgiMode->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
    pDxgiMode->Scaling          = DXGI_MODE_SCALING_UNSPECIFIED;
    pDxgiMode->Stereo           = FALSE;
  }

  /**
   * \brief Converts two display modes
   */
  inline void ConvertDisplayMode(
    const DXGI_MODE_DESC1&        DxgiMode,
          wsi::WsiMode*           pWsiMode) {
    pWsiMode->width        = DxgiMode.Width;
    pWsiMode->height       = DxgiMode.Height;
    pWsiMode->refreshRate  = wsi::WsiRational{ DxgiMode.RefreshRate.Numerator, DxgiMode.RefreshRate.Denominator };
    pWsiMode->bitsPerPixel = GetMonitorFormatBpp(DxgiMode.Format);
    pWsiMode->interlaced   = false;
  }

}