vdr-plugin-softhddevice-drm-gles 1.6.7
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 int InitGbm(void);
91 int InitEGL(void);
92 int Fd(void) { return m_fdDrm; };
93 void Close(void);
94
95 // setters and getters
97
98 uint64_t DisplayWidth(void) { return m_drmModeInfo.hdisplay; };
99 uint64_t DisplayHeight(void) { return m_drmModeInfo.vdisplay; };
102
103 uint32_t CrtcId(void) { return m_crtcId; };
104 int UseZpos(void) { return m_useZpos; };
107
108 cDrmPlane *OsdPlane(void) { return &m_osdPlane; };
109 cDrmPlane *VideoPlane(void) { return &m_videoPlane; };
110 cDrmPlane *PipPlane(void) { return &m_pipPlane; };
111 bool HasPipPlane(void) { return m_pipPlane.GetId(); };
112
113#ifdef USE_GLES
117 int GlInitiated(void) { return m_glInitiated; };
118 struct gbm_surface *GbmSurface(void) { return m_pGbmSurface; };
119
120 cDrmBuffer *GetBufFromBo(struct gbm_bo *);
121#endif
122 void SaveCrtc(void);
123 void RestoreCrtc(void);
124 int HandleEvent(void);
125 void InitEvent(void);
126
127 bool CanHandleHdr(void) { return m_hdrMetadata != 0; };
128 bool CanHandleMode(sDrmMode *);
129
130 // drmModeAtomic* wrapper functions
144 int CreateHdrBlob(struct hdr_output_metadata *, size_t, uint32_t *);
147
148private:
151
152 int m_fdDrm = -1;
154 std::string m_connectorName;
161
162 const char *m_userDrmDevice = nullptr;
163 const char *m_userDrmConnector = nullptr;
170
171 bool m_useZpos = false;
178
180 int GetPropertyValue(uint32_t, uint32_t, const char *, uint64_t *);
181 uint32_t GetPropertyID(uint32_t, uint32_t, const char *);
182
184 drmModeConnector *FindDrmConnector(int, drmModeRes *, const char *);
186 int FindMode(void);
187#ifdef USE_GLES
190
195
197#endif
198};
199
200#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:194
int SetConnectorHdrOutputMetadata(drmModeAtomicReqPtr, uint32_t)
uint64_t OsdHeight(void)
Definition drmdevice.h:101
int m_userReqDisplayHeight
user requested display height
Definition drmdevice.h:165
drmModeModeInfo m_drmModeInfo
mode info
Definition drmdevice.h:155
const char * m_userDrmConnector
user requested drm connector
Definition drmdevice.h:163
int ModeAtomicCommit(drmModeAtomicReqPtr req, uint32_t flags, void *user_data)
Definition drmdevice.h:132
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:115
int GetPropertyValue(uint32_t, uint32_t, const char *, uint64_t *)
Get a drm property value.
void ModeAtomicFree(drmModeAtomicReqPtr req)
Definition drmdevice.h:133
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:168
int CreatePropertyBlob(uint32_t *)
Wrapper to create a property blob.
uint32_t m_hdrMetadata
property id of HDR_OUTPUT_METADATA
Definition drmdevice.h:158
int GlInitiated(void)
Definition drmdevice.h:117
drmModeAtomicReqPtr ModeAtomicAlloc(void)
Definition drmdevice.h:131
int Fd(void)
Definition drmdevice.h:92
int GetVideoPlaneColorRange(uint64_t *)
cDrmPlane m_videoPlane
the video drm plane
Definition drmdevice.h:174
int DestroyHdrBlob(uint32_t)
struct gbm_surface * m_pGbmSurface
pointer to the gbm surface
Definition drmdevice.h:189
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:111
EGLSurface EglSurface(void)
Definition drmdevice.h:114
EGLContext m_eglContext
EGL context.
Definition drmdevice.h:193
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:99
int32_t FindCrtcForConnector(const drmModeRes *, const drmModeConnector *)
Find the CRTC_ID for the given connector.
EGLSurface m_eglSurface
EGL surface.
Definition drmdevice.h:191
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:167
double m_userReqDisplayRefreshRate
user requested display refresh rate
Definition drmdevice.h:166
int m_userReqDisplayWidth
user requested display width
Definition drmdevice.h:164
cSoftHdConfig * m_pConfig
pointer to cSoftHdConfig object
Definition drmdevice.h:150
int DestroyModeBlob(uint32_t)
cDrmPlane m_pipPlane
the pip drm plane
Definition drmdevice.h:177
uint64_t DisplayWidth(void)
Definition drmdevice.h:98
uint64_t ZposPrimary(void)
Definition drmdevice.h:106
drmModeCrtc * m_drmModeCrtcSaved
saved CRTC infos
Definition drmdevice.h:159
int CreateHdrBlob(struct hdr_output_metadata *, size_t, uint32_t *)
struct gbm_surface * GbmSurface(void)
Definition drmdevice.h:118
int m_userReqOsdHeight
user requested osd height
Definition drmdevice.h:169
int m_fdDrm
drm file descriptor
Definition drmdevice.h:152
uint64_t ZposOverlay(void)
Definition drmdevice.h:105
uint64_t m_zposPip
zpos of pip plane
Definition drmdevice.h:176
std::string m_connectorName
drm connector name
Definition drmdevice.h:154
int SetConnectorHdrBlobProperty(uint32_t)
cDrmPlane * PipPlane(void)
Definition drmdevice.h:110
EGLDisplay m_eglDisplay
EGL display.
Definition drmdevice.h:192
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:103
~cDrmDevice(void)
Definition drmdevice.cpp:74
uint32_t m_connectorId
connector id
Definition drmdevice.h:153
void RestoreCrtc(void)
Restore information of a CRTC.
void Close(void)
Close the drm file handle.
cDrmPlane * OsdPlane(void)
Definition drmdevice.h:108
uint32_t m_crtcId
current crtc ID
Definition drmdevice.h:156
int SetConnectorCrtcId(drmModeAtomicReqPtr)
EGLContext EglContext(void)
Definition drmdevice.h:116
cDrmPlane * VideoPlane(void)
Definition drmdevice.h:109
uint32_t ConnectorId(void)
Definition drmdevice.h:96
uint32_t m_crtcIndex
current crtc index
Definition drmdevice.h:157
int SetCrtcActive(drmModeAtomicReqPtr, uint32_t)
uint64_t OsdWidth(void)
Definition drmdevice.h:100
cVideoRender * m_pRender
pointer to cVideoRender object
Definition drmdevice.h:149
int Init(void)
Initiate the drm device.
uint64_t m_zposPrimary
zpos of primary plane
Definition drmdevice.h:173
drmEventContext m_drmEventCtx
drm event context
Definition drmdevice.h:160
bool CanHandleHdr(void)
Definition drmdevice.h:127
bool m_useZpos
is set, if drm hardware can use zpos
Definition drmdevice.h:171
struct gbm_device * m_pGbmDevice
pointer to the gbm device
Definition drmdevice.h:188
cDrmPlane m_osdPlane
the osd drm plane
Definition drmdevice.h:175
int SetVideoPlaneColorRange(drmModeAtomicReqPtr, uint32_t)
void InitEvent(void)
Init the event context.
const char * m_userDrmDevice
user requested drm device
Definition drmdevice.h:162
uint64_t m_zposOverlay
zpos of overlay plane
Definition drmdevice.h:172
int UseZpos(void)
Definition drmdevice.h:104
DRM Plane.
Definition drmplane.h:23
uint32_t GetId(void)
Definition drmplane.h:39
Plugin Configuration.
Definition config.h:49
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