18#include <QApplication>
31 Q_ASSERT(QThread::currentThread() == QApplication::instance()->thread());
41 , m_pipelines(pipelines)
53 m_blobs[&prop] = blob;
59 m_buffers[plane] = buffer;
64 m_planes.emplace(plane);
80 return doCommit(DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_NONBLOCK);
85 return doCommit(DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET);
90 return doCommit(DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT);
96 return doCommit(DRM_MODE_ATOMIC_ALLOW_MODESET);
99bool DrmAtomicCommit::doCommit(uint32_t flags)
101 std::vector<uint32_t> objects;
102 std::vector<uint32_t> propertyCounts;
103 std::vector<uint32_t> propertyIds;
104 std::vector<uint64_t> values;
105 objects.reserve(m_properties.size());
106 propertyCounts.reserve(m_properties.size());
107 uint64_t totalPropertiesCount = 0;
108 for (
const auto &[
object, properties] : m_properties) {
109 objects.push_back(
object);
110 propertyCounts.push_back(properties.size());
111 totalPropertiesCount += properties.size();
113 propertyIds.reserve(totalPropertiesCount);
114 values.reserve(totalPropertiesCount);
115 for (
const auto &[
object, properties] : m_properties) {
116 for (
const auto &[property, value] : properties) {
117 propertyIds.push_back(property);
118 values.push_back(value);
121 drm_mode_atomic commitData{
123 .count_objs = uint32_t(objects.size()),
124 .objs_ptr =
reinterpret_cast<uint64_t
>(objects.data()),
125 .count_props_ptr =
reinterpret_cast<uint64_t
>(propertyCounts.data()),
126 .props_ptr =
reinterpret_cast<uint64_t
>(propertyIds.data()),
127 .prop_values_ptr =
reinterpret_cast<uint64_t
>(values.data()),
129 .user_data =
reinterpret_cast<uint64_t
>(
this),
136 Q_ASSERT(QThread::currentThread() == QApplication::instance()->thread());
137 for (
const auto &[plane, buffer] : m_buffers) {
138 plane->setCurrentBuffer(buffer);
143 }
else if (m_cursorOnly) {
146 for (
const auto pipeline : std::as_const(m_pipelines)) {
147 pipeline->pageFlipped(timestamp,
type, m_mode);
153 return std::all_of(m_buffers.begin(), m_buffers.end(), [](
const auto &pair) {
154 const auto &[plane, buffer] = pair;
155 return !buffer || buffer->isReadable();
161 for (
const auto &[plane, buffer] : m_buffers) {
163 buffer->setDeadline(deadline);
180 for (
const auto &[obj, properties] : onTop->m_properties) {
181 auto &ownProperties = m_properties[obj];
182 for (
const auto &[prop, value] : properties) {
183 ownProperties[prop] = value;
186 for (
const auto &[plane, buffer] : onTop->m_buffers) {
187 m_buffers[plane] = buffer;
188 m_planes.emplace(plane);
190 for (
const auto &[prop, blob] : onTop->m_blobs) {
191 m_blobs[prop] = blob;
194 m_vrr = onTop->m_vrr;
201 m_cursorOnly = cursor;
211 , m_pipeline(pipeline)
219 uint32_t connectorId = connector->
id();
231 uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT;
233 flags |= DRM_MODE_PAGE_FLIP_ASYNC;
240 Q_ASSERT(QThread::currentThread() == QApplication::instance()->thread());
void setPresentationMode(PresentationMode mode)
const std::unordered_set< DrmPlane * > & modifiedPlanes() const
void addProperty(const DrmProperty &prop, uint64_t value)
void merge(DrmAtomicCommit *onTop)
void setVrr(DrmCrtc *crtc, bool vrr)
DrmAtomicCommit(const QList< DrmPipeline * > &pipelines)
bool areBuffersReadable() const
void addBuffer(DrmPlane *plane, const std::shared_ptr< DrmFramebuffer > &buffer)
void addBlob(const DrmProperty &prop, const std::shared_ptr< DrmBlob > &blob)
void setDeadline(std::chrono::steady_clock::time_point deadline)
bool isCursorOnly() const
void setCursorOnly(bool cursor)
std::optional< bool > isVrr() const
void pageFlipped(std::chrono::nanoseconds timestamp) const override
drmModeModeInfo * nativeMode()
void setCurrent(const std::shared_ptr< DrmFramebuffer > &buffer)
DrmLegacyCommit(DrmPipeline *pipeline, const std::shared_ptr< DrmFramebuffer > &buffer)
void pageFlipped(std::chrono::nanoseconds timestamp) const override
bool doPageflip(PresentationMode mode)
bool doModeset(DrmConnector *connector, DrmConnectorMode *mode)
void pageFlipped(std::chrono::nanoseconds timestamp, PageflipType type, PresentationMode mode)
DrmObject * drmObject() const
int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId, uint32_t x, uint32_t y, uint32_t *connectors, int count, drmModeModeInfoPtr mode)
int drmIoctl(int fd, unsigned long request, void *arg)
int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, uint32_t flags, void *user_data)