diff options
author | Wieland Hagen <wieland.hagen@kdab.com> | 2016-01-14 18:18:35 +0100 |
---|---|---|
committer | Wieland Hagen <wieland.hagen@kdab.com> | 2016-01-15 13:02:47 +0000 |
commit | 4a93090a7b51da4a1e9f66d9727003fac0df53ac (patch) | |
tree | f0584b66f9b83ff2ed80fec174146d4c491eac63 /src/render/renderstates/renderstates.cpp | |
parent | 0f50b649912d44eb75e37a3f17afcefbec40fba7 (diff) |
QBlendState: Target particular Draw Buffers (glBlendFunci())
There are 3 ways blending can be configured, depending on GL version:
pre-3.0: Globally
3.0-3.3: Individual GL_BLEND for each Draw Buffer, one glBlendFunc
4.0- : Individual GL_BLEND and glBlendFunci for each DrawBuffer
QBlendStates now allow to specify whether the blend state should be
enabled or not, and what Draw Buffer it is specifying. Defaults are
global and enabled.
Removed backend BlendStateSeparate, BlendState is going to handle
both calls.
Task-number: QTBUG-50005
Change-Id: I0059a53db0d629ef9818d933c3f14e5662c1d3df
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/renderstates/renderstates.cpp')
-rw-r--r-- | src/render/renderstates/renderstates.cpp | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp index 204803dc6..d9cbf28a2 100644 --- a/src/render/renderstates/renderstates.cpp +++ b/src/render/renderstates/renderstates.cpp @@ -60,18 +60,42 @@ State* getOrCreateImpl(const State& data) void BlendState::apply(GraphicsContext* gc) const { - gc->openGLContext()->functions()->glEnable(GL_BLEND); - gc->openGLContext()->functions()->glBlendFunc( m_1, m_2 ); + // Un-indexed BlendState -> Use normal GL1.0 functions + if (m_6 < 0) { + if (m_5) { + gc->openGLContext()->functions()->glEnable(GL_BLEND); + gc->openGLContext()->functions()->glBlendFuncSeparate(m_1, m_2, m_3, m_4); + } else { + gc->openGLContext()->functions()->glDisable(GL_BLEND); + } + } + // BlendState for a particular Draw Buffer. Different behaviours for + // (1) 3.0-3.3: only enablei/disablei supported. + // (2) 4.0+: all operations supported. + // We just ignore blend func parameter for (1), so no warnings get + // printed. + else { + if (m_5) { + gc->enablei(GL_BLEND, m_6); + if (gc->supportsDrawBuffersBlend()) { + gc->blendFuncSeparatei(m_6, m_1, m_2, m_3, m_4); + } + } else { + gc->disablei(GL_BLEND, m_6); + } + } } -BlendState *BlendState::getOrCreate(GLenum src, GLenum dst) +BlendState *BlendState::getOrCreate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha, bool enabled, int buf) { - BlendState bs(src, dst); + BlendState bs(srcRGB, dstRGB, srcAlpha, dstAlpha, enabled, buf); return getOrCreateImpl(bs); } -BlendState::BlendState(GLenum src, GLenum dst) : - GenericState2<BlendState, GLenum, GLenum>(src, dst) +BlendState::BlendState(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha, bool enabled, int buf) : + GenericState6<BlendState, GLenum, GLenum, GLenum, GLenum, bool, int>( + srcRGB, dstRGB, srcAlpha, dstAlpha, enabled, buf + ) { } @@ -279,22 +303,6 @@ ColorMask *ColorMask::getOrCreate(GLboolean red, GLboolean green, GLboolean blue return getOrCreateImpl(ColorMask(red, green, blue, alpha)); } -void BlendStateSeparate::apply(GraphicsContext *gc) const -{ - gc->openGLContext()->functions()->glEnable(GL_BLEND); - gc->openGLContext()->functions()->glBlendFuncSeparate(m_1, m_2, m_3, m_4); -} - -BlendStateSeparate *BlendStateSeparate::getOrCreate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) -{ - return getOrCreateImpl(BlendStateSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha)); -} - -BlendStateSeparate::BlendStateSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) - : GenericState4<BlendStateSeparate, GLenum, GLenum, GLenum, GLenum>(srcRGB, dstRGB, srcAlpha, dstAlpha) -{ -} - void ClipPlane::apply(GraphicsContext *gc) const { gc->enableClipPlane(m_1); |