1 /**************************************************************
2 
3    custom_video_drmkms.h - Linux DRM/KMS video management layer
4 
5    ---------------------------------------------------------
6 
7    Switchres   Modeline generation engine for emulation
8 
9    License     GPL-2.0+
10    Copyright   2010-2021 Chris Kennedy, Antonio Giner,
11                          Alexandre Wodarczyk, Gil Delescluse
12 
13  **************************************************************/
14 
15 #ifndef __CUSTOM_VIDEO_DRMKMS_
16 #define __CUSTOM_VIDEO_DRMKMS_
17 
18 // DRM headers
19 #include <xf86drm.h>
20 #include <xf86drmMode.h>
21 #include "custom_video.h"
22 
23 class drmkms_timing : public custom_video
24 {
25 	public:
26 		drmkms_timing(char *device_name, custom_video_settings *vs);
27 		~drmkms_timing();
api_name()28 		const char *api_name() { return "DRMKMS"; }
caps()29 		int caps() { return CUSTOM_VIDEO_CAPS_ADD; }
30 		bool init();
31 
32 		bool add_mode(modeline *mode);
33 		bool delete_mode(modeline *mode);
34 		bool update_mode(modeline *mode);
35 
36 		bool get_timing(modeline *mode);
37 		bool set_timing(modeline *mode);
38 
39 	private:
40 		int m_id = 0;
41 
42 		int m_drm_fd = 0;
43 		drmModeCrtc *mp_crtc_desktop = NULL;
44 		int m_card_id = 0;
45 		int drm_master_hook(int fd);
46 
47 		char m_device_name[32];
48 		unsigned int m_desktop_output = 0;
49 		int m_video_modes_position = 0;
50 
51 		void *mp_drm_handle = NULL;
52 		unsigned int m_dumb_handle = 0;
53 		unsigned int m_framebuffer_id = 0;
54 
55 		__typeof__(drmGetVersion) *p_drmGetVersion;
56 		__typeof__(drmFreeVersion) *p_drmFreeVersion;
57 		__typeof__(drmModeGetResources) *p_drmModeGetResources;
58 		__typeof__(drmModeGetConnector) *p_drmModeGetConnector;
59 		__typeof__(drmModeFreeConnector) *p_drmModeFreeConnector;
60 		__typeof__(drmModeFreeResources) *p_drmModeFreeResources;
61 		__typeof__(drmModeGetEncoder) *p_drmModeGetEncoder;
62 		__typeof__(drmModeFreeEncoder) *p_drmModeFreeEncoder;
63 		__typeof__(drmModeGetCrtc) *p_drmModeGetCrtc;
64 		__typeof__(drmModeSetCrtc) *p_drmModeSetCrtc;
65 		__typeof__(drmModeFreeCrtc) *p_drmModeFreeCrtc;
66 		__typeof__(drmModeAttachMode) *p_drmModeAttachMode;
67 		__typeof__(drmModeAddFB) *p_drmModeAddFB;
68 		__typeof__(drmModeRmFB) *p_drmModeRmFB;
69 		__typeof__(drmModeGetFB) *p_drmModeGetFB;
70 		__typeof__(drmModeFreeFB) *p_drmModeFreeFB;
71 		__typeof__(drmPrimeHandleToFD) *p_drmPrimeHandleToFD;
72 		__typeof__(drmModeGetPlaneResources) *p_drmModeGetPlaneResources;
73 		__typeof__(drmModeFreePlaneResources) *p_drmModeFreePlaneResources;
74 		__typeof__(drmIoctl) *p_drmIoctl;
75 		__typeof__(drmGetCap) *p_drmGetCap;
76 		__typeof__(drmIsMaster) *p_drmIsMaster;
77 		__typeof__(drmSetMaster) *p_drmSetMaster;
78 		__typeof__(drmDropMaster) *p_drmDropMaster;
79 };
80 
81 #endif
82