Skip to content

Commit 9c8640d

Browse files
committed
RenderedTarget: Cache shader program
1 parent ab64766 commit 9c8640d

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

src/renderedtarget.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -544,19 +544,30 @@ void RenderedTarget::render(double scale) const
544544
m_glF->glViewport((stageWidth / 2) + bounds.left() * scale, (stageHeight / 2) + bounds.bottom() * scale, bounds.width() * scale, bounds.height() * scale);
545545

546546
ShaderManager *shaderManager = ShaderManager::instance();
547-
QOpenGLShaderProgram *shaderProgram = shaderManager->getShaderProgram(m_graphicEffects);
548-
Q_ASSERT(shaderProgram);
549-
Q_ASSERT(shaderProgram->isLinked());
550547

551-
shaderProgram->bind();
548+
if (!m_shaderProgram) {
549+
m_shaderProgram = shaderManager->getShaderProgram(m_graphicEffects);
550+
Q_ASSERT(m_shaderProgram);
551+
Q_ASSERT(m_shaderProgram->isLinked());
552+
553+
m_shaderProgram->bind();
554+
ShaderManager::setUniforms(m_shaderProgram, 0, m_cpuTexture.size(), m_graphicEffects);
555+
}
556+
557+
GLint currentProgram = 0;
558+
m_glF->glGetIntegerv(GL_CURRENT_PROGRAM, &currentProgram);
559+
560+
if (static_cast<GLuint>(currentProgram) != m_shaderProgram->programId())
561+
m_shaderProgram->bind();
562+
552563
m_glF->glActiveTexture(GL_TEXTURE0);
553564
m_glF->glBindTexture(GL_TEXTURE_2D, m_cpuTexture.handle());
554-
shaderManager->setUniforms(shaderProgram, 0, m_cpuTexture.size(), m_graphicEffects);
555-
shaderProgram->setUniformValue("u_projectionMatrix", projectionMatrix);
556-
shaderProgram->setUniformValue("u_modelMatrix", modelMatrix);
565+
566+
m_shaderProgram->setUniformValue("u_projectionMatrix", projectionMatrix);
567+
m_shaderProgram->setUniformValue("u_modelMatrix", modelMatrix);
557568
m_glF->glDrawArrays(GL_TRIANGLES, 0, 6);
558569

559-
shaderProgram->release();
570+
// NOTE: Keep the shader program bound for future use
560571
}
561572

562573
Texture RenderedTarget::texture() const
@@ -613,6 +624,7 @@ void RenderedTarget::setGraphicEffect(ShaderManager::Effect effect, double value
613624

614625
if (changed) {
615626
update();
627+
m_shaderProgram = nullptr;
616628

617629
if (ShaderManager::effectShapeChanges(effect)) {
618630
m_convexHullDirty = true;
@@ -636,6 +648,7 @@ void RenderedTarget::clearGraphicEffects()
636648

637649
m_graphicEffects.clear();
638650
m_graphicEffectMask = ShaderManager::Effect::NoEffect;
651+
m_shaderProgram = nullptr;
639652
}
640653

641654
const std::vector<QPoint> &RenderedTarget::hullPoints() const
@@ -804,6 +817,7 @@ void RenderedTarget::calculateSize()
804817

805818
m_transformedHullDirty = true;
806819
m_matricesDirty = true;
820+
m_shaderProgram = nullptr;
807821
}
808822
}
809823

src/renderedtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class RenderedTarget : public IRenderedTarget
164164
mutable std::unique_ptr<QOpenGLFunctions> m_glF;
165165
mutable std::unordered_map<ShaderManager::Effect, double> m_graphicEffects;
166166
mutable ShaderManager::Effect m_graphicEffectMask = ShaderManager::Effect::NoEffect;
167+
mutable QOpenGLShaderProgram *m_shaderProgram = nullptr;
167168
double m_size = 1;
168169
double m_x = 0;
169170
double m_y = 0;

0 commit comments

Comments
 (0)