aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-08-07 13:18:10 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-08 12:42:36 +0200
commit9380783ad2c7e6e46ae8ab4bab1d561526a96f05 (patch)
tree5c047fc32c1a7c8ea9fc0965b9ac503456304a89 /src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp
parentacb2792b11cf39d06d6e2d49f3dbd31308e0941b (diff)
Avoid redundant state changes in distancefield text shader
Change-Id: I7efdd167192017acefb4745d433b77b6d0ff85e7 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp')
-rw-r--r--src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp
index 3556a4ebe5..0739a321d8 100644
--- a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp
+++ b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp
@@ -63,6 +63,8 @@ protected:
virtual const char *fragmentShader() const;
void updateAlphaRange(ThresholdFunc thresholdFunc, AntialiasingSpreadFunc spreadFunc);
+ void updateColor(const QVector4D &c);
+ void updateTextureScale(const QVector2D &ts);
float m_fontScale;
float m_matrixScale;
@@ -72,6 +74,11 @@ protected:
int m_alphaMin_id;
int m_alphaMax_id;
int m_color_id;
+
+ QVector2D m_lastTextureScale;
+ QVector4D m_lastColor;
+ float m_lastAlphaMin;
+ float m_lastAlphaMax;
};
const char *QSGDistanceFieldTextMaterialShader::vertexShader() const {
@@ -109,6 +116,8 @@ char const *const *QSGDistanceFieldTextMaterialShader::attributeNames() const {
QSGDistanceFieldTextMaterialShader::QSGDistanceFieldTextMaterialShader()
: m_fontScale(1.0)
, m_matrixScale(1.0)
+ , m_lastAlphaMin(-1)
+ , m_lastAlphaMax(-1)
{
}
@@ -119,8 +128,30 @@ void QSGDistanceFieldTextMaterialShader::updateAlphaRange(ThresholdFunc threshol
float range = spreadFunc(combinedScale);
float alphaMin = qMax(0.0f, base - range);
float alphaMax = qMin(base + range, 1.0f);
- program()->setUniformValue(m_alphaMin_id, GLfloat(alphaMin));
- program()->setUniformValue(m_alphaMax_id, GLfloat(alphaMax));
+ if (alphaMin != m_lastAlphaMin) {
+ program()->setUniformValue(m_alphaMin_id, GLfloat(alphaMin));
+ m_lastAlphaMin = alphaMin;
+ }
+ if (alphaMax != m_lastAlphaMax) {
+ program()->setUniformValue(m_alphaMax_id, GLfloat(alphaMax));
+ m_lastAlphaMax = alphaMax;
+ }
+}
+
+void QSGDistanceFieldTextMaterialShader::updateColor(const QVector4D &c)
+{
+ if (m_lastColor != c) {
+ program()->setUniformValue(m_color_id, c);
+ m_lastColor = c;
+ }
+}
+
+void QSGDistanceFieldTextMaterialShader::updateTextureScale(const QVector2D &ts)
+{
+ if (m_lastTextureScale != ts) {
+ program()->setUniformValue(m_textureScale_id, ts);
+ m_lastTextureScale = ts;
+ }
}
void QSGDistanceFieldTextMaterialShader::initialize()
@@ -146,7 +177,7 @@ void QSGDistanceFieldTextMaterialShader::updateState(const RenderState &state, Q
|| state.isOpacityDirty()) {
QVector4D color = material->color();
color *= state.opacity();
- program()->setUniformValue(m_color_id, color);
+ updateColor(color);
}
bool updateRange = false;
@@ -170,8 +201,9 @@ void QSGDistanceFieldTextMaterialShader::updateState(const RenderState &state, Q
if (updated
|| oldMaterial == 0
|| oldMaterial->texture()->textureId != material->texture()->textureId) {
- program()->setUniformValue(m_textureScale_id, QVector2D(1.0 / material->textureSize().width(),
- 1.0 / material->textureSize().height()));
+ updateTextureScale(QVector2D(1.0 / material->textureSize().width(),
+ 1.0 / material->textureSize().height()));
+
glBindTexture(GL_TEXTURE_2D, material->texture()->textureId);
if (updated) {