https://bugs.winehq.org/show_bug.cgi?id=45468
Bug ID: 45468 Summary: Phase Shift: tails on sustain notes not visible unless GLSL is disabled Product: Wine Version: 3.12 Hardware: x86 OS: Linux Status: UNCONFIRMED Severity: minor Priority: P2 Component: directx-d3d Assignee: wine-bugs@winehq.org Reporter: q3aiml+wine@gmail.com Distribution: ---
Created attachment 61811 --> https://bugs.winehq.org/attachment.cgi?id=61811 missing tail by default
During a song the notes that should be held (sustain notes) should have tails rendered after the note indicating the hold. These tails are not visible by default under wine. There are no visible artifacts. The notes instead appear like normal, non-sustain notes.
Steps to reproduce: * Install version 1.27 of Phase Shift (http://www.dwsk.co.uk/phase_shift_downloads.html, https://mega.co.nz/#!JkwSxayT!cKdLVz8GrRrla2jkDmOvlMWxtmsdbWvoboP_vmgLw3o) * Run 'winetricks vcrun2013' to fix missing msvcr120.dll._strerror_s on startup * Select Quickplay in main menu (use number 1 key to select) * Select song Positive Force, a song that comes bundled with the full 1.27 download, or any other song with sustain notes * Press 1 to join with keyboard * Select Guitar intrument and Hard difficulty, or any other song and difficulty combo with sustain notes * Press 1 to continue and 1 again when prompted to press green to begin * Observe that the first note of Positive Force should have a green tail (follow by grey if the note is missed), but instead appears as a normal, non-sustain note
The tails render properly after setting UseGLSL to disabled and MaxVersionGL to 0x30001 (cannot disable GLSL with GL 3.2 or newer).
I think this has something to do with how the generated ffp emulating shaders calculate the alpha channel and apply an alpha test. Here is what I am seeing leading to the pixels being discarded:
# relevant uniforms
specular_enable = [1, 1, 1, 0] alpha_test_ref = 0.0117647061124444 ffp_material.diffuse = [0, 0, 0, 0]
# relevant bits of vertex shader
ffp_varying_diffuse.w = ffp_material.diffuse.w;
# relevant bits of fragment shader
// ffp_varying_diffuse.w = 0 -> ret.w = 0 regardless of tex0.w ret.w = tex0.w * ffp_varying_diffuse.w;
// specular_enable.w = 0 and ret.w = 0 -> ps_out[0].a = 0 ps_out[0] = ffp_varying_specular * specular_enable + ret;
// ps_out[0].a = 0, alpha_test_ref = 0.01..., alpha test fails and discards pixel if (!(ps_out[0].a >= alpha_test_ref)) discard;