<div>Hello,<br></div><br><div class="gmail_quote">On Thu, Sep 24, 2009 at 5:25 PM, Aaron Plattner <span dir="ltr">&lt;<a href="mailto:aplattner@nvidia.com">aplattner@nvidia.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Thu, Sep 24, 2009 at 02:10:55PM -0700, Michael wrote:<br>
&gt; Hello,<br>
&gt;<br>
&gt; I finally found out why drawing ops to window borders always fall back<br>
&gt; to software. It starts with miPaintWindow() - if it has to draw<br>
&gt; outside the window&#39;s drawable in order to draw the border it requests<br>
&gt; the screen pixmap which, thanks to the insane way in which it is<br>
&gt; created by miCreateScreenResources(), is a DRAWABLE_PIXMAP without<br>
&gt; further flags set so when miPaintWindow() calls ValidateGC() the resp.<br>
&gt; DDX, be it XAA or EXA or whatever, thinks it&#39;s drawing into system<br>
&gt; memory and falls back to software. The following patch fixes this for<br>
&gt; XAA by  checking the target drawable against pScreen-&gt;devPrivate and<br>
<br>
</div>Use pScreen-&gt;GetScreenPixmap(pScreen) instead of pScreen-&gt;devPrivate.  This<br>
may not be completely sufficient if the driver creates other &quot;special&quot;<br>
pixmaps (e.g. for an overlay), but I think the number of drivers that do<br>
that that also use XAA is zero.<br></blockquote><div><br></div><div>Makes sense, in case someone or something hooks GetScreenPixmap().</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">&gt; use accelerated ops if they match.<br>
<br>
</div>I&#39;m a little worried that this will break some drivers that expect<br>
accelerated pixmaps to have driver-provided devPrivates attached.  I don&#39;t<br>
know offhand of any drivers that do that, but it is a change in behavior.<br></blockquote><div><br></div><div>These drivers would hook CreatePixmap(), wouldn&#39;t they? That&#39;s still being called.</div><div><br></div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div class="h5">&gt; Index: xaaGC.c<br>
&gt; ===================================================================<br>
&gt; RCS file: /cvsroot/xsrc/external/mit/xorg-server/dist/hw/xfree86/xaa/<br>
&gt; xaaGC.c,v<br>
&gt; retrieving revision 1.1.1.2<br>
&gt; diff -u -w -r1.1.1.2 xaaGC.c<br>
&gt; - --- xaaGC.c     11 Jun 2009 01:52:58 -0000      1.1.1.2<br>
&gt; +++ xaaGC.c     24 Sep 2009 21:06:10 -0000<br>
&gt; @@ -88,7 +88,8 @@<br>
&gt;              pGC-&gt;fgPixel = 0x7fffffff;<br>
&gt;       }<br>
&gt;<br>
&gt; - -    if((pDraw-&gt;type == DRAWABLE_PIXMAP) &amp;&amp; !<br>
&gt; IS_OFFSCREEN_PIXMAP(pDraw)){<br>
&gt; +    if((pDraw-&gt;type == DRAWABLE_PIXMAP) &amp;&amp;<br>
&gt; +       !IS_OFFSCREEN_PIXMAP(pDraw) &amp;&amp; !PIXMAP_IS_SCREEN(pDraw, pGC)) {<br>
&gt;          pGCPriv-&gt;flags = OPS_ARE_PIXMAP;<br>
&gt;           pGCPriv-&gt;changes |= changes;<br>
&gt;<br>
&gt; Index: xaalocal.h<br>
&gt; ===================================================================<br>
&gt; RCS file: /cvsroot/xsrc/external/mit/xorg-server/dist/hw/xfree86/xaa/<br>
&gt; xaalocal.h,v<br>
&gt; retrieving revision 1.3<br>
&gt; diff -u -w -r1.3 xaalocal.h<br>
&gt; - --- xaalocal.h  11 Jun 2009 02:13:52 -0000      1.3<br>
&gt; +++ xaalocal.h  24 Sep 2009 21:06:11 -0000<br>
&gt; @@ -1710,6 +1710,9 @@<br>
&gt;   #define IS_OFFSCREEN_PIXMAP(pPix)\<br>
&gt;           ((XAA_GET_PIXMAP_PRIVATE((PixmapPtr)(pPix)))-&gt;offscreenArea)<br>
&gt;<br>
&gt; +#define PIXMAP_IS_SCREEN(pPix, pGC)\<br>
&gt; +        (pPix == pGC-&gt;pScreen-&gt;devPrivate)<br>
&gt; +<br>
&gt;   #define PIXMAP_IS_SHARED(pPix)\<br>
&gt;           ((XAA_GET_PIXMAP_PRIVATE((PixmapPtr)(pPix)))-&gt;flags &amp;<br>
&gt; SHARED_PIXMAP)<br>
&gt;<br>
&gt;<br>
&gt; this isn&#39;t really a performance issue but there are graphics chips<br>
&gt; which don&#39;t let us map their framebuffers in a useful way ( think SGI<br>
&gt; newport and crime for example ) where we really don&#39;t want anything to<br>
&gt; fall back to software if there is any other way.<br>
&gt;<br>
&gt; A proper way to fix this would be to change the way the screen pixmap<br>
&gt; is created so the accel lib, be it XAA, EXA or whatever, knows what<br>
&gt; it&#39;s doing and can mark the pixmap as in video memory. As it is now<br>
&gt; miCreateScreenResources() just calls CreatePixmap() with the right<br>
&gt; depth but no width or height, then fills in geometry, data pointer and<br>
&gt; so on.<br>
<br>
</div></div>Drivers can plug whatever else they need into the screen pixmap by wrapping<br>
CreateScreenResources.<br>
</blockquote></div><div><br></div><div>Maybe XAA should do that. Otherwise, what business has mi knowing about the address of mapped video memory?<br></div><div><br></div><div>have fun</div><div>Michael</div><div><br></div>