Improve mode finding
[android/external-libkmsxx.git] / kms++ / src / videomode.cpp
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         float refresh = (clock * 1000.0) / (htotal * vtotal) * (interlace() ? 2 : 1);
23         return roundf(refresh * 100.0) / 100.0;
24 }
26 bool Videomode::interlace() const
27 {
28         return flags & DRM_MODE_FLAG_INTERLACE;
29 }
31 SyncPolarity Videomode::hsync() const
32 {
33         if (flags & DRM_MODE_FLAG_PHSYNC)
34                 return SyncPolarity::Positive;
35         if (flags & DRM_MODE_FLAG_NHSYNC)
36                 return SyncPolarity::Negative;
37         return SyncPolarity::Undefined;
38 }
40 SyncPolarity Videomode::vsync() const
41 {
42         if (flags & DRM_MODE_FLAG_PVSYNC)
43                 return SyncPolarity::Positive;
44         if (flags & DRM_MODE_FLAG_NVSYNC)
45                 return SyncPolarity::Negative;
46         return SyncPolarity::Undefined;
47 }
49 void Videomode::set_interlace(bool ilace)
50 {
51         if (ilace)
52                 flags |= DRM_MODE_FLAG_INTERLACE;
53         else
54                 flags &= ~DRM_MODE_FLAG_INTERLACE;
55 }
57 void Videomode::set_hsync(SyncPolarity pol)
58 {
59         flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC);
61         switch (pol) {
62         case SyncPolarity::Positive:
63                 flags |= DRM_MODE_FLAG_PHSYNC;
64                 break;
65         case SyncPolarity::Negative:
66                 flags |= DRM_MODE_FLAG_NHSYNC;
67                 break;
68         default:
69                 break;
70         }
71 }
73 void Videomode::set_vsync(SyncPolarity pol)
74 {
75         flags &= ~(DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC);
77         switch (pol) {
78         case SyncPolarity::Positive:
79                 flags |= DRM_MODE_FLAG_PVSYNC;
80                 break;
81         case SyncPolarity::Negative:
82                 flags |= DRM_MODE_FLAG_NVSYNC;
83                 break;
84         default:
85                 break;
86         }
87 }
89 Videomode videomode_from_timings(uint32_t clock_khz,
90                                  uint16_t hact, uint16_t hfp, uint16_t hsw, uint16_t hbp,
91                                  uint16_t vact, uint16_t vfp, uint16_t vsw, uint16_t vbp)
92 {
93         Videomode m { };
94         m.clock = clock_khz;
96         m.hdisplay = hact;
97         m.hsync_start = hact + hfp;
98         m.hsync_end = hact + hfp + hsw;
99         m.htotal = hact + hfp + hsw + hbp;
101         m.vdisplay = vact;
102         m.vsync_start = vact + vfp;
103         m.vsync_end = vact + vfp + vsw;
104         m.vtotal = vact + vfp + vsw + vbp;
106         return m;