The problem with these are small differences in the interpolated color computed for certain pixels across lines. dEQP computes a range of acceptable color values for each pixel and them compares that with the actual rendering result (as provided by glReadPixels). In many cases (at least for lines that are just 1px wide), the difference is off by just one unit in just one component of a pixel. For wide lines it seems that more pixels are affected but the differences are so small that they seem invisible to the naked eye in any case.
Attribute interpolation is done in hardware. The FS receives barycentric coordinates and deltas, computed by hardware in the payload and then, as far as I can see, computing interpolated values amounts to a PLN instruction passing these values as parameters. If this is not producing correct results I would guess that it is an issue in the precision used by the hardware to do these computations (be it the PLN, the values delivered in the FS payload or both), and software can't do much about it. I have also reviewed the state configurations for various hardware units that are involved in interpolation and rasterization calculations and they all seem okay to me.
So, my conclusion is that it is not clear to me if dEQP's expectations are 100% accurate, but even if they are I am not sure that the driver can do much about this since all the aspects of interpolation seem to be on the side of the hardware.
This tests also fail in HSW-U with the following configuration :
mesa-11.1.0-devel (git 6f39546)
Author: Matt Roper <firstname.lastname@example.org>
Date: Wed Oct 21 15:05:45 2015 -0700
As per today, using latest Mesa version (18.1-branchpoint-478-gf71714022b2), these are the failing tests:
Let me add I've tried to reproduce the other issues that now works fine (like dEQP-GLES3.functional.rasterization.interpolation.basic.lines) using mesa commit 6f39546, but it worked fine.
I guess the dEQP testsuite fixed them.
Another point to add here is that the tests that still fail, were removed from mustpass in Android, and included in gles3-hw-issues.txt file. Can't know exactly the reasons, as the bug it references is private.
(In reply to Juan A. Suarez from comment #4)
> Another point to add here is that the tests that still fail, were removed
> from mustpass in Android, and included in gles3-hw-issues.txt file. Can't
> know exactly the reasons, as the bug it references is private.
These are the 2 commits that did this:
(In reply to Andrés Gómez García from comment #5)
> (In reply to Juan A. Suarez from comment #4)
> > Another point to add here is that the tests that still fail, were removed
> > from mustpass in Android, and included in gles3-hw-issues.txt file. Can't
> > know exactly the reasons, as the bug it references is private.
> These are the 2 commits that did this:
It would be great if someone with access to:
Could shed some light O:)
For the sake of completeness, these are also failing:
FYI I've created a vk-gl-cts issue to get shed some light into this.
If the commentary on the Khronos and Google issues (which aren't public) is to be believed, Intel HW is providing barycentrics to the shader which are interpolated diagonally as if the line is drawn as a rectangle rather than simply replicating the barycentrics from the original line vertically or horizontally. If this is really the case, then ouch; we're going to have to do some "fun" in the shader.
One option would be to use derivatives of barycentrics to figure out the slope of the line and, from there, figure out if we're supposed to be horizontal or vertical. However, I'm a bit concerned about the stability of those calculations for 45-degree lines and I'm not sure how we would figure out from there how to correct to get back to the pixel we're vertically or horizontally associated with.
Another (rather horrible) option would be to somehow push both ends of the line into the fragment shader (probably via a geometry shader? Yuck!) and use gl_FragCoord to figure out our own barycentrics.
Playing around with the line HW in Vulkan a bit, this definitely appears to be what the HW is doing. *sigh*
Unfortunately, the HW doesn't give us a perpendicular barycentric coordinate so we have no idea where we are in the line other than gl_FragCoord.xy. The best solution I've been able to come up with so far is to add an extra vec4 varying out of the last geometry stage into the fragment shader which duplicates gl_Position. Then we can use that to find the slope of the line to determine major/minor axis and, using gl_FragCoord.xy, manually calculate the point vertical or horizontal and compute our own barycentrics. Of course, we'll have to have different math for perspective correct vs. not etc. Oh, fun!