[PATCH 1/3] wined3d: Don't shift geometry for d3d10/11.
Stefan Dösinger
stefan at codeweavers.com
Thu Aug 12 11:55:55 CDT 2021
Am Dienstag, 10. August 2021, 17:18:31 EAT schrieb Henri Verbeet:
> - We translate by ε to the left, so that a triangle covering the
> right half of a pixel from top to bottom exactly through the pixel
> centre ends up generating a fragment for that pixel, and a triangle
> covering the left half of that pixel doesn't.
Because we don't know what OpenGL is doing, i.e. it might generate a fragment
if the pixel center is on a right edge of a triangle, either due to
underspecification or driver bugs?
I was under the impression that GL guarantees a top-left filling rule (pixel is
on a top edge OR on a left edge of a triangle -> generate fragment), but on
further research the only place that states that (that I could find) is
https://docs.microsoft.com/th-th/windows/win32/direct3d9/rasterization-rules ,
which isn't exactly an authoritative source on GL.
The rest of your explanation makes perfect sense to me.
The attached filling.c file is an attempt at detecting what the GL
implementation does when rendering into an FBO. It correctly picks up the
difference of the radeon driver on MacOS (radeon.png) - the only driver that
doesn't pass the d3d9 viewport test with a precise 0.5 pixel shift. Other
cards I tested result in the same output (intel.png, linux-noflip.png).
Sadly, while it does match up with with the d3d9 test, it doesn't match up
with SPORE nor World of Tanks. World of Tanks wants no nudge everywhere, even
the radeon card. SPORE is broken on MacOS regardless of what I try to do, but
works on Linux-Radeon either with or without the nudge. I can deliberately
break it everywhere by removing the half pixel offset, but that doesn't tell us
anything we didn't already know.
So something else must be going on. My suspicions are that it has something to
do with shaders vs fixed function or core vs legacy context. It is also
possible that the issue is entirely unrelated, at least in World of Tanks.
The filling.c program also shows one place where the x nudge makes a difference
when inverting the geometry: It flips the diagonal pixels back to the red
triangle. The y nudge is (understandably) necessary to place the quad
correctly nearer to the top of the texture rather than the bottom. I haven't
yet found a card that generates a fragment when the center is on the right
triangle edge.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: filling.c
Type: text/x-csrc
Size: 3858 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210812/e1296ddc/attachment-0001.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: intel.png
Type: image/png
Size: 145532 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210812/e1296ddc/attachment-0003.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: linux-noflip.png
Type: image/png
Size: 6123 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210812/e1296ddc/attachment-0004.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: radeon.png
Type: image/png
Size: 146991 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210812/e1296ddc/attachment-0005.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210812/e1296ddc/attachment-0001.sig>
More information about the wine-devel
mailing list