2
* Copyright © 2013 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 3,
6
* as published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
19
#include "drm_mode_resources.h"
21
#include <boost/throw_exception.hpp>
24
namespace mgg = mir::graphics::gbm;
31
void operator()(drmModeCrtc* p) { if (p) drmModeFreeCrtc(p); }
36
void operator()(drmModeEncoder* p) { if (p) drmModeFreeEncoder(p); }
39
struct ConnectorDeleter
41
void operator()(drmModeConnector* p) { if (p) drmModeFreeConnector(p); }
44
struct ResourcesDeleter
46
void operator()(drmModeRes* p) { if (p) drmModeFreeResources(p); }
51
mgg::DRMModeResources::DRMModeResources(int drm_fd)
53
resources{DRMModeResUPtr{drmModeGetResources(drm_fd), ResourcesDeleter()}}
56
BOOST_THROW_EXCEPTION(std::runtime_error("Couldn't get DRM resources\n"));
59
void mgg::DRMModeResources::for_each_connector(std::function<void(DRMModeConnectorUPtr)> const& f) const
61
for (int i = 0; i < resources->count_connectors; i++)
63
auto connector_ptr = connector(resources->connectors[i]);
68
f(std::move(connector_ptr));
72
void mgg::DRMModeResources::for_each_encoder(std::function<void(DRMModeEncoderUPtr)> const& f) const
74
for (int i = 0; i < resources->count_encoders; i++)
76
auto encoder_ptr = encoder(resources->encoders[i]);
81
f(std::move(encoder_ptr));
85
void mgg::DRMModeResources::for_each_crtc(std::function<void(DRMModeCrtcUPtr)> const& f) const
87
for (int i = 0; i < resources->count_crtcs; i++)
89
auto crtc_ptr = crtc(resources->crtcs[i]);
94
f(std::move(crtc_ptr));
98
size_t mgg::DRMModeResources::num_connectors()
100
return resources->count_connectors;
103
size_t mgg::DRMModeResources::num_encoders()
105
return resources->count_encoders;
108
size_t mgg::DRMModeResources::num_crtcs()
110
return resources->count_crtcs;
113
mgg::DRMModeConnectorUPtr mgg::DRMModeResources::connector(uint32_t id) const
115
auto connector_raw = drmModeGetConnector(drm_fd, id);
116
return DRMModeConnectorUPtr{connector_raw, ConnectorDeleter()};
119
mgg::DRMModeEncoderUPtr mgg::DRMModeResources::encoder(uint32_t id) const
121
auto encoder_raw = drmModeGetEncoder(drm_fd, id);
122
return DRMModeEncoderUPtr{encoder_raw, EncoderDeleter()};
125
mgg::DRMModeCrtcUPtr mgg::DRMModeResources::crtc(uint32_t id) const
127
auto crtc_raw = drmModeGetCrtc(drm_fd, id);
128
return DRMModeCrtcUPtr{crtc_raw, CrtcDeleter()};