[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.
This commit is contained in:
Martin Gräßlin 2015-11-30 10:51:27 +01:00
parent f13622a914
commit 712e46e468
2 changed files with 23 additions and 25 deletions

View file

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

View file

@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "startupfeedback.h"
// Qt
#include <QApplication>
#include <QFile>
#include <QSize>
#include <QStyle>
#include <QtCore/QStandardPaths>
@ -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);
}