4964a577573c4ca7200e4e33970f4e62bbc37c5d
1 #include <xf86drm.h>
2 #include <xf86drmMode.h>
3 #include <math.h>
5 #include <kms++/kms++.h>
6 #include "helpers.h"
8 using namespace std;
10 namespace kms
11 {
13 unique_ptr<Blob> Videomode::to_blob(Card& card) const
14 {
15 drmModeModeInfo drm_mode = video_mode_to_drm_mode(*this);
17 return unique_ptr<Blob>(new Blob(card, &drm_mode, sizeof(drm_mode)));
18 }
20 float Videomode::calculated_vrefresh() const
21 {
22 // XXX interlace should only halve visible vertical lines, not blanking
23 float refresh = (clock * 1000.0) / (htotal * vtotal) * (interlace() ? 2 : 1);
24 return roundf(refresh * 100.0) / 100.0;
25 }
27 bool Videomode::interlace() const
28 {
29 return flags & DRM_MODE_FLAG_INTERLACE;
30 }
32 SyncPolarity Videomode::hsync() const
33 {
34 if (flags & DRM_MODE_FLAG_PHSYNC)
35 return SyncPolarity::Positive;
36 if (flags & DRM_MODE_FLAG_NHSYNC)
37 return SyncPolarity::Negative;
38 return SyncPolarity::Undefined;
39 }
41 SyncPolarity Videomode::vsync() const
42 {
43 if (flags & DRM_MODE_FLAG_PVSYNC)
44 return SyncPolarity::Positive;
45 if (flags & DRM_MODE_FLAG_NVSYNC)
46 return SyncPolarity::Negative;
47 return SyncPolarity::Undefined;
48 }
50 void Videomode::set_interlace(bool ilace)
51 {
52 if (ilace)
53 flags |= DRM_MODE_FLAG_INTERLACE;
54 else
55 flags &= ~DRM_MODE_FLAG_INTERLACE;
56 }
58 void Videomode::set_hsync(SyncPolarity pol)
59 {
60 flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC);
62 switch (pol) {
63 case SyncPolarity::Positive:
64 flags |= DRM_MODE_FLAG_PHSYNC;
65 break;
66 case SyncPolarity::Negative:
67 flags |= DRM_MODE_FLAG_NHSYNC;
68 break;
69 default:
70 break;
71 }
72 }
74 void Videomode::set_vsync(SyncPolarity pol)
75 {
76 flags &= ~(DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC);
78 switch (pol) {
79 case SyncPolarity::Positive:
80 flags |= DRM_MODE_FLAG_PVSYNC;
81 break;
82 case SyncPolarity::Negative:
83 flags |= DRM_MODE_FLAG_NVSYNC;
84 break;
85 default:
86 break;
87 }
88 }
90 Videomode videomode_from_timings(uint32_t clock_khz,
91 uint16_t hact, uint16_t hfp, uint16_t hsw, uint16_t hbp,
92 uint16_t vact, uint16_t vfp, uint16_t vsw, uint16_t vbp)
93 {
94 Videomode m { };
95 m.clock = clock_khz;
97 m.hdisplay = hact;
98 m.hsync_start = hact + hfp;
99 m.hsync_end = hact + hfp + hsw;
100 m.htotal = hact + hfp + hsw + hbp;
102 m.vdisplay = vact;
103 m.vsync_start = vact + vfp;
104 m.vsync_end = vact + vfp + vsw;
105 m.vtotal = vact + vfp + vsw + vbp;
107 return m;
108 }
110 }