On Feb 27, 2012, at 4:47 PM, Felix Kuehling wrote:

On 12-02-24 11:38 PM, Mario Kleiner wrote:
On Feb 24, 2012, at 10:20 PM, Felix Kuehling wrote:

On 12-02-22 11:20 AM, Felix Kuehling wrote:
On 12-02-21 07:49 PM, Mario Kleiner wrote:
On 02/21/2012 09:07 PM, Alex Deucher wrote:
[snip]
The fix looks ok to me.  Mario any thoughts?

Reviewed-by: Alex Deucher<alexdeuc...@gmail.com>

Hi,

the fix looks ok to me for that device, but could we make it
conditional on the AMD C-50 APU and similar pieces? It is the right
thing to do for that gpu, but for regular desktop gpus it is too
pessimistic if it defers the pageflip timestamping and completion
event for an already completed flip:

1. Makes the timestamps 1 refresh too late, causing timing sensitive
software like mine to detect false positives -- reporting skipped
frames were there weren't any. Not as bad as missing a really skipped
frame, but still not great.
Agreed. I was going to perform some more experiments on other hardware
to determine what the right threshold is for different hardware
generations. I hope I'll get to that this week.

I have a final version of my patch including an explanation of the
observations it's based on (attached). It's against current drm-next
from git://people.freedesktop.org/~airlied/linux.


The idea of the current logic was that it happened that the
update_pending bit isn't read back as zero at the end of the page_flip programming function, immediately after clearing the graphics hardware
update_lock, e.g., maybe because there is some delay between clearing
that register and the double buffering taking place. But according to
the specs, if update_pending is high, ie., the hw has "accepted" the
request for a page flip, it will complete as long as that request
still happened within the vblank. So on a return from the page_flip
function with update_pending == 1 we check if we are still inside the
vblank area, ie., if the hw will certainly complete the double
buffering within the current vblank, because the request was made in
time.

I did all my original testing of these bits with avivo hw (rv530,
r600) and with one radeon hd 5850, so i'm a bit surprised if the avivo
path would unconditionally need this adjustment. Could it be that the
observed accuracy of update_pending depends on the rest of the hw,
e.g., bus or processor speed, or bus activity? My test machines were a
MacBookPro with Core2Duo 2.3 Ghz for rv530 and a rather old AMD
Athlon-64 PC for r600.

I used a few different systems:

Brazos reference board for Brazos (E-350)
Iconia Tab W500 (C-50)
PhenomII X4 for most of the discrete cards
Athlon64 X2 for RS690

The results I got were consistent across all those systems. The only
differences I saw between different generations of Avivo-based hardware
were about the exact timing of the threshold when I would start seeing
flickering. On R5xx and R6xx it would start flickering at -3. On newer
hardware at -4 (I didn't test on R7xx).


I'm worried that your observed reliability of update_pending on >=
AVIVO asics could be an artifact of the specific computer hw you used
and that this doesn't generalize on older or different hw.

Given the number of different ASICs and systems, I think that's
unlikely. It's more likely that this depends on the exact mode timings.
I was running most of my experiments with a 19" DFP 1280x1024 at 60Hz,
connected by DVI if available, or VGA on some of the IGPs.

It's possible that different mode timings would result in a slightly
different threshold.

If it doesn't generalize then the patch could defer a lot of perfectly
good pageflips by 1 frame, screwing the timestamps and reducing
framerate.

I understand your concern. But given my observations, the current
implementation potentially produces much more annoying artefacts.


Here is what the rv630 register programming guide says about the
double-buffering of the surface base address registers:

D1GRPH_SURFACE_UPDATE_PENDING: "the double buffering occurs in
vertical retrace when D1GRPH_SURFACE_UPDATE_PENDING = 1 and
D1GRPH_UPDATE_LOCK = 0 and V_UPDATE = 1."

As far as I can tell, D1GRPH_SURFACE_UPDATE_PENDING will only be 1, if
the page flip is initiated while outside the vertical retrace. The the
actual page flip will occur when V_UPDATE changes to 1, that is, when
the next vertical retrace occurs. So if we read
D1GRPH_SURFACE_UPDATE_PENDING after initiating a page flip, it implies
that we're currently not in a vertical retrace.


D1CRTC_V_UPDATE: "Current vertical position ... 1 =  within the
V_UPDATE region (between end of vertical active display and start_line)"

For us that would mean the threshold for deferred flip completion
would need to be whatever that mentioned "start_line" is, and for the
tested avivo hw, start_line used to be == start of active scanout, so
the threshold of zero made sense.

In my experiments the start_line seemed to be between -4 and -2. On no
ASIC did I observe a start_line == 0.


Alex: I don't know where start_line is stored. Could it be that this
value changed due to hw changes or changes in the kms driver or
atombios? Or would it be possible to read that value back from some
register and use it as threshold?

If you look at radeon_get_crtc_scanoutpos() you can also see that the
returned vpos is corrected for some offsets. Could it be that
something changed there for the DCE4.1 or DCE5 display engine or
whatever the C-50 APU uses? That could also explain why suddenly such
a weird threshold as vpos > -4 is needed on your tablet, because the
returned vpos is offset wrongly by a few scanlines.

I believe the reason I observe flickering on my tablet is due to the
short vsync period. Otherwise there is nothing special about my tablet.
I was able to induce the same flickering by artificially delaying the
page flip on other Avivo hardware. My proposed fix resolves this
potential problem on all Avivo hardware. I am very confident that it
does that without deferring page flip notifications to user space
unnecessarily.


Ok, you had a larger test set of machines and more specific test cases for this problem, i'm convinced. Thanks for all the testing.
You have my...

Reviewed-by: Mario Kleiner <mario.klei...@tuebingen.mpg.de>

Wrt. to that new CRTC_ADVANCED_START_LINE_POSITION register on >= DCE4.1 that Alex found. Seems its default setting of 0x4 is the reason for the flicker threshold at vpos -4. Maybe it would by worth trying for the W500 tablet or devices/modes with similar short vblank intervals to reprogram that register with 0? That would give more headroom and maybe reduce your 25% number of deferred flips? Or is this likely to cause some hw trouble or artifacts because some line buffer can't fetch pixel data fast enough?

best,
-mario

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to