diff --git a/src/effects/CMakeLists.txt b/src/effects/CMakeLists.txt
index bc720d971d..77307f7796 100644
--- a/src/effects/CMakeLists.txt
+++ b/src/effects/CMakeLists.txt
@@ -169,8 +169,6 @@ set(kwin4_effect_builtins_sources
../service_utils.cpp
)
-qt5_add_resources(kwin4_effect_builtins_sources shaders.qrc)
-
add_library(kwin4_effect_builtins STATIC ${kwin4_effect_builtins_sources})
kcoreaddons_target_static_plugins(kwin4_effect_builtins "kwin/effects/plugins" LINK_OPTION "PRIVATE")
target_link_libraries(kwin4_effect_builtins PRIVATE
diff --git a/src/effects/invert/CMakeLists.txt b/src/effects/invert/CMakeLists.txt
index 25a56e8753..e64597e7cb 100644
--- a/src/effects/invert/CMakeLists.txt
+++ b/src/effects/invert/CMakeLists.txt
@@ -3,6 +3,7 @@
set(invert_SOURCES
invert.cpp
+ invert.qrc
main.cpp
)
diff --git a/src/effects/invert/invert.cpp b/src/effects/invert/invert.cpp
index 42d24acc10..c30792c5f3 100644
--- a/src/effects/invert/invert.cpp
+++ b/src/effects/invert/invert.cpp
@@ -22,6 +22,12 @@
Q_LOGGING_CATEGORY(KWIN_INVERT, "kwin_effect_invert", QtWarningMsg)
+static void ensureResources()
+{
+ // Must initialize resources manually because the effect is a static lib.
+ Q_INIT_RESOURCE(invert);
+}
+
namespace KWin
{
@@ -62,9 +68,10 @@ bool InvertEffect::supported()
bool InvertEffect::loadData()
{
+ ensureResources();
m_inited = true;
- m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("invert.frag"));
+ m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral(":/effects/invert/shaders/invert.frag"));
if (!m_shader->isValid()) {
qCCritical(KWIN_INVERT) << "The shader failed to load!";
return false;
diff --git a/src/effects/invert/invert.qrc b/src/effects/invert/invert.qrc
new file mode 100644
index 0000000000..e55aef4845
--- /dev/null
+++ b/src/effects/invert/invert.qrc
@@ -0,0 +1,6 @@
+
+
+ shaders/invert.frag
+ shaders/invert_core.frag
+
+
diff --git a/src/effects/invert/data/1.10/invert.frag b/src/effects/invert/shaders/invert.frag
similarity index 100%
rename from src/effects/invert/data/1.10/invert.frag
rename to src/effects/invert/shaders/invert.frag
diff --git a/src/effects/invert/data/1.40/invert.frag b/src/effects/invert/shaders/invert_core.frag
similarity index 100%
rename from src/effects/invert/data/1.40/invert.frag
rename to src/effects/invert/shaders/invert_core.frag
diff --git a/src/effects/lookingglass/CMakeLists.txt b/src/effects/lookingglass/CMakeLists.txt
index 47d9d9ae47..e2f6fec8b9 100644
--- a/src/effects/lookingglass/CMakeLists.txt
+++ b/src/effects/lookingglass/CMakeLists.txt
@@ -3,6 +3,7 @@
set(lookingglass_SOURCES
lookingglass.cpp
+ lookingglass.qrc
main.cpp
)
diff --git a/src/effects/lookingglass/lookingglass.cpp b/src/effects/lookingglass/lookingglass.cpp
index 2e3561991b..9a168992fc 100644
--- a/src/effects/lookingglass/lookingglass.cpp
+++ b/src/effects/lookingglass/lookingglass.cpp
@@ -29,6 +29,12 @@
Q_LOGGING_CATEGORY(KWIN_LOOKINGGLASS, "kwin_effect_lookingglass", QtWarningMsg)
+static void ensureResources()
+{
+ // Must initialize resources manually because the effect is a static lib.
+ Q_INIT_RESOURCE(lookingglass);
+}
+
namespace KWin
{
@@ -91,6 +97,8 @@ void LookingGlassEffect::reconfigure(ReconfigureFlags)
bool LookingGlassEffect::loadData()
{
+ ensureResources();
+
const QSize screenSize = effects->virtualScreenSize();
int texw = screenSize.width();
int texh = screenSize.height();
@@ -106,7 +114,7 @@ bool LookingGlassEffect::loadData()
return false;
}
- m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("lookingglass.frag"));
+ m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral(":/effects/lookingglass/shaders/lookingglass.frag"));
if (m_shader->isValid()) {
ShaderBinder binder(m_shader);
m_shader->setUniform("u_textureSize", QVector2D(screenSize.width(), screenSize.height()));
diff --git a/src/effects/lookingglass/lookingglass.qrc b/src/effects/lookingglass/lookingglass.qrc
new file mode 100644
index 0000000000..08aa8b86eb
--- /dev/null
+++ b/src/effects/lookingglass/lookingglass.qrc
@@ -0,0 +1,7 @@
+
+
+ shaders/lookingglass.frag
+ shaders/lookingglass_core.frag
+
+
+
diff --git a/src/effects/lookingglass/data/1.10/lookingglass.frag b/src/effects/lookingglass/shaders/lookingglass.frag
similarity index 100%
rename from src/effects/lookingglass/data/1.10/lookingglass.frag
rename to src/effects/lookingglass/shaders/lookingglass.frag
diff --git a/src/effects/lookingglass/data/1.40/lookingglass.frag b/src/effects/lookingglass/shaders/lookingglass_core.frag
similarity index 100%
rename from src/effects/lookingglass/data/1.40/lookingglass.frag
rename to src/effects/lookingglass/shaders/lookingglass_core.frag
diff --git a/src/effects/shaders.qrc b/src/effects/shaders.qrc
deleted file mode 100644
index b93081caad..0000000000
--- a/src/effects/shaders.qrc
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- invert/data/1.10/invert.frag
- lookingglass/data/1.10/lookingglass.frag
- startupfeedback/data/1.10/blinking-startup-fragment.glsl
-
-
- invert/data/1.40/invert.frag
- lookingglass/data/1.40/lookingglass.frag
- startupfeedback/data/1.40/blinking-startup-fragment.glsl
-
-
-
diff --git a/src/effects/startupfeedback/CMakeLists.txt b/src/effects/startupfeedback/CMakeLists.txt
index 451ffbda73..b1f0a62cce 100644
--- a/src/effects/startupfeedback/CMakeLists.txt
+++ b/src/effects/startupfeedback/CMakeLists.txt
@@ -5,6 +5,7 @@
set(startupfeedback_SOURCES
main.cpp
startupfeedback.cpp
+ startupfeedback.qrc
)
kwin4_add_effect_module(kwin4_effect_startupfeedback ${startupfeedback_SOURCES})
diff --git a/src/effects/startupfeedback/data/1.10/blinking-startup-fragment.glsl b/src/effects/startupfeedback/shaders/blinking-startup.frag
similarity index 100%
rename from src/effects/startupfeedback/data/1.10/blinking-startup-fragment.glsl
rename to src/effects/startupfeedback/shaders/blinking-startup.frag
diff --git a/src/effects/startupfeedback/data/1.40/blinking-startup-fragment.glsl b/src/effects/startupfeedback/shaders/blinking-startup_core.frag
similarity index 100%
rename from src/effects/startupfeedback/data/1.40/blinking-startup-fragment.glsl
rename to src/effects/startupfeedback/shaders/blinking-startup_core.frag
diff --git a/src/effects/startupfeedback/startupfeedback.cpp b/src/effects/startupfeedback/startupfeedback.cpp
index 9bf8779556..bec64aa81d 100644
--- a/src/effects/startupfeedback/startupfeedback.cpp
+++ b/src/effects/startupfeedback/startupfeedback.cpp
@@ -30,6 +30,12 @@
Q_LOGGING_CATEGORY(KWIN_STARTUPFEEDBACK, "kwin_effect_startupfeedback", QtWarningMsg)
+static void ensureResources()
+{
+ // Must initialize resources manually because the effect is a static lib.
+ Q_INIT_RESOURCE(startupfeedback);
+}
+
namespace KWin
{
@@ -145,7 +151,8 @@ void StartupFeedbackEffect::reconfigure(Effect::ReconfigureFlags flags)
else if (busyBlinking) {
m_type = BlinkingFeedback;
if (effects->compositingType() == OpenGLCompositing) {
- m_blinkingShader.reset(ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("blinking-startup-fragment.glsl")));
+ ensureResources();
+ m_blinkingShader.reset(ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral(":/effects/startupfeedback/shaders/blinking-startup.frag")));
if (m_blinkingShader->isValid()) {
qCDebug(KWIN_STARTUPFEEDBACK) << "Blinking Shader is valid";
} else {
diff --git a/src/effects/startupfeedback/startupfeedback.qrc b/src/effects/startupfeedback/startupfeedback.qrc
new file mode 100644
index 0000000000..175186d892
--- /dev/null
+++ b/src/effects/startupfeedback/startupfeedback.qrc
@@ -0,0 +1,7 @@
+
+
+ shaders/blinking-startup.frag
+ shaders/blinking-startup_core.frag
+
+
+
diff --git a/src/libkwineffects/kwinglutils.cpp b/src/libkwineffects/kwinglutils.cpp
index 8f8485c7dd..c89208d872 100644
--- a/src/libkwineffects/kwinglutils.cpp
+++ b/src/libkwineffects/kwinglutils.cpp
@@ -618,12 +618,6 @@ void ShaderManager::cleanup()
ShaderManager::ShaderManager()
{
- const qint64 coreVersionNumber = GLPlatform::instance()->isGLES() ? kVersionNumber(3, 0) : kVersionNumber(1, 40);
- if (GLPlatform::instance()->glslVersion() >= coreVersionNumber) {
- m_resourcePath = QStringLiteral(":/effect-shaders-1.40/");
- } else {
- m_resourcePath = QStringLiteral(":/effect-shaders-1.10/");
- }
}
ShaderManager::~ShaderManager()
@@ -783,26 +777,49 @@ GLShader *ShaderManager::generateCustomShader(ShaderTraits traits, const QByteAr
return shader;
}
+static QString resolveShaderFilePath(const QString &filePath)
+{
+ QString suffix;
+ QString extension;
+
+ const qint64 coreVersionNumber = GLPlatform::instance()->isGLES() ? kVersionNumber(3, 0) : kVersionNumber(1, 40);
+ if (GLPlatform::instance()->glslVersion() >= coreVersionNumber) {
+ suffix = QStringLiteral("_core");
+ }
+
+ if (filePath.endsWith(QStringLiteral(".frag"))) {
+ extension = QStringLiteral(".frag");
+ } else if (filePath.endsWith(QStringLiteral(".vert"))) {
+ extension = QStringLiteral(".vert");
+ } else {
+ qCWarning(LIBKWINGLUTILS) << filePath << "must end either with .vert or .frag";
+ return QString();
+ }
+
+ const QString prefix = filePath.chopped(extension.size());
+ return prefix + suffix + extension;
+}
+
GLShader *ShaderManager::generateShaderFromResources(ShaderTraits traits, const QString &vertexFile, const QString &fragmentFile)
{
- auto loadShaderFile = [this] (const QString &fileName) {
- QFile file(m_resourcePath + fileName);
+ auto loadShaderFile = [](const QString &filePath) {
+ QFile file(filePath);
if (file.open(QIODevice::ReadOnly)) {
return file.readAll();
}
- qCCritical(LIBKWINGLUTILS) << "Failed to read shader " << fileName;
+ qCCritical(LIBKWINGLUTILS) << "Failed to read shader " << filePath;
return QByteArray();
};
QByteArray vertexSource;
QByteArray fragmentSource;
if (!vertexFile.isEmpty()) {
- vertexSource = loadShaderFile(vertexFile);
+ vertexSource = loadShaderFile(resolveShaderFilePath(vertexFile));
if (vertexSource.isEmpty()) {
return new GLShader();
}
}
if (!fragmentFile.isEmpty()) {
- fragmentSource = loadShaderFile(fragmentFile);
+ fragmentSource = loadShaderFile(resolveShaderFilePath(fragmentFile));
if (fragmentSource.isEmpty()) {
return new GLShader();
}
diff --git a/src/libkwineffects/kwinglutils.h b/src/libkwineffects/kwinglutils.h
index 6270ab2753..443b32ad9b 100644
--- a/src/libkwineffects/kwinglutils.h
+++ b/src/libkwineffects/kwinglutils.h
@@ -306,7 +306,6 @@ private:
QStack m_boundShaders;
QHash m_shaderHash;
- QString m_resourcePath;
static ShaderManager *s_shaderManager;
};