1 /*
2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
12 #define MODULES_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
13 
14 #include <comdef.h>
15 #include <wrl/client.h>
16 #include <D3D11.h>
17 #include <DXGI.h>
18 
19 #include <vector>
20 
21 namespace webrtc {
22 
23 // A wrapper of ID3D11Device and its corresponding context and IDXGIAdapter.
24 // This class represents one video card in the system.
25 class D3dDevice {
26  public:
27   D3dDevice(const D3dDevice& other);
28   D3dDevice(D3dDevice&& other);
29   ~D3dDevice();
30 
d3d_device()31   ID3D11Device* d3d_device() const { return d3d_device_.Get(); }
32 
context()33   ID3D11DeviceContext* context() const { return context_.Get(); }
34 
dxgi_device()35   IDXGIDevice* dxgi_device() const { return dxgi_device_.Get(); }
36 
dxgi_adapter()37   IDXGIAdapter* dxgi_adapter() const { return dxgi_adapter_.Get(); }
38 
39   // Returns all D3dDevice instances on the system. Returns an empty vector if
40   // anything wrong.
41   static std::vector<D3dDevice> EnumDevices();
42 
43  private:
44   // Instances of D3dDevice should only be created by EnumDevices() static
45   // function.
46   D3dDevice();
47 
48   // Initializes the D3dDevice from an IDXGIAdapter.
49   bool Initialize(const Microsoft::WRL::ComPtr<IDXGIAdapter>& adapter);
50 
51   Microsoft::WRL::ComPtr<ID3D11Device> d3d_device_;
52   Microsoft::WRL::ComPtr<ID3D11DeviceContext> context_;
53   Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device_;
54   Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter_;
55 };
56 
57 }  // namespace webrtc
58 
59 #endif  // MODULES_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
60