diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2013-08-07 13:18:10 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-08 12:42:36 +0200 |
commit | 9380783ad2c7e6e46ae8ab4bab1d561526a96f05 (patch) | |
tree | 5c047fc32c1a7c8ea9fc0965b9ac503456304a89 /src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp | |
parent | acb2792b11cf39d06d6e2d49f3dbd31308e0941b (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.cpp | 42 |
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) { |