KWin
Loading...
Searching...
No Matches
drm_dmabuf_feedback.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2022 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
10
11#include "drm_egl_backend.h"
12#include "drm_gpu.h"
13#include "wayland/surface.h"
14
15namespace KWin
16{
17
19 : m_gpu(gpu)
20 , m_eglBackend(eglBackend)
21{
22}
23
25{
26 if (m_surface && !m_attemptedThisFrame) {
27 if (const auto &feedback = m_surface->dmabufFeedbackV1()) {
28 feedback->setTranches({});
29 }
30 m_surface = nullptr;
31 }
32 m_attemptedThisFrame = false;
33}
34
36{
37 if (surface != m_surface) {
38 if (m_surface && m_surface->dmabufFeedbackV1()) {
39 m_surface->dmabufFeedbackV1()->setTranches({});
40 }
41 m_surface = surface;
42 m_attemptedFormats = {};
43 }
44}
45
46void DmabufFeedback::scanoutFailed(SurfaceInterface *surface, const QMap<uint32_t, QList<uint64_t>> &formats)
47{
48 m_attemptedThisFrame = true;
49 if (surface != m_surface) {
50 m_attemptedFormats = {};
51 if (m_surface && m_surface->dmabufFeedbackV1()) {
52 m_surface->dmabufFeedbackV1()->setTranches({});
53 }
54 m_surface = surface;
55 }
56 if (const auto &feedback = m_surface->dmabufFeedbackV1()) {
57 const DmaBufAttributes *dmabufAttrs = surface->buffer()->dmabufAttributes();
58 if (!m_attemptedFormats[dmabufAttrs->format].contains(dmabufAttrs->modifier)) {
59 m_attemptedFormats[dmabufAttrs->format] << dmabufAttrs->modifier;
60 QList<LinuxDmaBufV1Feedback::Tranche> scanoutTranches;
61 const auto tranches = m_eglBackend->tranches();
62 for (const auto &tranche : tranches) {
63 LinuxDmaBufV1Feedback::Tranche scanoutTranche;
64 for (auto it = tranche.formatTable.constBegin(); it != tranche.formatTable.constEnd(); it++) {
65 const uint32_t format = it.key();
66 const auto trancheModifiers = it.value();
67 const auto drmModifiers = formats[format];
68 for (const auto &mod : trancheModifiers) {
69 if (drmModifiers.contains(mod) && !m_attemptedFormats[format].contains(mod)) {
70 scanoutTranche.formatTable[format] << mod;
71 }
72 }
73 }
74 if (!scanoutTranche.formatTable.isEmpty()) {
75 scanoutTranche.device = m_gpu->deviceId();
77 scanoutTranches << scanoutTranche;
78 }
79 }
80 feedback->setTranches(scanoutTranches);
81 }
82 }
83}
84
85}
QList< LinuxDmaBufV1Feedback::Tranche > tranches() const
void scanoutFailed(SurfaceInterface *surface, const QMap< uint32_t, QList< uint64_t > > &formats)
DmabufFeedback(DrmGpu *gpu, EglGbmBackend *eglBackend)
void scanoutSuccessful(SurfaceInterface *surface)
dev_t deviceId() const
Definition drm_gpu.cpp:653
OpenGL Backend using Egl on a GBM surface.
virtual const DmaBufAttributes * dmabufAttributes() const
Resource representing a wl_surface.
Definition surface.h:80
GraphicsBuffer * buffer() const
Definition surface.cpp:809
GLenum format
Definition gltexture.cpp:49
QHash< uint32_t, QList< uint64_t > > formatTable