~hikiko/mir/mir.unity8-desktop-session

« back to all changes in this revision

Viewing changes to src/server/graphics/gbm/drm_mode_resources.cpp

  • Committer: Package Import Robot
  • Author(s): Ubuntu daily release, Daniel van Vugt, Ubuntu daily release
  • Date: 2014-01-08 02:04:38 UTC
  • mfrom: (1.1.54)
  • Revision ID: package-import@ubuntu.com-20140108020438-ikbu7qqm9v2l026y
Tags: 0.1.3+14.04.20140108-0ubuntu1
[ Daniel van Vugt ]
* Preparing for release 0.1.3

[ Ubuntu daily release ]
* Automatic snapshot from revision 1170

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright © 2013 Canonical Ltd.
3
 
 *
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.
7
 
 *
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.
12
 
 *
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/>.
15
 
 *
16
 
 * Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
17
 
 */
18
 
 
19
 
#include "drm_mode_resources.h"
20
 
 
21
 
#include <boost/throw_exception.hpp>
22
 
#include <stdexcept>
23
 
 
24
 
namespace mgg = mir::graphics::gbm;
25
 
 
26
 
namespace
27
 
{
28
 
 
29
 
struct CrtcDeleter
30
 
{
31
 
    void operator()(drmModeCrtc* p) { if (p) drmModeFreeCrtc(p); }
32
 
};
33
 
 
34
 
struct EncoderDeleter
35
 
{
36
 
    void operator()(drmModeEncoder* p) { if (p) drmModeFreeEncoder(p); }
37
 
};
38
 
 
39
 
struct ConnectorDeleter
40
 
{
41
 
    void operator()(drmModeConnector* p) { if (p) drmModeFreeConnector(p); }
42
 
};
43
 
 
44
 
struct ResourcesDeleter
45
 
{
46
 
    void operator()(drmModeRes* p) { if (p) drmModeFreeResources(p); }
47
 
};
48
 
 
49
 
}
50
 
 
51
 
mgg::DRMModeResources::DRMModeResources(int drm_fd)
52
 
    : drm_fd{drm_fd},
53
 
      resources{DRMModeResUPtr{drmModeGetResources(drm_fd), ResourcesDeleter()}}
54
 
{
55
 
    if (!resources)
56
 
        BOOST_THROW_EXCEPTION(std::runtime_error("Couldn't get DRM resources\n"));
57
 
}
58
 
 
59
 
void mgg::DRMModeResources::for_each_connector(std::function<void(DRMModeConnectorUPtr)> const& f) const
60
 
{
61
 
    for (int i = 0; i < resources->count_connectors; i++)
62
 
    {
63
 
        auto connector_ptr = connector(resources->connectors[i]);
64
 
 
65
 
        if (!connector_ptr)
66
 
            continue;
67
 
 
68
 
        f(std::move(connector_ptr));
69
 
    }
70
 
}
71
 
 
72
 
void mgg::DRMModeResources::for_each_encoder(std::function<void(DRMModeEncoderUPtr)> const& f) const
73
 
{
74
 
    for (int i = 0; i < resources->count_encoders; i++)
75
 
    {
76
 
        auto encoder_ptr = encoder(resources->encoders[i]);
77
 
 
78
 
        if (!encoder_ptr)
79
 
            continue;
80
 
 
81
 
        f(std::move(encoder_ptr));
82
 
    }
83
 
}
84
 
 
85
 
void mgg::DRMModeResources::for_each_crtc(std::function<void(DRMModeCrtcUPtr)> const& f) const
86
 
{
87
 
    for (int i = 0; i < resources->count_crtcs; i++)
88
 
    {
89
 
        auto crtc_ptr = crtc(resources->crtcs[i]);
90
 
 
91
 
        if (!crtc_ptr)
92
 
            continue;
93
 
 
94
 
        f(std::move(crtc_ptr));
95
 
    }
96
 
}
97
 
 
98
 
size_t mgg::DRMModeResources::num_connectors()
99
 
{
100
 
    return resources->count_connectors;
101
 
}
102
 
 
103
 
size_t mgg::DRMModeResources::num_encoders()
104
 
{
105
 
    return resources->count_encoders;
106
 
}
107
 
 
108
 
size_t mgg::DRMModeResources::num_crtcs()
109
 
{
110
 
    return resources->count_crtcs;
111
 
}
112
 
 
113
 
mgg::DRMModeConnectorUPtr mgg::DRMModeResources::connector(uint32_t id) const
114
 
{
115
 
    auto connector_raw = drmModeGetConnector(drm_fd, id);
116
 
    return DRMModeConnectorUPtr{connector_raw, ConnectorDeleter()};
117
 
}
118
 
 
119
 
mgg::DRMModeEncoderUPtr mgg::DRMModeResources::encoder(uint32_t id) const
120
 
{
121
 
    auto encoder_raw = drmModeGetEncoder(drm_fd, id);
122
 
    return DRMModeEncoderUPtr{encoder_raw, EncoderDeleter()};
123
 
}
124
 
 
125
 
mgg::DRMModeCrtcUPtr mgg::DRMModeResources::crtc(uint32_t id) const
126
 
{
127
 
    auto crtc_raw = drmModeGetCrtc(drm_fd, id);
128
 
    return DRMModeCrtcUPtr{crtc_raw, CrtcDeleter()};
129
 
}