1*f0687c8aSRaman Tenneti #include <cstdio>
2*f0687c8aSRaman Tenneti #include <iostream>
3*f0687c8aSRaman Tenneti #include <unistd.h>
4*f0687c8aSRaman Tenneti #include <fcntl.h>
5*f0687c8aSRaman Tenneti #include <cassert>
6*f0687c8aSRaman Tenneti #include <xf86drm.h>
7*f0687c8aSRaman Tenneti #include <xf86drmMode.h>
8*f0687c8aSRaman Tenneti #include <algorithm>
9*f0687c8aSRaman Tenneti
10*f0687c8aSRaman Tenneti #include <kms++/kms++.h>
11*f0687c8aSRaman Tenneti
12*f0687c8aSRaman Tenneti using namespace std;
13*f0687c8aSRaman Tenneti
14*f0687c8aSRaman Tenneti namespace kms
15*f0687c8aSRaman Tenneti {
16*f0687c8aSRaman Tenneti struct PlanePriv {
17*f0687c8aSRaman Tenneti drmModePlanePtr drm_plane;
18*f0687c8aSRaman Tenneti };
19*f0687c8aSRaman Tenneti
Plane(Card & card,uint32_t id,uint32_t idx)20*f0687c8aSRaman Tenneti Plane::Plane(Card& card, uint32_t id, uint32_t idx)
21*f0687c8aSRaman Tenneti : DrmPropObject(card, id, DRM_MODE_OBJECT_PLANE, idx)
22*f0687c8aSRaman Tenneti {
23*f0687c8aSRaman Tenneti m_priv = new PlanePriv();
24*f0687c8aSRaman Tenneti m_priv->drm_plane = drmModeGetPlane(this->card().fd(), this->id());
25*f0687c8aSRaman Tenneti assert(m_priv->drm_plane);
26*f0687c8aSRaman Tenneti }
27*f0687c8aSRaman Tenneti
~Plane()28*f0687c8aSRaman Tenneti Plane::~Plane()
29*f0687c8aSRaman Tenneti {
30*f0687c8aSRaman Tenneti drmModeFreePlane(m_priv->drm_plane);
31*f0687c8aSRaman Tenneti delete m_priv;
32*f0687c8aSRaman Tenneti }
33*f0687c8aSRaman Tenneti
supports_crtc(Crtc * crtc) const34*f0687c8aSRaman Tenneti bool Plane::supports_crtc(Crtc* crtc) const
35*f0687c8aSRaman Tenneti {
36*f0687c8aSRaman Tenneti return m_priv->drm_plane->possible_crtcs & (1 << crtc->idx());
37*f0687c8aSRaman Tenneti }
38*f0687c8aSRaman Tenneti
supports_format(PixelFormat fmt) const39*f0687c8aSRaman Tenneti bool Plane::supports_format(PixelFormat fmt) const
40*f0687c8aSRaman Tenneti {
41*f0687c8aSRaman Tenneti auto p = m_priv->drm_plane;
42*f0687c8aSRaman Tenneti
43*f0687c8aSRaman Tenneti for (unsigned i = 0; i < p->count_formats; ++i)
44*f0687c8aSRaman Tenneti if ((uint32_t)fmt == p->formats[i])
45*f0687c8aSRaman Tenneti return true;
46*f0687c8aSRaman Tenneti
47*f0687c8aSRaman Tenneti return false;
48*f0687c8aSRaman Tenneti }
49*f0687c8aSRaman Tenneti
plane_type() const50*f0687c8aSRaman Tenneti PlaneType Plane::plane_type() const
51*f0687c8aSRaman Tenneti {
52*f0687c8aSRaman Tenneti if (card().has_universal_planes()) {
53*f0687c8aSRaman Tenneti switch (get_prop_value("type")) {
54*f0687c8aSRaman Tenneti case DRM_PLANE_TYPE_OVERLAY:
55*f0687c8aSRaman Tenneti return PlaneType::Overlay;
56*f0687c8aSRaman Tenneti case DRM_PLANE_TYPE_PRIMARY:
57*f0687c8aSRaman Tenneti return PlaneType::Primary;
58*f0687c8aSRaman Tenneti case DRM_PLANE_TYPE_CURSOR:
59*f0687c8aSRaman Tenneti return PlaneType::Cursor;
60*f0687c8aSRaman Tenneti default:
61*f0687c8aSRaman Tenneti throw invalid_argument("Bad plane type");
62*f0687c8aSRaman Tenneti }
63*f0687c8aSRaman Tenneti } else {
64*f0687c8aSRaman Tenneti return PlaneType::Overlay;
65*f0687c8aSRaman Tenneti }
66*f0687c8aSRaman Tenneti }
67*f0687c8aSRaman Tenneti
get_possible_crtcs() const68*f0687c8aSRaman Tenneti vector<Crtc*> Plane::get_possible_crtcs() const
69*f0687c8aSRaman Tenneti {
70*f0687c8aSRaman Tenneti unsigned idx = 0;
71*f0687c8aSRaman Tenneti vector<Crtc*> v;
72*f0687c8aSRaman Tenneti auto crtcs = card().get_crtcs();
73*f0687c8aSRaman Tenneti
74*f0687c8aSRaman Tenneti for (uint32_t crtc_mask = m_priv->drm_plane->possible_crtcs;
75*f0687c8aSRaman Tenneti crtc_mask;
76*f0687c8aSRaman Tenneti idx++, crtc_mask >>= 1) {
77*f0687c8aSRaman Tenneti if ((crtc_mask & 1) == 0)
78*f0687c8aSRaman Tenneti continue;
79*f0687c8aSRaman Tenneti
80*f0687c8aSRaman Tenneti auto iter = find_if(crtcs.begin(), crtcs.end(), [idx](Crtc* crtc) { return crtc->idx() == idx; });
81*f0687c8aSRaman Tenneti
82*f0687c8aSRaman Tenneti if (iter == crtcs.end())
83*f0687c8aSRaman Tenneti continue;
84*f0687c8aSRaman Tenneti
85*f0687c8aSRaman Tenneti v.push_back(*iter);
86*f0687c8aSRaman Tenneti }
87*f0687c8aSRaman Tenneti
88*f0687c8aSRaman Tenneti return v;
89*f0687c8aSRaman Tenneti }
90*f0687c8aSRaman Tenneti
get_formats() const91*f0687c8aSRaman Tenneti vector<PixelFormat> Plane::get_formats() const
92*f0687c8aSRaman Tenneti {
93*f0687c8aSRaman Tenneti auto p = m_priv->drm_plane;
94*f0687c8aSRaman Tenneti vector<PixelFormat> r;
95*f0687c8aSRaman Tenneti
96*f0687c8aSRaman Tenneti for (unsigned i = 0; i < p->count_formats; ++i)
97*f0687c8aSRaman Tenneti r.push_back((PixelFormat)p->formats[i]);
98*f0687c8aSRaman Tenneti
99*f0687c8aSRaman Tenneti return r;
100*f0687c8aSRaman Tenneti }
101*f0687c8aSRaman Tenneti
crtc_id() const102*f0687c8aSRaman Tenneti uint32_t Plane::crtc_id() const
103*f0687c8aSRaman Tenneti {
104*f0687c8aSRaman Tenneti return m_priv->drm_plane->crtc_id;
105*f0687c8aSRaman Tenneti }
106*f0687c8aSRaman Tenneti
fb_id() const107*f0687c8aSRaman Tenneti uint32_t Plane::fb_id() const
108*f0687c8aSRaman Tenneti {
109*f0687c8aSRaman Tenneti return m_priv->drm_plane->fb_id;
110*f0687c8aSRaman Tenneti }
111*f0687c8aSRaman Tenneti
crtc_x() const112*f0687c8aSRaman Tenneti uint32_t Plane::crtc_x() const
113*f0687c8aSRaman Tenneti {
114*f0687c8aSRaman Tenneti return m_priv->drm_plane->crtc_x;
115*f0687c8aSRaman Tenneti }
116*f0687c8aSRaman Tenneti
crtc_y() const117*f0687c8aSRaman Tenneti uint32_t Plane::crtc_y() const
118*f0687c8aSRaman Tenneti {
119*f0687c8aSRaman Tenneti return m_priv->drm_plane->crtc_y;
120*f0687c8aSRaman Tenneti }
121*f0687c8aSRaman Tenneti
x() const122*f0687c8aSRaman Tenneti uint32_t Plane::x() const
123*f0687c8aSRaman Tenneti {
124*f0687c8aSRaman Tenneti return m_priv->drm_plane->x;
125*f0687c8aSRaman Tenneti }
126*f0687c8aSRaman Tenneti
y() const127*f0687c8aSRaman Tenneti uint32_t Plane::y() const
128*f0687c8aSRaman Tenneti {
129*f0687c8aSRaman Tenneti return m_priv->drm_plane->y;
130*f0687c8aSRaman Tenneti }
131*f0687c8aSRaman Tenneti
gamma_size() const132*f0687c8aSRaman Tenneti uint32_t Plane::gamma_size() const
133*f0687c8aSRaman Tenneti {
134*f0687c8aSRaman Tenneti return m_priv->drm_plane->gamma_size;
135*f0687c8aSRaman Tenneti }
136*f0687c8aSRaman Tenneti
137*f0687c8aSRaman Tenneti } // namespace kms
138