Bug 102681

Summary: OpenGL applications not vsyncing correctly when the window size doesn't perfectly match the screen
Product: Mesa Reporter: Niklas Haas <bugs.freedesktop>
Component: Drivers/Gallium/radeonsiAssignee: Default DRI bug account <dri-devel>
Status: RESOLVED NOTABUG QA Contact: Default DRI bug account <dri-devel>
Severity: normal    
Priority: medium    
Version: 17.2   
Hardware: Other   
OS: All   
Whiteboard:
i915 platform: i915 features:

Description Niklas Haas 2017-09-12 16:28:11 UTC
I'm not exactly sure how to debug this; but basically, when I run OpenGL applications in windowed mode (i.e. not stretched over the entire rect), I get misaligned vsync (horizontal tearing). It still syncs to the monitor rate - it just misses the actual vblank by quite a bit.

The horizontal tear location depends on the size and position of the window. For small enough window sizes, the issue becomes les pronounced and eventually goes away completely. I can reproduce it in at least two applications - mpv (my primary testing method) and glxgears (although it's more difficult to spot in glxgears due to the less ideal motion). The easiest way for me to reproduce it is by just running `mpv --no-config https://0x0.st/7AL.mkv`.

I've tested a couple of mesa versions ranging from 17.0 to git master and could not identify a difference, so I'm not sure if it's a regression or just a plain bug. I'm also not sure if it's an issue in mesa or in the GPU driver. I did notice a lot of dmesg spam after startup, but that seems to be “normal”:

e.g.
[  +0.000304] DMAR: DRHD: handling fault status reg 2
[  +0.000102] DMAR: [DMA Read] Request device [04:00.0] fault addr f4001aa000 [fault reason 06] PTE Read access is not set
[  +0.000170] DMAR: [DMA Read] Request device [04:00.0] fault addr f4001af000 [fault reason 06] PTE Read access is not set
[  +0.000169] DMAR: [DMA Read] Request device [04:00.0] fault addr f4001b5000 [fault reason 06] PTE Read access is not set
...
[  +0.068389] amdgpu: [powerplay] [AVFS] Something is broken. See log!
[  +0.002866] amdgpu: [powerplay] Can't find requested voltage id in vdd_dep_on_sclk table!
[  +0.001712] amdgpu: [powerplay] VDDCI is larger than max VDDCI in VDDCI Voltage Table!
[  +0.000152] amdgpu: [powerplay] VDDCI is larger than max VDDCI in VDDCI Voltage Table!

I also noticed this error showing up relatively often (several times a day, even while the machine is not in use):

[Sep12 17:58] DMAR: DRHD: handling fault status reg 40
[Sep12 17:59] DMAR: DRHD: handling fault status reg 40

Not sure if that's related to anything. The device I'm using is a Sapphire RX 560, the kernel version is 4.12.4. I have no ~/.drirc and the `amdgpu` module settings are all left default.

P.s. I also noticed a strange issue where starting mpv in fullscreen and then dragging the window to be slightly bigger causes it to start miscalculating the texture stride and dumping garbage data onto the screen. Unfortunately, I can't take a screenshot. I'm not sure if this is related, or a separated issue, but it may provide a hint.
Comment 1 Niklas Haas 2017-09-13 02:05:45 UTC
Seems like this is an expected behavior when TearFree is disabled. Manually enabling TearFree in xorg.conf appears to solve my issue.
Comment 2 Niklas Haas 2017-09-13 02:06:45 UTC
(Including the P.s., I might add)
Comment 3 Alex Deucher 2017-09-13 02:21:59 UTC
(In reply to Niklas Haas from comment #1)
> Seems like this is an expected behavior when TearFree is disabled. Manually
> enabling TearFree in xorg.conf appears to solve my issue.

You can dynamically enable tearfree per output using randr rather than messing with your xorg.conf.
Comment 4 Niklas Haas 2017-09-13 02:34:39 UTC
How does this work? I'm not seeing anything related to TearFree or driver options in `xrandr --help`.

(Avoiding the use of a xorg.conf would indeed be nice, since it would prevent me from having to mess around with symlinks when switching between AMD and nvidia GPUs)
Comment 5 Alex Deucher 2017-09-13 02:42:44 UTC
(In reply to Niklas Haas from comment #4)
> How does this work? I'm not seeing anything related to TearFree or driver
> options in `xrandr --help`.
> 
> (Avoiding the use of a xorg.conf would indeed be nice, since it would
> prevent me from having to mess around with symlinks when switching between
> AMD and nvidia GPUs)

`xrandr --verbose` and look for the tearfree output property.  Then use xrandr to adjust the property.  This was enabled fairly recently so your ddx may be too old.
Comment 6 Niklas Haas 2017-09-13 02:46:00 UTC
Neat, thanks!

(I also noticed an _ICC_PROFILE setting there, I wonder if that refers to the X11 atom or if there's some sort of built-in ICC profile querying mechanism inherent to RandR.... anyway, offtopic)
Comment 7 Michel Dänzer 2017-09-13 02:46:30 UTC
With xf86-video-amdgpu 1.3.0 or newer:

xrandr --output <output name> --set TearFree on # or off / auto

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.