From c379169efc3e742facfe974720fd64ee30d16364 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 2 Jul 2014 23:15:02 -0700 Subject: [PATCH 1/3] Try to fix colormasking on GLES3 devices. Not tested, though, since I don't have one... from reporting. --- GPU/GLES/FragmentShaderGenerator.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 16af7be7f9..3594141c69 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -794,7 +794,11 @@ void GenerateFragmentShader(char *buffer) { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; if (colorTestFuncs[colorTestFunc][0] != '#') { if (bitwiseOps) { - WRITE(p, " if ((roundAndScaleTo255iv(v.rgb) & u_alphacolormask.rgb) %s (ivec3(u_alphacolorref.rgb) & u_alphacolormask.rgb)) discard;\n", colorTestFuncs[colorTestFunc]); + // Apparently GLES3 does not support vector bitwise ops. + WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);"); + const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; + const char *maskedColorRef = "ivec3(u_alphacolorref.r & u_alphacolormask.r, u_alphacolorref.g & u_alphacolormask.g, u_alphacolorref.b & u_alphacolormask.b)"; + WRITE(p, " if (%s %s %s) discard;\n", maskedFragColor, colorTestFuncs[colorTestFunc], maskedColorRef); } else if (gl_extensions.gpuVendor == GPU_VENDOR_POWERVR) { WRITE(p, " if (roundTo255thv(v.rgb) %s u_alphacolorref.rgb) discard;\n", colorTestFuncs[colorTestFunc]); } else { From e364de42cb381222ec44104a596d00d7b3ef9e4a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 2 Jul 2014 23:21:52 -0700 Subject: [PATCH 2/3] Ensure #extension is before non-# tokens. As required by Tegra devices from reporting. --- GPU/GLES/FragmentShaderGenerator.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 3594141c69..321ac7c269 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -490,7 +490,6 @@ void GenerateFragmentShader(char *buffer) { } else { WRITE(p, "#version 100\n"); // GLSL ES 1.0 } - WRITE(p, "precision lowp float;\n"); // PowerVR needs highp to do the fog in MHU correctly. // Others don't, and some can't handle highp in the fragment shader. @@ -498,8 +497,10 @@ void GenerateFragmentShader(char *buffer) { // GL_NV_shader_framebuffer_fetch available on mobile platform and ES 2.0 only but not desktop if (gl_extensions.NV_shader_framebuffer_fetch) { - WRITE(p, " #extension GL_NV_shader_framebuffer_fetch : require\n"); + WRITE(p, "#extension GL_NV_shader_framebuffer_fetch : require\n"); } + + WRITE(p, "precision lowp float;\n"); #elif !defined(FORCE_OPENGL_2_0) if (gl_extensions.VersionGEThan(3, 3, 0)) { From 61ea20875caf3fae58c5b714b012017703f53ee8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 3 Jul 2014 00:15:15 -0700 Subject: [PATCH 3/3] Fix shader blending on ARM GLES3 devices. We currently ban them from GLES3, and this was interacting with that incorrectly. Should we still ban them, though? --- GPU/GLES/FragmentShaderGenerator.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 321ac7c269..83ee484d09 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -477,6 +477,7 @@ void GenerateFragmentShader(char *buffer) { const char *texture = "texture2D"; bool highpFog = false; bool bitwiseOps = false; + bool texelFetch = false; #if defined(USING_GLES2) // Let's wait until we have a real use for this. @@ -487,6 +488,7 @@ void GenerateFragmentShader(char *buffer) { texture = "texture"; glslES30 = true; bitwiseOps = true; + texelFetch = true; } else { WRITE(p, "#version 100\n"); // GLSL ES 1.0 } @@ -508,6 +510,7 @@ void GenerateFragmentShader(char *buffer) { texture = "texture"; glslES30 = true; bitwiseOps = true; + texelFetch = true; WRITE(p, "#version 330\n"); WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); @@ -515,6 +518,7 @@ void GenerateFragmentShader(char *buffer) { } else if (gl_extensions.VersionGEThan(3, 0, 0)) { fragColor0 = "fragColor0"; bitwiseOps = true; + texelFetch = true; WRITE(p, "#version 130\n"); // Remove lowp/mediump in non-mobile non-glsl 3 implementations WRITE(p, "#define lowp\n"); @@ -561,7 +565,7 @@ void GenerateFragmentShader(char *buffer) { WRITE(p, "uniform sampler2D tex;\n"); if (!gstate.isModeClear() && useShaderBlending) { if (!gl_extensions.NV_shader_framebuffer_fetch) { - if (!gl_extensions.VersionGEThan(3, 0, 0) && !gl_extensions.GLES3) { + if (!texelFetch) { WRITE(p, "uniform vec2 u_fbotexSize;\n"); } WRITE(p, "uniform sampler2D fbotex;\n"); @@ -834,7 +838,7 @@ void GenerateFragmentShader(char *buffer) { // TODO: EXT_shader_framebuffer_fetch on iOS 6, possibly others. if (gl_extensions.NV_shader_framebuffer_fetch) { WRITE(p, " lowp vec4 destColor = gl_LastFragData[0];\n"); - } else if (!gl_extensions.VersionGEThan(3, 0, 0) && !gl_extensions.GLES3) { + } else if (!texelFetch) { WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", texture); } else { WRITE(p, " lowp vec4 destColor = texelFetch(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n");