diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 33c33b424..6a7e17bb6 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -206,7 +206,7 @@ bool Graphics::setMode(int width, int height, int pixelwidth, int pixelheight, b setViewportSize(width, height, pixelwidth, pixelheight); // Enable blending - glEnable(GL_BLEND); + gl.setEnableState(OpenGL::ENABLE_BLEND, true); // Auto-generated mipmaps should be the best quality possible if (!gl.isCoreProfile()) @@ -1280,15 +1280,21 @@ void Graphics::setBlendState(const BlendState &blend) throw love::Exception("The 'min' and 'max' blend operations are not supported on this system."); } - GLenum opRGB = getGLBlendOperation(blend.operationRGB); - GLenum opA = getGLBlendOperation(blend.operationA); - GLenum srcRGB = getGLBlendFactor(blend.srcFactorRGB); - GLenum srcA = getGLBlendFactor(blend.srcFactorA); - GLenum dstRGB = getGLBlendFactor(blend.dstFactorRGB); - GLenum dstA = getGLBlendFactor(blend.dstFactorA); + if (blend.enable != gl.isStateEnabled(OpenGL::ENABLE_BLEND)) + gl.setEnableState(OpenGL::ENABLE_BLEND, blend.enable); - glBlendEquationSeparate(opRGB, opA); - glBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA); + if (blend.enable) + { + GLenum opRGB = getGLBlendOperation(blend.operationRGB); + GLenum opA = getGLBlendOperation(blend.operationA); + GLenum srcRGB = getGLBlendFactor(blend.srcFactorRGB); + GLenum srcA = getGLBlendFactor(blend.srcFactorA); + GLenum dstRGB = getGLBlendFactor(blend.dstFactorRGB); + GLenum dstA = getGLBlendFactor(blend.dstFactorA); + + glBlendEquationSeparate(opRGB, opA); + glBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA); + } states.back().blend = blend; } diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index ef7bb61e1..ed3c749ab 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -205,6 +205,7 @@ void OpenGL::setupContext() state.boundFramebuffers[i] = std::numeric_limits::max(); bindFramebuffer(FRAMEBUFFER_ALL, getDefaultFBO()); + setEnableState(ENABLE_BLEND, state.enableState[ENABLE_BLEND]); setEnableState(ENABLE_DEPTH_TEST, state.enableState[ENABLE_DEPTH_TEST]); setEnableState(ENABLE_STENCIL_TEST, state.enableState[ENABLE_STENCIL_TEST]); setEnableState(ENABLE_SCISSOR_TEST, state.enableState[ENABLE_SCISSOR_TEST]); @@ -810,6 +811,9 @@ void OpenGL::setEnableState(EnableState enablestate, bool enable) switch (enablestate) { + case ENABLE_BLEND: + glstate = GL_BLEND; + break; case ENABLE_DEPTH_TEST: glstate = GL_DEPTH_TEST; break; diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index 1037dd9e7..54a35f4c1 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -94,6 +94,7 @@ public: enum EnableState { + ENABLE_BLEND, ENABLE_DEPTH_TEST, ENABLE_STENCIL_TEST, ENABLE_SCISSOR_TEST,