diff options
author | Valery Volgutov <valery.volgutov@lge.com> | 2020-07-24 10:24:24 +0300 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2020-08-11 18:22:24 +0000 |
commit | 6382ec9a6c961f2b7d7139659c11a047f6b68b07 (patch) | |
tree | cc93bc97a9df5c45be2295d436f4e0825e8549e3 | |
parent | 121cfa92daf310df382ddf3d1171ae0d94274f14 (diff) |
Add clipNext null pointer guard
Sometime clipNext can be null.
Added null pointer guard to avoid segfault.
Fixes: QTBUG-85996
Change-Id: I3cd4486fefbf9aa71cf0fdb765bb8398c0e2d591
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 131790b19a..860e63d316 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -2484,24 +2484,26 @@ ClipState::ClipType Renderer::updateStencilClip(const QSGClipNode *clip) m_clipMatrixId = m_clipProgram.uniformLocation("matrix"); } const QSGClipNode *clipNext = clip->clipList(); - QMatrix4x4 mNext = m_current_projection_matrix; - if (clipNext->matrix()) - mNext *= *clipNext->matrix(); - - auto rect = scissorRect(clipNext->clipRect(), mNext); - - ClipState::ClipType clipTypeNext = clipType ; - clipTypeNext |= ClipState::StencilClip; - QRect m_next_scissor_rect = m_currentScissorRect; - if (!(clipTypeNext & ClipState::ScissorClip)) { - m_next_scissor_rect = rect; - glEnable(GL_SCISSOR_TEST); - } else { - m_next_scissor_rect = - m_currentScissorRect & rect; + if (clipNext) { + QMatrix4x4 mNext = m_current_projection_matrix; + if (clipNext->matrix()) + mNext *= *clipNext->matrix(); + + auto rect = scissorRect(clipNext->clipRect(), mNext); + + ClipState::ClipType clipTypeNext = clipType ; + clipTypeNext |= ClipState::StencilClip; + QRect m_next_scissor_rect = m_currentScissorRect; + if (!(clipTypeNext & ClipState::ScissorClip)) { + m_next_scissor_rect = rect; + glEnable(GL_SCISSOR_TEST); + } else { + m_next_scissor_rect = + m_currentScissorRect & rect; + } + glScissor(m_next_scissor_rect.x(), m_next_scissor_rect.y(), + m_next_scissor_rect.width(), m_next_scissor_rect.height()); } - glScissor(m_next_scissor_rect.x(), m_next_scissor_rect.y(), - m_next_scissor_rect.width(), m_next_scissor_rect.height()); glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); |