diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp index b1710152..6e5a8740 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp @@ -306,6 +306,12 @@ public: void update(bool _force) override { + if ((gDP.otherMode.l & 0xFFFF0000) == 0x01500000) { + uForceBlendCycle1.set(0, _force); + uForceBlendCycle2.set(0, _force); + return; + } + uBlendMux1.set(gDP.otherMode.c1_m1a, gDP.otherMode.c1_m1b, gDP.otherMode.c1_m2a, diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp index c48ecc59..1a1cb53e 100644 --- a/src/GraphicsDrawer.cpp +++ b/src/GraphicsDrawer.cpp @@ -441,6 +441,17 @@ void GraphicsDrawer::_setBlendMode() const return; } + if ((gDP.otherMode.l & 0xFFFF0000) == 0x01500000) { + // clr_in * a_in + clr_mem * (1-a) + // clr_in * a_fog + clr_mem * (1-a) + // impossible to emulate + if (gDP.otherMode.forceBlender != 0 && gDP.otherMode.cycleType < G_CYC_COPY) { + gfxContext.enable(enable::BLEND, true); + gfxContext.setBlending(blend::SRC_ALPHA, blend::ONE_MINUS_SRC_ALPHA); + return; + } + } + if (gDP.otherMode.forceBlender != 0 && gDP.otherMode.cycleType < G_CYC_COPY) { BlendParam srcFactor = blend::ONE; BlendParam dstFactor = blend::ZERO;