KWin
Loading...
Searching...
No Matches
cursordelegate_opengl.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
8#include "compositor.h"
9#include "core/output.h"
10#include "core/pixelgrid.h"
11#include "core/renderlayer.h"
12#include "core/rendertarget.h"
13#include "core/renderviewport.h"
14#include "cursor.h"
15#include "opengl/gltexture.h"
16#include "opengl/glutils.h"
17#include "scene/cursorscene.h"
18
19#include <cmath>
20
21namespace KWin
22{
23
25 : m_output(output)
26{
27}
28
32
33void CursorDelegateOpenGL::paint(const RenderTarget &renderTarget, const QRegion &region)
34{
35 const QRegion dirty = region.intersected(layer()->mapToGlobal(layer()->rect()).toAlignedRect());
36 if (dirty.isEmpty()) {
37 return;
38 }
39
40 // Show the rendered cursor scene on the screen.
41 const QRect cursorRect = snapToPixelGrid(scaledRect(layer()->mapToGlobal(layer()->rect()), m_output->scale()));
42
43 // Render the cursor scene in an offscreen render target.
44 const QSize bufferSize = cursorRect.size();
45 const GLenum bufferFormat = renderTarget.colorDescription() == ColorDescription::sRGB ? GL_RGBA8 : GL_RGBA16F;
46 if (!m_texture || m_texture->size() != bufferSize || m_texture->internalFormat() != bufferFormat) {
47 m_texture = GLTexture::allocate(bufferFormat, bufferSize);
48 if (!m_texture) {
49 return;
50 }
51 m_framebuffer = std::make_unique<GLFramebuffer>(m_texture.get());
52 }
53
54 RenderTarget offscreenRenderTarget(m_framebuffer.get(), renderTarget.colorDescription());
55
56 RenderLayer renderLayer(layer()->loop());
57 renderLayer.setDelegate(std::make_unique<SceneDelegate>(Compositor::self()->cursorScene(), m_output));
58 renderLayer.delegate()->prePaint();
59 renderLayer.delegate()->paint(offscreenRenderTarget, infiniteRegion());
60 renderLayer.delegate()->postPaint();
61
62 QMatrix4x4 mvp;
63 mvp.scale(1, -1); // flip the y axis back
64 mvp *= renderTarget.transform().toMatrix();
65 mvp.scale(1, -1); // undo ortho() flipping the y axis
66 mvp.ortho(QRectF(QPointF(0, 0), m_output->transform().map(renderTarget.size())));
67 mvp.translate(cursorRect.x(), cursorRect.y());
68
69 GLFramebuffer *fbo = renderTarget.framebuffer();
71
72 const bool clipping = region != infiniteRegion();
73 const QRegion clipRegion = clipping ? RenderViewport(m_output->rectF(), m_output->scale(), renderTarget).mapToRenderTarget(dirty) : infiniteRegion();
74
75 if (clipping) {
76 glEnable(GL_SCISSOR_TEST);
77 }
78
79 // Don't need to call GLVertexBuffer::beginFrame() and GLVertexBuffer::endOfFrame() because
80 // the GLVertexBuffer::streamingBuffer() is not being used when painting cursor.
81 glEnable(GL_BLEND);
82 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
83
86 m_texture->render(clipRegion, cursorRect.size(), clipping);
87 glDisable(GL_BLEND);
88
89 if (clipping) {
90 glDisable(GL_SCISSOR_TEST);
91 }
92
94}
95
96} // namespace KWin
97
98#include "moc_cursordelegate_opengl.cpp"
static const ColorDescription sRGB
Definition colorspace.h:132
static Compositor * self()
void paint(const RenderTarget &renderTarget, const QRegion &region) override
OpenGL framebuffer object.
static GLFramebuffer * popFramebuffer()
static void pushFramebuffer(GLFramebuffer *fbo)
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)
qreal scale() const
Definition output.cpp:455
OutputTransform transform() const
Definition output.cpp:369
QRectF rectF() const
Definition output.h:489
QSizeF map(const QSizeF &size) const
Definition output.cpp:242
QMatrix4x4 toMatrix() const
Definition output.cpp:300
virtual void paint(const RenderTarget &renderTarget, const QRegion &region)=0
void setDelegate(std::unique_ptr< RenderLayerDelegate > delegate)
RenderLayerDelegate * delegate() const
GLFramebuffer * framebuffer() const
QSize size() const
const ColorDescription & colorDescription() const
OutputTransform transform() const
QRectF mapToRenderTarget(const QRectF &logicalGeometry) const
KWIN_EXPORT QRect infiniteRegion()
Definition globals.h:234
KWIN_EXPORT QPoint snapToPixelGrid(const QPointF &point)
Definition pixelgrid.h:16
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)
Definition globals.h:243