@@ -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, ¤tProgram);
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
562573Texture 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
641654const 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
0 commit comments