From 9916712a62169606d845510028a3ea6f84bd442f Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Sat, 11 Jun 2016 21:46:24 +0300 Subject: kms++: organize into subdirs --- kms++/src/atomicreq.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 kms++/src/atomicreq.cpp (limited to 'kms++/src/atomicreq.cpp') diff --git a/kms++/src/atomicreq.cpp b/kms++/src/atomicreq.cpp new file mode 100644 index 0000000..01934ae --- /dev/null +++ b/kms++/src/atomicreq.cpp @@ -0,0 +1,92 @@ +#include +#include + +#include +#include + +#include + +#ifndef DRM_CLIENT_CAP_ATOMIC + +#define DRM_MODE_ATOMIC_TEST_ONLY 0 +#define DRM_MODE_ATOMIC_NONBLOCK 0 + +struct _drmModeAtomicReq; +typedef struct _drmModeAtomicReq* drmModeAtomicReqPtr; + +static inline drmModeAtomicReqPtr drmModeAtomicAlloc() { return 0; } +static inline void drmModeAtomicFree(drmModeAtomicReqPtr) { } +static inline int drmModeAtomicAddProperty(drmModeAtomicReqPtr, uint32_t, uint32_t, uint64_t) { return 0; } +static inline int drmModeAtomicCommit(int, drmModeAtomicReqPtr, int, void*) { return 0; } + +#endif // DRM_CLIENT_CAP_ATOMIC + +using namespace std; + +namespace kms +{ +AtomicReq::AtomicReq(Card& card) + : m_card(card) +{ + assert(card.has_atomic()); + m_req = drmModeAtomicAlloc(); +} + +AtomicReq::~AtomicReq() +{ + drmModeAtomicFree(m_req); +} + +void AtomicReq::add(uint32_t ob_id, uint32_t prop_id, uint64_t value) +{ + int r = drmModeAtomicAddProperty(m_req, ob_id, prop_id, value); + if (r <= 0) + throw std::invalid_argument("foo"); +} + +void AtomicReq::add(DrmObject *ob, Property *prop, uint64_t value) +{ + add(ob->id(), prop->id(), value); +} + +void AtomicReq::add(DrmObject* ob, const string& prop, uint64_t value) +{ + add(ob, m_card.get_prop(prop), value); +} + +void AtomicReq::add(DrmObject* ob, const map& values) +{ + for(const auto& kvp : values) + add(ob, kvp.first, kvp.second); +} + +int AtomicReq::test(bool allow_modeset) +{ + uint32_t flags = DRM_MODE_ATOMIC_TEST_ONLY; + + if (allow_modeset) + flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; + + return drmModeAtomicCommit(m_card.fd(), m_req, flags, 0); +} + +int AtomicReq::commit(void* data, bool allow_modeset) +{ + uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK; + + if (allow_modeset) + flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; + + return drmModeAtomicCommit(m_card.fd(), m_req, flags, data); +} + +int AtomicReq::commit_sync(bool allow_modeset) +{ + uint32_t flags = 0; + + if (allow_modeset) + flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; + + return drmModeAtomicCommit(m_card.fd(), m_req, flags, 0); +} +} -- cgit v1.2.3