From 712e46e468aad6a0cd373bb99352b50d80b2556a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Mon, 30 Nov 2015 10:51:27 +0100 Subject: [PATCH] [effects] Port startupfeedback to shader trait api The blinking shader is adjusted to use a shader trait vertex shader and gets generated with a shader trait variant. Overall the code is simplified to ensure that we always have a shader bound with the correct mvp matrix when rendering the icon. --- .../data/blinking-startup-fragment.glsl | 8 ++-- effects/startupfeedback/startupfeedback.cpp | 40 +++++++++---------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/effects/startupfeedback/data/blinking-startup-fragment.glsl b/effects/startupfeedback/data/blinking-startup-fragment.glsl index 72200c0c98..3229f58026 100644 --- a/effects/startupfeedback/data/blinking-startup-fragment.glsl +++ b/effects/startupfeedback/data/blinking-startup-fragment.glsl @@ -1,13 +1,13 @@ uniform sampler2D sampler; -uniform vec4 u_color; +uniform vec4 geometryColor; -varying vec2 varyingTexCoords; +varying vec2 texcoord0; void main() { - vec4 tex = texture2D(sampler, varyingTexCoords); + vec4 tex = texture2D(sampler, texcoord0); if (tex.a != 1.0) { - tex = u_color; + tex = geometryColor; } gl_FragColor = tex; } diff --git a/effects/startupfeedback/startupfeedback.cpp b/effects/startupfeedback/startupfeedback.cpp index 4084441156..3019a2fd7b 100644 --- a/effects/startupfeedback/startupfeedback.cpp +++ b/effects/startupfeedback/startupfeedback.cpp @@ -20,6 +20,7 @@ along with this program. If not, see . #include "startupfeedback.h" // Qt #include +#include #include #include #include @@ -131,11 +132,17 @@ void StartupFeedbackEffect::reconfigure(Effect::ReconfigureFlags flags) delete m_blinkingShader; m_blinkingShader = 0; const QString shader = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/blinking-startup-fragment.glsl")); - m_blinkingShader = ShaderManager::instance()->loadFragmentShader(ShaderManager::SimpleShader, shader); - if (m_blinkingShader->isValid()) { - qCDebug(KWINEFFECTS) << "Blinking Shader is valid"; + + QFile ff(shader); + if (ff.open(QIODevice::ReadOnly)) { + m_blinkingShader = ShaderManager::instance()->generateCustomShader(ShaderTrait::MapTexture, QByteArray(), ff.readAll()); + if (m_blinkingShader->isValid()) { + qCDebug(KWINEFFECTS) << "Blinking Shader is valid"; + } else { + qCDebug(KWINEFFECTS) << "Blinking Shader is not valid"; + } } else { - qCDebug(KWINEFFECTS) << "Blinking Shader is not valid"; + qCCritical(KWINEFFECTS) << "Couldn't open" << shader << "for reading!"; } } } else @@ -187,27 +194,18 @@ void StartupFeedbackEffect::paintScreen(int mask, QRegion region, ScreenPaintDat glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); texture->bind(); - bool useShader = false; - if (m_type == BlinkingFeedback) { + if (m_type == BlinkingFeedback && m_blinkingShader && m_blinkingShader->isValid()) { const QColor& blinkingColor = BLINKING_COLORS[ FRAME_TO_BLINKING_COLOR[ m_frame ]]; - if (m_blinkingShader && m_blinkingShader->isValid()) { - useShader = true; - ShaderManager::instance()->pushShader(m_blinkingShader); - m_blinkingShader->setUniform("u_color", blinkingColor); - } + ShaderManager::instance()->pushShader(m_blinkingShader); + m_blinkingShader->setUniform(GLShader::Color, blinkingColor); } else { - useShader = true; - auto s = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); - QMatrix4x4 mvp; - const QSize size = effects->virtualScreenSize(); - mvp.ortho(0, size.width(), size.height(), 0, 0, 65535); - mvp.translate(m_currentGeometry.x(), m_currentGeometry.y()); - s->setUniform(GLShader::ModelViewProjectionMatrix, mvp); + ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); } + QMatrix4x4 mvp = data.projectionMatrix(); + mvp.translate(m_currentGeometry.x(), m_currentGeometry.y()); + ShaderManager::instance()->getBoundShader()->setUniform(GLShader::ModelViewProjectionMatrix, mvp); texture->render(m_currentGeometry, m_currentGeometry); - if (useShader) { - ShaderManager::instance()->popShader(); - } + ShaderManager::instance()->popShader(); texture->unbind(); glDisable(GL_BLEND); }