KWin
Loading...
Searching...
No Matches
regionscreencastsource.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2022 Aleix Pol Gonzalez <aleixpol@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
8#include "screencastutils.h"
9
10#include "opengl/gltexture.h"
11#include "opengl/glutils.h"
12#include <compositor.h>
13#include <core/output.h>
14#include <drm_fourcc.h>
16#include <workspace.h>
17
18#include <QPainter>
19
20namespace KWin
21{
22
23RegionScreenCastSource::RegionScreenCastSource(const QRect &region, qreal scale, QObject *parent)
24 : ScreenCastSource(parent)
25 , m_region(region)
26 , m_scale(scale)
27{
28 Q_ASSERT(m_region.isValid());
29 Q_ASSERT(m_scale > 0);
30}
31
33{
34 return m_region.size() * m_scale;
35}
36
38{
39 return true;
40}
41
43{
44 return DRM_FORMAT_ARGB8888;
45}
46
48{
49 m_last = output->renderLoop()->lastPresentationTimestamp();
50
51 if (m_renderedTexture) {
52 const auto [outputTexture, colorDescription] = Compositor::self()->scene()->textureForOutput(output);
53 const auto outputGeometry = output->geometry();
54 if (!outputTexture || !m_region.intersects(output->geometry())) {
55 return;
56 }
57
58 GLFramebuffer::pushFramebuffer(m_target.get());
59
61 QMatrix4x4 projectionMatrix;
62 projectionMatrix.scale(1, -1);
63 projectionMatrix.ortho(m_region);
64 projectionMatrix.translate(outputGeometry.left(), outputGeometry.top());
65
67 shaderBinder.shader()->setColorspaceUniformsToSRGB(colorDescription);
68
69 outputTexture->render(outputGeometry.size());
71 }
72}
73
74std::chrono::nanoseconds RegionScreenCastSource::clock() const
75{
76 return m_last;
77}
78
79void RegionScreenCastSource::ensureTexture()
80{
81 if (!m_renderedTexture) {
82 m_renderedTexture = GLTexture::allocate(GL_RGBA8, textureSize());
83 if (!m_renderedTexture) {
84 return;
85 }
86 m_renderedTexture->setContentTransform(OutputTransform::FlipY);
87 m_renderedTexture->setFilter(GL_LINEAR);
88 m_renderedTexture->setWrapMode(GL_CLAMP_TO_EDGE);
89
90 m_target = std::make_unique<GLFramebuffer>(m_renderedTexture.get());
91 const auto allOutputs = workspace()->outputs();
92 for (auto output : allOutputs) {
93 if (output->geometry().intersects(m_region)) {
94 updateOutput(output);
95 }
96 }
97 }
98}
99
101{
102 ensureTexture();
103
106
107 QMatrix4x4 projectionMatrix;
108 projectionMatrix.scale(1, -1);
109 projectionMatrix.ortho(QRect(QPoint(), target->size()));
111
112 m_renderedTexture->render(target->size());
113
116}
117
118void RegionScreenCastSource::render(spa_data *spa, spa_video_format format)
119{
120 ensureTexture();
121 grabTexture(m_renderedTexture.get(), spa, format);
122}
123
125{
126 uint ret = 0;
127 const auto allOutputs = workspace()->outputs();
128 for (auto output : allOutputs) {
129 if (output->geometry().intersects(m_region)) {
130 ret = std::max<uint>(ret, output->refreshRate());
131 }
132 }
133 return ret;
134}
135}
136
137#include "moc_regionscreencastsource.cpp"
WorkspaceScene * scene() const
Definition compositor.h:60
static Compositor * self()
OpenGL framebuffer object.
QSize size() const
static GLFramebuffer * popFramebuffer()
static void pushFramebuffer(GLFramebuffer *fbo)
bool setColorspaceUniformsToSRGB(const ColorDescription &src)
Definition glshader.cpp:462
bool setUniform(const char *name, float value)
Definition glshader.cpp:301
static std::unique_ptr< GLTexture > allocate(GLenum internalFormat, const QSize &size, int levels=1)
virtual RenderLoop * renderLoop() const =0
QRect geometry
Definition output.h:134
std::chrono::nanoseconds clock() const override
void render(GLFramebuffer *target) override
RegionScreenCastSource(const QRect &region, qreal scale, QObject *parent=nullptr)
std::chrono::nanoseconds lastPresentationTimestamp() const
static ShaderManager * instance()
GLShader * pushShader(ShaderTraits traits)
QList< Output * > outputs() const
Definition workspace.h:762
virtual std::pair< std::shared_ptr< GLTexture >, ColorDescription > textureForOutput(Output *output) const
GLenum format
Definition gltexture.cpp:49
Workspace * workspace()
Definition workspace.h:830