[Bug 46304] New: Fog handling seems to be off in Prince of Persia
wine-bugs at winehq.org
wine-bugs at winehq.org
Sun Dec 16 13:01:00 CST 2018
https://bugs.winehq.org/show_bug.cgi?id=46304
Bug ID: 46304
Summary: Fog handling seems to be off in Prince of Persia
Product: Wine
Version: 3.21
Hardware: x86
OS: Linux
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: directx-d3d
Assignee: wine-bugs at winehq.org
Reporter: gw.fossdev at gmail.com
Distribution: ---
Created attachment 63028
--> https://bugs.winehq.org/attachment.cgi?id=63028
apitrace dump of frame that contains shader:
Hello, I came across this by trying out Prince of Persia with virgl ad a driver
and comparing it to the host. Initially I thought it was a virgl bug, but it
seems to be proper wine where things go wrong:
Here are my findings:
When I run "wine PrinceOfPersia.exe" on the host (r600) the game is playable
but when run with the virgl driver there is not contrast in the images.
However, a apitrace created with virgl as driver and replayed on host also
renders wrong, where a apitrace recorded on the host and run via virgl renders
correctly (only op-side down, because virgl doesn't support
GL_ARB_clip_control, but disabling this extension when recording the apitrace
makes it possible to get exactly the same output like when run on the r600
host.
The difference between the two runs in the apitrace is that when run on r600 I
get a vertex shader that does:
R6.w = (R6.w * vs_c[20].z);
R6.w = (vs_c[20].z + -R6.w);
vs_out[11].x = (vs_c[16].y + -R6.w);
vs_out[10].xyzw = (R8.xyzw);
setup_vs_output(vs_out);
The same shader created via virgl does:
R6.w = (vs_c[16].y + -R6.w);
vs_out[11].x = (R6.w * vs_c[20].z);
vs_out[10].xyzw = (R8.xyzw);
setup_vs_output(vs_out);
ffp_varying_fogcoord = gl_Position.z;
gl_Position.y = gl_Position.y * pos_fixup.y;
The value ffp_varying_fogcoord is not assigned a value with the r600 version.
However, the following fragment shader uses this value in both cases:
float fog = (ffp_fog.end - ffp_varying_fogcoord) * ffp_fog.scale;
ps_out[0].xyz = mix(ffp_fog.color.xyz, ps_out[0].xyz, clamp(fog, 0.0, 1.0));
In the r600 version ffp_fog.end=0 and ffp_fog.scale=-1, and I assume that this
results in clamp(fog, 0.0, 1.0) returning 1.0, and in the scene the fog effect
seems to be generated differently. In the virgl version the values are
ffp_fog.end=1 and ffp_fog.scale=1, and I can only assume that gl_Position too
large so that clamp(fog, 0.0, 1.0) returns very small values (or even 0) and
the scene gets rendered in the fog colour overlayed by some post processing
effects.
I have not yet investigated why wine creates different code path for the two
drivers, I guess that it depends on some extension(s) that may or may not be
available.
The initial but report for virglrenderer can be found here:
https://gitlab.freedesktop.org/virgl/virglrenderer/issues/62
--
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.
More information about the wine-bugs
mailing list