On Wed Apr 26 16:02:44 2023 +0000, Ethan Lee wrote:
Latest push splits the results of ddx/ddy to be separate. In trying to come up with a test that produces more interesting results it seems like it just becomes a test for other functions like sin/cos, since the result with vpos is always going to be 1... this is what I get for not paying attention in math class :P Mostly for fun, here is a somewhat more fancy test:
[pixel shader]
float4 main(float4 pos : sv_position) : sv_target
{
pos /= 10.0;
float nonlinear = pos.x * pos.y - pos.x * (pos.x + 0.5);
return float4(nonlinear, ddx(nonlinear), ddy(nonlinear), 0.0);
}
[test]
draw quad
probe (10, 10) rgba (-0.524999976, -0.164999843, 0.104999900, 0.0) 8
probe (11, 10) rgba (-0.689999819, -0.164999843, 0.104999900, 0.0) 8
probe (10, 11) rgba (-0.420000076, -0.164999843, 0.104999900, 0.0) 8
probe (11, 11) rgba (-0.574999928, -0.164999843, 0.104999900, 0.0) 8
probe (12, 10) rgba (-0.874999881, -0.205000162, 0.124999881, 0.0) 8
probe (150, 150) rgba (-7.52500916, -1.56500244, 1.50500488, 0.0) 8
An interesting feature is that the partial derivatives are constant across the whole 2x2 tile for all the three drivers I tested (WARP on Windows, RADV on Linux and NVIDIA proprietary on Linux), a non-trivial fact that I would not have given for granted before testing. I also did some tests with trigonometric functions, but NVIDIA's implementation is so wonky that it's nearly impossible to avoid diverging from the other drivers. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/179#note_31360