From 3c8689d84831dca7d768892826a5de2495ee9633 Mon Sep 17 00:00:00 2001 From: clobber Date: Fri, 29 Sep 2017 00:28:32 -0500 Subject: [PATCH] ShaderBlender: cast to ivec4 where needed. Fixes #1601 This works around a bug with Intel GPU's on macOS where colors can appear wrong. --- .../GLSL/glsl_CombinerProgramBuilder.cpp | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp index e460bb3e..6290428c 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramBuilder.cpp @@ -468,21 +468,21 @@ public: { #if 1 m_part = - " muxPM[0] = clampedColor; \n" - " lowp vec4 vprobe = vec4(0.0, 1.0, 2.0, 3.0); \n" - " if (uForceBlendCycle1 != 0) { \n" - " muxA[0] = clampedColor.a; \n" - " lowp float muxa = dot(muxA, vec4(equal(vec4(uBlendMux1[1]), vprobe))); \n" - " muxB[0] = 1.0 - muxa; \n" - " lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux1[0]), vprobe)); \n" - " lowp vec4 muxpm2 = muxPM * vec4(equal(vec4(uBlendMux1[2]), vprobe)); \n" - " lowp float muxb = dot(muxB, vec4(equal(vec4(uBlendMux1[3]), vprobe))); \n" - " lowp vec4 blend1 = (muxpm0 * muxa) + (muxpm2 * muxb); \n" - " clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n" - " } else { \n" - " lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux1[0]), vprobe)); \n" - " clampedColor.rgb = muxpm0.rgb; \n" - " } \n" + " muxPM[0] = clampedColor; \n" + " lowp vec4 vprobe = vec4(0.0, 1.0, 2.0, 3.0); \n" + " if (uForceBlendCycle1 != 0) { \n" + " muxA[0] = clampedColor.a; \n" + " lowp float muxa = dot(muxA, ivec4(equal(vec4(uBlendMux1[1]), vprobe))); \n" + " muxB[0] = 1.0 - muxa; \n" + " lowp vec4 muxpm0 = muxPM * ivec4(equal(vec4(uBlendMux1[0]), vprobe)); \n" + " lowp vec4 muxpm2 = muxPM * ivec4(equal(vec4(uBlendMux1[2]), vprobe)); \n" + " lowp float muxb = dot(muxB, ivec4(equal(vec4(uBlendMux1[3]), vprobe))); \n" + " lowp vec4 blend1 = (muxpm0 * muxa) + (muxpm2 * muxb); \n" + " clampedColor.rgb = clamp(blend1.rgb, 0.0, 1.0); \n" + " } else { \n" + " lowp vec4 muxpm0 = muxPM * ivec4(equal(vec4(uBlendMux1[0]), vprobe)); \n" + " clampedColor.rgb = muxpm0.rgb; \n" + " } \n" ; #else // Keep old code for reference @@ -514,21 +514,21 @@ public: { #if 1 m_part = - " muxPM[0] = clampedColor; \n" - " muxPM[1] = vec4(0.0); \n" - " if (uForceBlendCycle2 != 0) { \n" - " muxA[0] = clampedColor.a; \n" - " lowp float muxa = dot(muxA,vec4(equal(vec4(uBlendMux2[1]), vprobe))); \n" - " muxB[0] = 1.0 - muxa; \n" - " lowp vec4 muxpm0 = muxPM*vec4(equal(vec4(uBlendMux2[0]), vprobe)); \n" - " lowp vec4 muxpm2 = muxPM*vec4(equal(vec4(uBlendMux2[2]), vprobe)); \n" - " lowp float muxb = dot(muxB,vec4(equal(vec4(uBlendMux2[3]), vprobe))); \n" - " lowp vec4 blend2 = muxpm0 * muxa + muxpm2 * muxb; \n" - " clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n" - " } else { \n" - " lowp vec4 muxpm0 = muxPM * vec4(equal(vec4(uBlendMux2[0]), vprobe)); \n" - " clampedColor.rgb = muxpm0.rgb; \n" - " } \n" + " muxPM[0] = clampedColor; \n" + " muxPM[1] = vec4(0.0); \n" + " if (uForceBlendCycle2 != 0) { \n" + " muxA[0] = clampedColor.a; \n" + " lowp float muxa = dot(muxA, ivec4(equal(vec4(uBlendMux2[1]), vprobe))); \n" + " muxB[0] = 1.0 - muxa; \n" + " lowp vec4 muxpm0 = muxPM * ivec4(equal(vec4(uBlendMux2[0]), vprobe)); \n" + " lowp vec4 muxpm2 = muxPM * ivec4(equal(vec4(uBlendMux2[2]), vprobe)); \n" + " lowp float muxb = dot(muxB, ivec4(equal(vec4(uBlendMux2[3]), vprobe))); \n" + " lowp vec4 blend2 = muxpm0 * muxa + muxpm2 * muxb; \n" + " clampedColor.rgb = clamp(blend2.rgb, 0.0, 1.0); \n" + " } else { \n" + " lowp vec4 muxpm0 = muxPM * ivec4(equal(vec4(uBlendMux2[0]), vprobe)); \n" + " clampedColor.rgb = muxpm0.rgb; \n" + " } \n" ; #else // Keep old code for reference