Created attachment 125033 [details]
I'm running the game Hoard in Wine.
The splash screen/loading screen is displayed properly, but once the game is loaded, I can only see the menu buttons because the screen is covered with white "fog". This happens when the game option "Graphics quality" is set to 'high'. Using 'low' setting the game renders properly.
The problem is present with the software renderer, too (LIBGL_ALWAYS_SOFTWARE=1)
Nvidia binary driver doesn't have this bug.
Trace file (uncompressed 43M):
OpenGL vendor string: nouveau
OpenGL renderer string: Gallium 0.4 on NV106
OpenGL core profile version string: 4.3 (Core Profile) Mesa 12.1.0-devel (git-6624174)
OpenGL core profile shading language version string: 4.30
From the trace:
16981 glCreateShader(type = GL_FRAGMENT_SHADER) = 12
16982 glShaderSource(shader = 12, count = 1, string = &"//!!FS
// ======================= Begin fragment shader program ===================================
uniform sampler2D Tex0;
uniform sampler2D Tex1;
vec2 encodeNormal(vec3 n)
float p = sqrt(n.z * 8.0 + 8.0);
return vec2(n.xy / p + 0.5);
vec2 encodeColor(vec3 rgb24)
rgb24 *= 255.0f;
// nvidia int3 rgb16 = rgb24 / int3(8,4,8);
ivec3 rgb16 = ivec3(rgb24) / ivec3(8,4,8);
float greenSplit = rgb16.g / 8.0f;
stuff.x = rgb16.r * 8 + floor(greenSplit);
// nvidia stuff.y = frac(greenSplit) * 256 + rgb16.b;
stuff.y = fract(greenSplit) * 256 + rgb16.b;
stuff /= 255.0f;
vec4 tex0 = texture2D(Tex0,gl_TexCoord.st);
if(tex0.a < 0.5)
gl_FragColor = vec4(encodeColor(tex0.rgb * gl_Color.rgb),encodeNormal(gl_TexCoord.xyz));
// ======================= End fragment shader program ===================================
", length = NULL)
16983 glCompileShader(shader = 12)
16984 glGetShaderiv(shader = 12, pname = GL_INFO_LOG_LENGTH, params = &580)
16985 glGetShaderInfoLog(shader = 12, bufSize = 581, length = NULL, infoLog = "0:14(11): warning: Float suffixes are invalid in GLSL 1.10
0:17(31): warning: Float suffixes are invalid in GLSL 1.10
0:22(11): warning: Float suffixes are invalid in GLSL 1.10
0:17(21): error: could not implicitly convert operands to arithmetic operator
0:19(32): warning: `greenSplit' used uninitialized
0:19(12): error: could not implicitly convert operands to arithmetic operator
0:21(18): warning: `greenSplit' used uninitialized
0:21(12): error: could not implicitly convert operands to arithmetic operator
0:21(12): error: operands to arithmetic operators must be numeric
I tried running it with force_glsl_version=130 -- that seems to help with st/mesa, but it doesn't appear to be hooked up for i965 (??? it used to be! it hought...)
I'm not sure when float <-> int autoconversion was added, maybe in 1.20? But it also uses textureSize, which was only added in 1.30.
BTW, I believe the correct solution here is to add a "force_glsl_version" option to drirc. Should be easy to do with the executable name (hopefully it's not "wine"). Can you test adding something like
<application name="Hard" executable="Hoard">
<option name="force_glsl_version" value="130"/>
into an appropriate place in your drirc? Probably have to play around with the executable. You can also just stick that into the environment.
Not to ask a stupid question, but...why are you running this in Wine? There's a native Linux version of the game which renders correctly without any workarounds, at least on i965.
(In reply to Kenneth Graunke from comment #3)
> Not to ask a stupid question, but...why are you running this in Wine?
> There's a native Linux version of the game which renders correctly without
> any workarounds, at least on i965.
Yes, I know that the native Linux version runs properly on Mesa.
I just thought it was worth noting that this bug still exists under Wine (I observed this bug over a year ago but didn't bother reporting it).