xbmc
DRMUtils.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "DRMConnector.h"
12 #include "DRMCrtc.h"
13 #include "DRMEncoder.h"
14 #include "DRMPlane.h"
15 #include "windowing/Resolution.h"
16 #include "windowing/gbm/GBMUtils.h"
17 
18 #include <vector>
19 
20 #include <gbm.h>
21 #include <xf86drm.h>
22 
23 namespace KODI
24 {
25 namespace WINDOWING
26 {
27 namespace GBM
28 {
29 
30 struct drm_fb
31 {
32  struct gbm_bo *bo = nullptr;
33  uint32_t fb_id;
34  uint32_t format;
35 };
36 
37 class CDRMUtils
38 {
39 public:
40  CDRMUtils() = default;
41  virtual ~CDRMUtils();
42  virtual void FlipPage(struct gbm_bo* bo, bool rendered, bool videoLayer) {}
43  virtual bool SetVideoMode(const RESOLUTION_INFO& res, struct gbm_bo* bo) { return false; }
44  virtual bool SetActive(bool active) { return false; }
45  virtual bool InitDrm();
46  virtual void DestroyDrm();
47 
48  int GetFileDescriptor() const { return m_fd; }
49  int GetRenderNodeFileDescriptor() const { return m_renderFd; }
50  const char* GetRenderDevicePath() const { return m_renderDevicePath; }
51  CDRMPlane* GetVideoPlane() const { return m_video_plane; }
52  CDRMPlane* GetGuiPlane() const { return m_gui_plane; }
53  CDRMCrtc* GetCrtc() const { return m_crtc; }
54  CDRMConnector* GetConnector() const { return m_connector; }
55 
56  std::vector<std::string> GetConnectedConnectorNames();
57 
58  virtual RESOLUTION_INFO GetCurrentMode();
59  virtual std::vector<RESOLUTION_INFO> GetModes();
60  virtual bool SetMode(const RESOLUTION_INFO& res);
61 
62  static uint32_t FourCCWithAlpha(uint32_t fourcc);
63  static uint32_t FourCCWithoutAlpha(uint32_t fourcc);
64 
65 protected:
66  bool OpenDrm(bool needConnector);
67  drm_fb* DrmFbGetFromBo(struct gbm_bo *bo);
68 
69  int m_fd;
70  CDRMConnector* m_connector{nullptr};
71  CDRMEncoder* m_encoder{nullptr};
72  CDRMCrtc* m_crtc{nullptr};
73  CDRMCrtc* m_orig_crtc{nullptr};
74  CDRMPlane* m_video_plane{nullptr};
75  CDRMPlane* m_gui_plane{nullptr};
76  drmModeModeInfo *m_mode = nullptr;
77 
78  int m_width = 0;
79  int m_height = 0;
80 
81  std::vector<std::unique_ptr<CDRMPlane>> m_planes;
82 
83 private:
84  bool FindConnector();
85  bool FindEncoder();
86  bool FindCrtc();
87  bool FindPlanes();
88  bool FindPreferredMode();
89  bool RestoreOriginalMode();
90  RESOLUTION_INFO GetResolutionInfo(drmModeModeInfoPtr mode);
91  void PrintDrmDeviceInfo(drmDevicePtr device);
92 
93  int m_renderFd;
94  const char* m_renderDevicePath{nullptr};
95 
96  std::vector<std::unique_ptr<CDRMConnector>> m_connectors;
97  std::vector<std::unique_ptr<CDRMEncoder>> m_encoders;
98  std::vector<std::unique_ptr<CDRMCrtc>> m_crtcs;
99 };
100 
101 }
102 }
103 }
Definition: DRMUtils.h:30
Definition: DRMCrtc.h:20
Definition: DRMPlane.h:24
Provide info of a resolution.
Definition: Resolution.h:66
Controller configuration window.
Definition: AudioDecoder.h:18
Definition: DRMEncoder.h:20
Definition: DRMConnector.h:22
Definition: DRMUtils.h:37