Changeset View
Changeset View
Standalone View
Standalone View
plugins/platforms/drm/drm_object.cpp
Show All 12 Lines | |||||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. | ||
16 | 16 | | |||
17 | You should have received a copy of the GNU General Public License | 17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | *********************************************************************/ | 19 | *********************************************************************/ | ||
20 | #include "drm_object.h" | 20 | #include "drm_object.h" | ||
21 | | ||||
22 | #include "drm_backend.h" | ||||
21 | #include "logging.h" | 23 | #include "logging.h" | ||
22 | 24 | | |||
23 | namespace KWin | 25 | namespace KWin | ||
24 | { | 26 | { | ||
25 | 27 | | |||
26 | /* | 28 | /* | ||
27 | * Defintions for class DrmObject | 29 | * Defintions for class DrmObject | ||
28 | */ | 30 | */ | ||
29 | 31 | | |||
30 | DrmObject::DrmObject(uint32_t object_id, int fd) | 32 | DrmObject::DrmObject(uint32_t object_id, DrmBackend *backend) | ||
31 | : m_fd(fd) | 33 | : m_backend(backend) | ||
32 | , m_id(object_id) | 34 | , m_id(object_id) | ||
33 | { | 35 | { | ||
34 | } | 36 | } | ||
35 | 37 | | |||
36 | DrmObject::~DrmObject() | 38 | DrmObject::~DrmObject() | ||
37 | { | 39 | { | ||
38 | foreach(Property* p, m_props) | 40 | foreach(Property* p, m_props) | ||
39 | delete p; | 41 | delete p; | ||
40 | } | 42 | } | ||
41 | 43 | | |||
42 | void DrmObject::initProp(int n, drmModeObjectProperties *properties, QVector<QByteArray> enumNames) | 44 | void DrmObject::initProp(int n, drmModeObjectProperties *properties, QVector<QByteArray> enumNames) | ||
43 | { | 45 | { | ||
44 | m_props.resize(m_propsNames.size()); | 46 | m_props.resize(m_propsNames.size()); | ||
45 | for (unsigned int i = 0; i < properties->count_props; ++i) { | 47 | for (unsigned int i = 0; i < properties->count_props; ++i) { | ||
46 | drmModePropertyRes *prop = drmModeGetProperty(m_fd, properties->props[i]); | 48 | drmModePropertyRes *prop = drmModeGetProperty(m_backend->fd(), properties->props[i]); | ||
47 | if (!prop) { | 49 | if (!prop) { | ||
48 | continue; | 50 | continue; | ||
49 | } | 51 | } | ||
50 | if (prop->name == m_propsNames[n]) { | 52 | if (prop->name == m_propsNames[n]) { | ||
51 | qCDebug(KWIN_DRM).nospace() << m_id << ": " << prop->name << "' (id " << prop->prop_id | 53 | qCDebug(KWIN_DRM).nospace() << m_id << ": " << prop->name << "' (id " << prop->prop_id | ||
52 | << "): " << properties->prop_values[i]; | 54 | << "): " << properties->prop_values[i]; | ||
53 | m_props[n] = new Property(prop, properties->prop_values[i], enumNames); | 55 | m_props[n] = new Property(prop, properties->prop_values[i], enumNames); | ||
54 | } | 56 | } | ||
55 | drmModeFreeProperty(prop); | 57 | drmModeFreeProperty(prop); | ||
56 | } | 58 | } | ||
57 | } | 59 | } | ||
58 | 60 | | |||
59 | void DrmObject::setPropValue(int index, uint64_t new_value) | 61 | bool DrmObject::atomicAddProperty(drmModeAtomicReq *req, int prop, uint64_t value) | ||
60 | { | 62 | { | ||
61 | Q_ASSERT(index < m_props.size()); | 63 | if (drmModeAtomicAddProperty(req, m_id, m_props[prop]->propId(), value) <= 0) { | ||
62 | m_props[index]->setValue(new_value); | 64 | qCWarning(KWIN_DRM) << "Adding property" << m_propsNames[prop] << "to atomic commit failed for object" << this; | ||
63 | return; | 65 | return false; | ||
66 | } | ||||
67 | return true; | ||||
64 | } | 68 | } | ||
65 | 69 | | |||
66 | bool DrmObject::atomicAddProperty(drmModeAtomicReq *req, int prop, uint64_t value) | 70 | bool DrmObject::atomicPopulate(drmModeAtomicReq *req) | ||
67 | { | 71 | { | ||
68 | uint32_t mask = 1U << prop; | 72 | bool ret = true; | ||
69 | if ((m_propsPending | m_propsValid) & mask && value == propValue(prop)) { | 73 | | ||
70 | // no change necessary, don't add property for next atomic commit | 74 | for (int i = 0; i < m_props.size(); i++) { | ||
71 | return true; | 75 | ret &= atomicAddProperty(req, i, m_props[i]->value()); | ||
72 | } | 76 | } | ||
73 | if (drmModeAtomicAddProperty(req, m_id, m_props[prop]->propId(), value) < 0) { | 77 | | ||
74 | // error when adding property | 78 | if (!ret) { | ||
79 | qCWarning(KWIN_DRM) << "Failed to populate atomic plane" << m_id; | ||||
75 | return false; | 80 | return false; | ||
76 | } | 81 | } | ||
77 | m_propsPending |= mask; | | |||
78 | m_propsValid &= ~mask; | | |||
79 | // adding property was successful | | |||
80 | return true; | 82 | return true; | ||
81 | } | 83 | } | ||
82 | 84 | | |||
83 | /* | 85 | /* | ||
84 | * Defintions for struct Prop | 86 | * Defintions for struct Prop | ||
85 | */ | 87 | */ | ||
86 | 88 | | |||
87 | DrmObject::Property::Property(drmModePropertyRes *prop, uint64_t val, QVector<QByteArray> enumNames) | 89 | DrmObject::Property::Property(drmModePropertyRes *prop, uint64_t val, QVector<QByteArray> enumNames) | ||
▲ Show 20 Lines • Show All 58 Lines • Show Last 20 Lines |