<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Hi,<br>
<br>
I realize reading what I wrote that I made the case for the
'target_msc > crtc_msc' check, and did not explain the
'target_msc >= crtc_msc' check.<br>
<br>
I guess the only possible explanation could be that DDXs were
expected to trigger present_execute straight away when target_msc
== crtc_msc, but it doesn't make much sense.<br>
<br>
It is strange the issue hasn't been noticed before.<br>
<br>
What should be the behaviour difference when 'divisor == 1' and
'remainder == 0' versus 'divisor == 0' ?<br>
<br>
Yours,<br>
<br>
Axel<br>
<br>
On 03/11/2015 06:18, Zhou, Jammy wrote:<br>
</div>
<blockquote
cite="mid:FD5696F5CDD4B04D92C97DB96167DECA265365CB@SCYBEXDAG04.amd.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman",serif;
color:black;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";
color:black;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;
color:black;}
span.EmailStyle19
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:#1F497D;}
span.EmailStyle20
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Actually
my current problem happens when ‘divisor==1’ and
‘remainder==0’, and target_msc always equals crtc_msc if
PresentOptionAsync is specified in this case. It seems the
same even if we set ‘divisor=0’. With current
implementation, the code path of present_queue_vblank is
always triggered when they are equal. But it is not the
expected behavior according to the present protocol.<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Jammy<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext">From:</span></b><span
style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext">
Axel Davy [<a class="moz-txt-link-freetext" href="mailto:axel.davy@ens.fr">mailto:axel.davy@ens.fr</a>]
<br>
<b>Sent:</b> Monday, November 02, 2015 5:28 PM<br>
<b>To:</b> Zhou, Jammy; Michel Dänzer<br>
<b>Cc:</b> <a class="moz-txt-link-abbreviated" href="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</a>; Mario Kleiner<br>
<b>Subject:</b> Re: [PATCH] present: Execute right away
if target_msc equals current_msc<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Yes,<br>
<br>
I assume divisor = 0.<br>
<br>
Initially the code was like that:<br>
. if crtc_msc > target_msc, set target_msc to crtc_msc,
and if PresentOptionAsync not requested, then increase
target_msc.<br>
. if ddx doing sync flips only, and we plan to do a flip,
then decrease target_msc<br>
. if target_msc was already reached, do a copy immediately
(or async flip)<br>
<br>
Lets give as example a few scenarios:<br>
the screen is currently at msc crtc_msc.<br>
<br>
Let's assume ddx is not able to do async flips:<br>
<br>
. Client presents for target_msc <= crtc_msc<br>
-> target_msc set to crtc_msc<br>
-> if Async not requested, target_msc increased by one<br>
=> We present immediately (copy) if Async requested<br>
else if Async not requested:<br>
-> if we plan to do a flip, we decrement target_msc
(because sync flips delay effect by one msc)<br>
-> if we don't plan to flip, we wait next vblank and copy
then.<br>
<br>
<br>
. Client presents for target_msc = crtc_msc + 1<br>
-> PresentOptionAsync doesn't change anything<br>
-> if doing flip then target_msc is decremented (same
reason than before).<br>
<br>
In these two cases, when at the end of present_pixmap, we
have target_msc = crtc_msc, then we are<br>
in the case where we must copy immediately and won't be
doing flip. That explains the " target_msc > crtc_msc"
check.<br>
<br>
I don't know if that system worked perfectly when ddx was
async flips able.<br>
I haven't checked yet if the new code is ok for sync flips.<br>
<br>
Yours,<br>
<br>
Axel<br>
On 02/11/2015 09:56, Zhou, Jammy wrote :<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Thanks Axel. It is consistent with my understanding. <o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>For the 'pixmap' check in your previous change, it is used to differentiate present_pixmap and present_notify_msc, right? It looks like "target_msc >= crtc_msc" was used at the first place for present_pixmap, do you know the background about this?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Regards,<o:p></o:p></pre>
<pre>Jammy<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Axel Davy [<a moz-do-not-send="true" href="mailto:axel.davy@ens.fr">mailto:axel.davy@ens.fr</a>] <o:p></o:p></pre>
<pre>Sent: Monday, November 02, 2015 4:45 PM<o:p></o:p></pre>
<pre>To: Zhou, Jammy; Michel Dänzer<o:p></o:p></pre>
<pre>Cc: <a moz-do-not-send="true" href="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</a>; Mario Kleiner<o:p></o:p></pre>
<pre>Subject: Re: [PATCH] present: Execute right away if target_msc equals current_msc<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Hi,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>As you can see here:<o:p></o:p></pre>
<pre><a moz-do-not-send="true" href="http://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt#n212">http://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt#n212</a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>It means to present immediately instead of waiting for the next vblank (if needed).<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>In practice when needed to present immediately, if the ddx is not able to do async flips, then we do a copy to the screen buffer, else we use that ability.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Yours,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Axel<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>On 02/11/2015 09:26, Zhou, Jammy wrote :<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>By the way, does PresentOptionAsync mean the same thing with the async flip capability in kernel side? Or is it just a flag to indicate X/DDX to do present immediately instead of waiting for the next vblank?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Regards,<o:p></o:p></pre>
<pre>Jammy<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Axel Davy [<a moz-do-not-send="true" href="mailto:axel.davy@ens.fr">mailto:axel.davy@ens.fr</a>]<o:p></o:p></pre>
<pre>Sent: Thursday, October 29, 2015 3:42 PM<o:p></o:p></pre>
<pre>To: Michel Dänzer; Zhou, Jammy<o:p></o:p></pre>
<pre>Cc: <a moz-do-not-send="true" href="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</a>; Mario Kleiner<o:p></o:p></pre>
<pre>Subject: Re: [PATCH] present: Execute right away if target_msc equals <o:p></o:p></pre>
<pre>current_msc<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Hi,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>What is the current conscensus for how should PresentOptionAsync work ?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>If I remember correctly, the semantic used to be:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>. if we present at the current or past msc with the flag, two options:<o:p></o:p></pre>
<pre>-> if the ddx doesn't support async swap, we do copy to the screen<o:p></o:p></pre>
<pre>pixmap right away<o:p></o:p></pre>
<pre>-> if the ddx does support it, we do an async swap right away<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>. if we present at another msc, things behave as without PresentOptionAsync, that is we schedule a swap, and ask at msc-1 to the ddx to swap for msc.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>With "Fix use of vsynced pageflips", I get the impression it shifted to:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>. Async requested, but driver not having the async option -> do screen copy (no flips, whatever the msc) . if Async not requested and flip planned, present at msc-1, else at msc. (so for flips and Async flag, we do always plan to flip at msc ?<o:p></o:p></pre>
<pre>That means always tear, right ?)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>That doesn't make a lot of sense to me, can someone clarify ?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>I'm afraid this patch could be a workaround to currently broken behaviour, and not the correct fix.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>I CCed Mario Kleiner.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Yours,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Axel Davy<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>On 29/10/2015 03:53, Michel Dänzer wrote:<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>On 28.10.2015 19:39, Jammy Zhou wrote:<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>It is according to the protocol:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>"If 'options' contains PresentOptionAsync, and the 'target-msc'<o:p></o:p></pre>
<pre>is less than or equal to the current msc for 'window', then the <o:p></o:p></pre>
<pre>operation will be performed as soon as possible, not necessarily <o:p></o:p></pre>
<pre>waiting for the next vertical blank interval."<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Jammy Zhou <a moz-do-not-send="true" href="mailto:Jammy.Zhou@amd.com"><Jammy.Zhou@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> present/present.c | 2 +-<o:p></o:p></pre>
<pre> 1 file changed, 1 insertion(+), 1 deletion(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/present/present.c b/present/present.c index<o:p></o:p></pre>
<pre>beb4ff0..5900c22 100644<o:p></o:p></pre>
<pre>--- a/present/present.c<o:p></o:p></pre>
<pre>+++ b/present/present.c<o:p></o:p></pre>
<pre>@@ -871,7 +871,7 @@ present_pixmap(WindowPtr window,<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> xorg_list_add(&vblank->event_queue, &present_exec_queue);<o:p></o:p></pre>
<pre> vblank->queued = TRUE;<o:p></o:p></pre>
<pre>- if ((pixmap && target_msc >= crtc_msc) || (!pixmap && target_msc > crtc_msc)) {<o:p></o:p></pre>
<pre>+ if (target_msc > crtc_msc) {<o:p></o:p></pre>
<pre> ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc);<o:p></o:p></pre>
<pre> if (ret == Success)<o:p></o:p></pre>
<pre> return Success;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
</blockquote>
<pre>Looks good to me, but Cc'ing Axel Davy, who made the last change to <o:p></o:p></pre>
<pre>this code.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Reviewed-by: Michel Dänzer <a moz-do-not-send="true" href="mailto:michel.daenzer@amd.com"><michel.daenzer@amd.com></a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
</blockquote>
</blockquote>
<pre><o:p> </o:p></pre>
</blockquote>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</blockquote>
<br>
</body>
</html>