AtomicReq: use nonblocking commit
[android/external-libkmsxx.git] / libkms++ / atomicreq.cpp
1 #include <cassert>
2 #include <stdexcept>
4 #include <xf86drm.h>
5 #include <xf86drmMode.h>
7 #include "atomicreq.h"
8 #include "property.h"
9 #include "card.h"
11 #ifndef DRM_CLIENT_CAP_ATOMIC
13 #define DRM_MODE_ATOMIC_TEST_ONLY 0
15 struct _drmModeAtomicReq;
16 typedef struct _drmModeAtomicReq* drmModeAtomicReqPtr;
18 static inline drmModeAtomicReqPtr drmModeAtomicAlloc() { return 0; }
19 static inline void drmModeAtomicFree(drmModeAtomicReqPtr) { }
20 static inline int drmModeAtomicAddProperty(drmModeAtomicReqPtr, uint32_t, uint32_t, uint64_t) { return 0; }
21 static inline int drmModeAtomicCommit(int, drmModeAtomicReqPtr, int, void*) { return 0; }
23 #endif // DRM_CLIENT_CAP_ATOMIC
25 using namespace std;
27 namespace kms
28 {
29 AtomicReq::AtomicReq(Card& card)
30         : m_card(card)
31 {
32         assert(card.has_atomic());
33         m_req = drmModeAtomicAlloc();
34 }
36 AtomicReq::~AtomicReq()
37 {
38         drmModeAtomicFree(m_req);
39 }
41 void AtomicReq::add(uint32_t ob_id, uint32_t prop_id, uint64_t value)
42 {
43         int r = drmModeAtomicAddProperty(m_req, ob_id, prop_id, value);
44         if (r <= 0)
45                 throw std::invalid_argument("foo");
46 }
48 void AtomicReq::add(DrmObject *ob, Property *prop, uint64_t value)
49 {
50         add(ob->id(), prop->id(), value);
51 }
53 void AtomicReq::add(DrmObject* ob, const string& prop, uint64_t value)
54 {
55         add(ob, m_card.get_prop(prop), value);
56 }
58 int AtomicReq::test()
59 {
60         uint32_t flags = DRM_MODE_ATOMIC_TEST_ONLY;
62         return drmModeAtomicCommit(m_card.fd(), m_req, flags, 0);
63 }
65 int AtomicReq::commit(void* data)
66 {
67         uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
69         return drmModeAtomicCommit(m_card.fd(), m_req, flags, data);
70 }
71 }