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; };