summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp')
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp
index 879d312341..132806a2e3 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/qvsp2blendingdevice.cpp
@@ -219,11 +219,12 @@ bool QVsp2BlendingDevice::blend(int outputDmabufFd)
if (!m_dirty)
qWarning("Blending without being dirty, should not be necessary");
- if (!m_inputs[0].enabled) {
- qWarning("Vsp2: Can't blend with layer 0 disabled");
+ if (!hasContinuousLayers()) {
+ qWarning("Vsp2: Can't blend when layers are not enabled in order from 0 without gaps.");
return false;
}
+ bool queueingFailed = false;
// Queue dma input buffers
for (int i=0; i < m_inputs.size(); ++i) {
auto &input = m_inputs[i];
@@ -233,12 +234,22 @@ bool QVsp2BlendingDevice::blend(int outputDmabufFd)
<< "with dmabuf" << input.dmabuf.fd
<< "and size" << input.geometry.size();
- if (!disableInput(i))
- qWarning() << "Vsp2: Failed to disable input" << i;
+ queueingFailed = true;
}
}
}
+ if (queueingFailed) {
+ qWarning() << "Vsp2: Trying to clean up queued buffers";
+ for (auto &input : qAsConst(m_inputs)) {
+ if (input.enabled) {
+ if (!input.rpfInput->clearBuffers())
+ qWarning() << "Vsp2: Failed to remove buffers after an aborted blend";
+ }
+ }
+ return false;
+ }
+
if (!m_wpfOutput->queueBuffer(outputDmabufFd, m_screenSize)) {
qWarning() << "Vsp2: Failed to queue blending output buffer" << outputDmabufFd << m_screenSize;
return false;
@@ -270,6 +281,17 @@ int QVsp2BlendingDevice::numInputs() const
return m_inputs.size();
}
+bool QVsp2BlendingDevice::hasContinuousLayers() const
+{
+ bool seenDisabled = false;
+ for (auto &input : qAsConst(m_inputs)) {
+ if (seenDisabled && input.enabled)
+ return false;
+ seenDisabled |= !input.enabled;
+ }
+ return m_inputs[0].enabled;
+}
+
bool QVsp2BlendingDevice::streamOn()
{
for (auto &input : m_inputs) {