vdr-plugin-softhddevice-drm-gles 1.6.8-daba64b
drmdevice.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
13#ifndef __DRMDEVICE_H
14#define __DRMDEVICE_H
15
16#include <array>
17#include <cstdint>
18#include <string>
19
20#ifdef USE_GLES
21#include <EGL/egl.h>
22#endif
23
24#include <xf86drm.h>
25#include <xf86drmMode.h>
26
27#include "config.h"
28#include "drmplane.h"
29
30#ifdef USE_GLES
31class cDrmBuffer;
32#endif
33
34class cVideoRender;
35
46inline constexpr std::array DrmModeWhitelist = {
47 // 2160p (4K)
48 sDrmMode{ 3840, 2160, 60.00, false },
49 sDrmMode{ 3840, 2160, 59.94, false },
50 sDrmMode{ 3840, 2160, 50.00, false },
51 sDrmMode{ 3840, 2160, 30.00, false },
52 sDrmMode{ 3840, 2160, 29.97, false },
53 sDrmMode{ 3840, 2160, 25.00, false },
54 sDrmMode{ 3840, 2160, 24.00, false },
55 sDrmMode{ 3840, 2160, 23.98, false },
56
57 // 1080p (FullHD progressive)
58 sDrmMode{ 1920, 1080, 60.00, false },
59 sDrmMode{ 1920, 1080, 59.94, false },
60 sDrmMode{ 1920, 1080, 50.00, false },
61 sDrmMode{ 1920, 1080, 30.00, false },
62 sDrmMode{ 1920, 1080, 29.97, false },
63 sDrmMode{ 1920, 1080, 25.00, false },
64 sDrmMode{ 1920, 1080, 24.00, false },
65 sDrmMode{ 1920, 1080, 23.98, false },
66
67 // 1080i (FullHD interlaced)
68 sDrmMode{ 1920, 1080, 30.00, true }, // 1928x1080@60i
69 sDrmMode{ 1920, 1080, 29.97, true }, // 1928x1080@59.94i
70 sDrmMode{ 1920, 1080, 25.00, true }, // 1928x1080@50i
71
72 // 720p (HDready)
73 sDrmMode{ 1280, 720, 60.00, false },
74 sDrmMode{ 1280, 720, 59.94, false },
75 sDrmMode{ 1280, 720, 50.00, false },
76};
77
84public:
86 ~cDrmDevice(void);
87
88 int Init(void);
89 int ReInit(void);
90#ifdef USE_GLES
91 int InitGbm(void);
92 void ExitGbm(void);
93 int InitEGL(void);
94#endif
95 int Fd(void) { return m_fdDrm; };
96 void Close(void);
97
98 // setters and getters
100
101 uint64_t DisplayWidth(void) { return m_drmModeInfo.hdisplay; };
102 uint64_t DisplayHeight(void) { return m_drmModeInfo.vdisplay; };
105
106 uint32_t CrtcId(void) { return m_crtcId; };
107 int UseZpos(void) { return m_useZpos; };
110
111 cDrmPlane *OsdPlane(void) { return &m_osdPlane; };
112 cDrmPlane *VideoPlane(void) { return &m_videoPlane; };
113 cDrmPlane *PipPlane(void) { return &m_pipPlane; };
114 bool HasPipPlane(void) { return m_pipPlane.GetId(); };
115
116#ifdef USE_GLES
120 int GlInitiated(void) { return m_glInitiated; };
121 struct gbm_surface *GbmSurface(void) { return m_pGbmSurface; };
122
123 cDrmBuffer *GetBufFromBo(struct gbm_bo *);
124#endif
125 void SaveCrtc(void);
126 void RestoreCrtc(void);
127 int HandleEvent(void);
128 void InitEvent(void);
129
130 bool CanHandleHdr(void) { return m_hdrMetadata != 0; };
131 bool CanHandleMode(sDrmMode *);
132
133 // drmModeAtomic* wrapper functions
147 int CreateHdrBlob(struct hdr_output_metadata *, size_t, uint32_t *);
150
151private:
154
155 int m_fdDrm = -1;
157 std::string m_connectorName;
164
165 const char *m_userDrmDevice = nullptr;
166 const char *m_userDrmConnector = nullptr;
173
174 bool m_useZpos = false;
181
183 int GetPropertyValue(uint32_t, uint32_t, const char *, uint64_t *);
184 uint32_t GetPropertyID(uint32_t, uint32_t, const char *);
185
187 drmModeConnector *FindDrmConnector(int, drmModeRes *, const char *);
189 int FindMode(void);
190#ifdef USE_GLES
193
198
200#endif
201};
202
203#endif
DRM Buffer.
Definition drmbuffer.h:48
DRM Device.
Definition drmdevice.h:83
bool m_glInitiated
true, if OpenGL/ES context is initiated
Definition drmdevice.h:197
int SetConnectorHdrOutputMetadata(drmModeAtomicReqPtr, uint32_t)
uint64_t OsdHeight(void)
Definition drmdevice.h:104
int m_userReqDisplayHeight
user requested display height
Definition drmdevice.h:168
drmModeModeInfo m_drmModeInfo
mode info
Definition drmdevice.h:158
const char * m_userDrmConnector
user requested drm connector
Definition drmdevice.h:166
int ModeAtomicCommit(drmModeAtomicReqPtr req, uint32_t flags, void *user_data)
Definition drmdevice.h:135
int InitGbm(void)
Init gbm device and surface.
cDrmBuffer * GetBufFromBo(struct gbm_bo *)
Get a drm buffer from a gbm buffer object.
EGLDisplay EglDisplay(void)
Definition drmdevice.h:118
int GetPropertyValue(uint32_t, uint32_t, const char *, uint64_t *)
Get a drm property value.
void ModeAtomicFree(drmModeAtomicReqPtr req)
Definition drmdevice.h:136
int SetConnectorColorspace(drmModeAtomicReqPtr, uint32_t)
int InitEGL(void)
Init EGL context.
int CreateModeBlob(uint32_t *)
int m_userReqOsdWidth
user requested osd width
Definition drmdevice.h:171
int CreatePropertyBlob(uint32_t *)
Wrapper to create a property blob.
uint32_t m_hdrMetadata
property id of HDR_OUTPUT_METADATA
Definition drmdevice.h:161
int GlInitiated(void)
Definition drmdevice.h:120
drmModeAtomicReqPtr ModeAtomicAlloc(void)
Definition drmdevice.h:134
int Fd(void)
Definition drmdevice.h:95
int GetVideoPlaneColorRange(uint64_t *)
cDrmPlane m_videoPlane
the video drm plane
Definition drmdevice.h:177
int DestroyHdrBlob(uint32_t)
struct gbm_surface * m_pGbmSurface
pointer to the gbm surface
Definition drmdevice.h:192
uint32_t GetPropertyID(uint32_t, uint32_t, const char *)
Get a property ID.
int FindMode(void)
Find a suitable mode from the current connector.
int SetVideoPlaneColorEncoding(drmModeAtomicReqPtr, uint32_t)
bool HasPipPlane(void)
Definition drmdevice.h:114
EGLSurface EglSurface(void)
Definition drmdevice.h:117
EGLContext m_eglContext
EGL context.
Definition drmdevice.h:196
int SetPropertyRequest(drmModeAtomicReqPtr, uint32_t, uint32_t, const char *, uint64_t)
Add a drm property to an atomic modeset request.
int SetCrtcModeId(drmModeAtomicReqPtr, uint32_t)
uint64_t DisplayHeight(void)
Definition drmdevice.h:102
int32_t FindCrtcForConnector(const drmModeRes *, const drmModeConnector *)
Find the CRTC_ID for the given connector.
EGLSurface m_eglSurface
EGL surface.
Definition drmdevice.h:194
void ExitGbm(void)
Free gbm device and surface.
int HandleEvent(void)
Poll for a drm event.
bool CanHandleMode(sDrmMode *)
Return true, if the given mode is one of the collected ones.
bool m_userReqDisplayInterlaced
user requested display interlaced mode
Definition drmdevice.h:170
double m_userReqDisplayRefreshRate
user requested display refresh rate
Definition drmdevice.h:169
int m_userReqDisplayWidth
user requested display width
Definition drmdevice.h:167
cSoftHdConfig * m_pConfig
pointer to cSoftHdConfig object
Definition drmdevice.h:153
int DestroyModeBlob(uint32_t)
cDrmPlane m_pipPlane
the pip drm plane
Definition drmdevice.h:180
uint64_t DisplayWidth(void)
Definition drmdevice.h:101
uint64_t ZposPrimary(void)
Definition drmdevice.h:109
drmModeCrtc * m_drmModeCrtcSaved
saved CRTC infos
Definition drmdevice.h:162
int CreateHdrBlob(struct hdr_output_metadata *, size_t, uint32_t *)
struct gbm_surface * GbmSurface(void)
Definition drmdevice.h:121
int m_userReqOsdHeight
user requested osd height
Definition drmdevice.h:172
int m_fdDrm
drm file descriptor
Definition drmdevice.h:155
uint64_t ZposOverlay(void)
Definition drmdevice.h:108
uint64_t m_zposPip
zpos of pip plane
Definition drmdevice.h:179
std::string m_connectorName
drm connector name
Definition drmdevice.h:157
int SetConnectorHdrBlobProperty(uint32_t)
cDrmPlane * PipPlane(void)
Definition drmdevice.h:113
EGLDisplay m_eglDisplay
EGL display.
Definition drmdevice.h:195
void SaveCrtc(void)
Save information of a CRTC.
int ReInit(void)
Re-Init the drm device with a new connector mode.
uint32_t CrtcId(void)
Definition drmdevice.h:106
~cDrmDevice(void)
Definition drmdevice.cpp:74
uint32_t m_connectorId
connector id
Definition drmdevice.h:156
void RestoreCrtc(void)
Restore information of a CRTC.
void Close(void)
Close the drm file handle.
cDrmPlane * OsdPlane(void)
Definition drmdevice.h:111
uint32_t m_crtcId
current crtc ID
Definition drmdevice.h:159
int SetConnectorCrtcId(drmModeAtomicReqPtr)
EGLContext EglContext(void)
Definition drmdevice.h:119
cDrmPlane * VideoPlane(void)
Definition drmdevice.h:112
uint32_t ConnectorId(void)
Definition drmdevice.h:99
uint32_t m_crtcIndex
current crtc index
Definition drmdevice.h:160
int SetCrtcActive(drmModeAtomicReqPtr, uint32_t)
uint64_t OsdWidth(void)
Definition drmdevice.h:103
cVideoRender * m_pRender
pointer to cVideoRender object
Definition drmdevice.h:152
int Init(void)
Initiate the drm device.
uint64_t m_zposPrimary
zpos of primary plane
Definition drmdevice.h:176
drmEventContext m_drmEventCtx
drm event context
Definition drmdevice.h:163
bool CanHandleHdr(void)
Definition drmdevice.h:130
bool m_useZpos
is set, if drm hardware can use zpos
Definition drmdevice.h:174
struct gbm_device * m_pGbmDevice
pointer to the gbm device
Definition drmdevice.h:191
cDrmPlane m_osdPlane
the osd drm plane
Definition drmdevice.h:178
int SetVideoPlaneColorRange(drmModeAtomicReqPtr, uint32_t)
void InitEvent(void)
Init the event context.
const char * m_userDrmDevice
user requested drm device
Definition drmdevice.h:165
uint64_t m_zposOverlay
zpos of overlay plane
Definition drmdevice.h:175
int UseZpos(void)
Definition drmdevice.h:107
DRM Plane.
Definition drmplane.h:23
uint32_t GetId(void)
Definition drmplane.h:39
Plugin Configuration.
Definition config.h:65
Video Renderer.
Plugin Configuration Header File.
DRM Plane Header File.
constexpr std::array DrmModeWhitelist
Whitelist of possible drm modes.
Definition drmdevice.h:46
drmModeConnector * FindDrmConnector(int, drmModeRes *, const char *)
Find a suitable connector, preferably a connected one.
EGLConfig GetEGLConfig(void)
Get a suitable EGLConfig.
Holds possible display configurations.
Definition config.h:30