From c7fd92ab71dbeb8b70a85a9d1e920ffd55a45668 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= <kaj.gronholm@qt.io>
Date: Thu, 16 Apr 2020 12:01:14 +0300
Subject: [PATCH] Reset default blend equation

Combining sourceItem Textures and blendmodes which set blend equation
caused GL state issues. So reset blend equation if needed.

Task-number: QTBUG-83462
Change-Id: I9d852dabadf8da59f023e29b62702552a60137be
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
---
 src/render/qssgrendercontext.cpp | 13 +++++++++++++
 src/render/qssgrendercontext_p.h |  1 +
 2 files changed, 14 insertions(+)

diff --git a/src/render/qssgrendercontext.cpp b/src/render/qssgrendercontext.cpp
index 7377040df..eda5f5206 100644
--- a/src/render/qssgrendercontext.cpp
+++ b/src/render/qssgrendercontext.cpp
@@ -318,6 +318,16 @@ void QSSGRenderContext::setBlendEquation(QSSGRenderBlendEquationArgument inEquat
     m_backend->setBlendEquation(inEquations);
 }
 
+void QSSGRenderContext::resetBlendEquation(bool forceSet)
+{
+    const QSSGRenderBlendEquationArgument defaultBlendEqua;
+    if (!forceSet && m_hardwarePropertyContext.m_blendEquation == defaultBlendEqua)
+        return;
+
+    m_hardwarePropertyContext.m_blendEquation = defaultBlendEqua;
+    m_backend->setBlendEquation(defaultBlendEqua);
+}
+
 void QSSGRenderContext::setCullingEnabled(bool inEnabled, bool forceSet)
 {
     if (!forceSet && m_hardwarePropertyContext.m_cullingEnabled == inEnabled)
@@ -669,6 +679,9 @@ bool QSSGRenderContext::applyPreDrawProperties()
 
 void QSSGRenderContext::onPostDraw()
 {
+    // Reset to default blend equation if needed
+    resetBlendEquation();
+
     // reset input assembler binding
     m_backend->setInputAssembler(nullptr, nullptr);
     // Texture unit 0 is used for setting up and loading textures.
diff --git a/src/render/qssgrendercontext_p.h b/src/render/qssgrendercontext_p.h
index 5701d4b10..1dfb2c92a 100644
--- a/src/render/qssgrendercontext_p.h
+++ b/src/render/qssgrendercontext_p.h
@@ -343,6 +343,7 @@ public:
     {
         return m_hardwarePropertyContext.m_blendEquation;
     }
+    void resetBlendEquation(bool forceSet = false);
 
     void setCullingEnabled(bool inEnabled, bool forceSet = false);
     bool isCullingEnabled() const { return m_hardwarePropertyContext.m_cullingEnabled; }
-- 
GitLab