forked from matinlotfali/KDE-Rounded-Corners
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShaderManager.cpp
More file actions
90 lines (82 loc) · 3.5 KB
/
ShaderManager.cpp
File metadata and controls
90 lines (82 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
// Created by matin on 20/07/22.
//
#include <kwinglplatform.h>
#include <QFile>
#include <QStandardPaths>
#include <kwineffects.h>
#include "ShaderManager.h"
ShaderManager::ShaderManager():
m_manager(KWin::ShaderManager::instance())
{
const QString shadersDir = IsLegacy()? "kwin/shaders/1.10/": "kwin/shaders/1.40/";
const QString fragmentshader = QStandardPaths::locate(QStandardPaths::GenericDataLocation, shadersDir + QStringLiteral("shapecorners.frag"));
// m_shader = KWin::ShaderManager::instance()->loadFragmentShader(KWin::ShaderManager::GenericShader, fragmentshader);
QFile file(fragmentshader);
if (file.open(QFile::ReadOnly))
{
QByteArray frag = file.readAll();
auto shader = m_manager->generateCustomShader(KWin::ShaderTrait::MapTexture, QByteArray(), frag);
#if KWIN_EFFECT_API_VERSION >= 235
m_shader = std::move(shader);
#else
m_shader.reset(shader);
#endif
file.close();
// qDebug() << frag;
if (m_shader->isValid())
{
m_shader_windowActive = m_shader->uniformLocation("windowActive");
m_shader_windowHasDecoration = m_shader->uniformLocation("windowHasDecoration");
m_shader_windowSize = m_shader->uniformLocation("windowSize");
m_shader_shadowColor = m_shader->uniformLocation("shadowColor");
m_shader_radius = m_shader->uniformLocation("radius");
m_shader_outlineColor = m_shader->uniformLocation("outlineColor");
m_shader_outlineThickness = m_shader->uniformLocation("outlineThickness");
m_shader_back = m_shader->uniformLocation("back");
qInfo() << "ShapeCorners: shaders loaded.";
}
else
qCritical() << "ShapeCorners: no valid shaders found! ShapeCorners will not work.";
}
else
{
qCritical() << "ShapeCorners: no shaders found! Exiting...";
}
}
bool ShaderManager::IsValid() const {
return m_shader && m_shader->isValid();
}
bool isWindowActive(KWin::EffectWindow *w) {
return KWin::effects->activeWindow() == w;
}
const std::unique_ptr<KWin::GLShader>&
ShaderManager::Bind(KWin::EffectWindow *w, const ConfigModel& config) const {
m_manager->pushShader(m_shader.get());
m_shader->setUniform(m_shader_windowActive, isWindowActive(w));
m_shader->setUniform(m_shader_windowSize, QVector2D(w->frameGeometry().width(), w->frameGeometry().height()));
m_shader->setUniform(m_shader_windowHasDecoration, w->hasDecoration());
m_shader->setUniform(m_shader_shadowColor, w->frameGeometry() != w->expandedGeometry()? config.m_shadowColor: QColor(Qt::transparent));
m_shader->setUniform(m_shader_radius, config.m_size);
m_shader->setUniform(m_shader_outlineColor, isWindowActive(w) ? config.m_outlineColor : config.m_inactiveOutlineColor);
m_shader->setUniform(m_shader_outlineThickness, config.m_outlineThickness);
m_shader->setUniform(m_shader_back, 0);
return m_shader;
}
const std::unique_ptr<KWin::GLShader>&
ShaderManager::Bind(QMatrix4x4 mvp, KWin::EffectWindow *w, const ConfigModel& config) const {
Bind(w, config);
m_shader->setUniform(KWin::GLShader::ModelViewProjectionMatrix, mvp);
return m_shader;
}
void ShaderManager::Unbind() const {
m_manager->popShader();
}
bool ShaderManager::IsLegacy() {
#ifdef KWIN_HAVE_OPENGLES
const qint64 coreVersionNumber = kVersionNumber(3, 0);
#else
const qint64 version = KWin::kVersionNumber(1, 40);
#endif
return (KWin::GLPlatform::instance()->glslVersion() < version);
}