Re: xaa vs. WriteImage()

Michael Lorenz <[email protected]> Thu, 6 Mar 2008 16:26:46 -0500
Newsgroups gmane.comp.xfree86.devel
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

On Mar 6, 2008, at 15:58, Alex Deucher wrote:

> On Thu, Mar 6, 2008 at 2:58 PM, Michael Lorenz  
> <[email protected]> wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>>  Hash: SHA1
>>
>>  Hello,
>>
>>  On Mar 6, 2008, at 14:12, Alex Deucher wrote:
>>
>>> On Thu, Mar 6, 2008 at 2:00 PM, Michael Lorenz
>>> <[email protected]> wrote:
>>>> -----BEGIN PGP SIGNED MESSAGE-----
>>>>  Hash: SHA1
>>>>
>>>>  Hello,
>>>>
>>>>  On Mar 5, 2008, at 19:06, Alex Deucher wrote:
>>>>
>>>>> On Tue, Mar 4, 2008 at 5:34 PM, Michael Lorenz
>>>>> <[email protected]> wrote:
>>>>>> -----BEGIN PGP SIGNED MESSAGE-----
>>>>>>  Hash: SHA1
>>>>>>
>>>>>>  Hello,
>>>>>>
>>>>>>
>>>>>> On Mar 4, 2008, at 15:37, Marc Aurele La France wrote:
>>>>>>
>>>>>>> On Mon, 3 Mar 2008, Michael Lorenz wrote:
>>>>>>>
>>>>>>>> I noticed the following - XAACopyArea() only attempts to use
>>>>>>>> accelerated WriteImage() when writing to a DRAWABLE_WINDOW but
>>>>>>>> not
>>>>>>>> on off-screen pixmaps. I used the following changes to make it
>>>>>>>> work:
>>>>>>>
>>>>>>>> diff -u -w -r1.1.1.3 xaaCpyArea.c
>>>>>>>> - --- xaaCpyArea.c   9 Jun 2001 15:09:02 -0000       1.1.1.3
>>>>>>>> +++ xaaCpyArea.c     3 Mar 2008 20:51:05 -0000
>>>>>>>> @@ -64,9 +64,16 @@
>>>>>>>>            return (XAABitBlt( pSrcDrawable, pDstDrawable,
>>>>>>>>              pGC, srcx, srcy, width, height, dstx, dsty,
>>>>>>>>              XAADoBitBlt, 0L));
>>>>>>>> +    } else {
>>>>>>>> +        if(infoRec->ScreenToScreenBitBlt &&
>>>>>>>> +         CHECK_ROP(pGC,infoRec->ScreenToScreenBitBltFlags) &&
>>>>>>>> +         CHECK_ROPSRC(pGC,infoRec- 
>>>>>>>> >ScreenToScreenBitBltFlags) &&
>>>>>>>> +         CHECK_PLANEMASK(pGC,infoRec-
>>>>>>>>> ScreenToScreenBitBltFlags))
>>>>>>>> +            return (XAABitBlt( pSrcDrawable, pDstDrawable,
>>>>>>>> +            pGC, srcx, srcy, width, height, dstx, dsty,
>>>>>>>> +            XAADoImageWrite, 0L));
>>>>>>>>      }
>>>>>>>>    }
>>>>>>>
>>>>>>> This does not look correct.  Shouldn't this be more in line with
>>>>>>> the case where the destination drawable is a window?  (i.e. test
>>>>>>> bitsPerPixel's and WritePixmap files instead of
>>>>>>> ScreenToScreenBitBlt).
>>>>>>
>>>>>>  The whole logic looks a little bit fishy, I used the first if 
>>>>>> ()'s
>>>>>>  source-in-memory branch first but wasn't quite sure if that's
>>>>>> doing
>>>>>>  the right thing, where it;s now looked better to me but I won't
>>>>>> claim
>>>>>>  I completely understand XAA's inner voodoo. All I want is the  
>>>>>> make
>>>>>>  XAA use ImageWrite()s for all RAM-to-VRAM transfers if the  
>>>>>> driver
>>>>>>  supports it.
>>>>>>  Otherwise, teaching the framebuffer layer to cope with a tiled
>>>>>>  framebuffer might be necessary in the long run, any pointers
>>>>>> where to
>>>>>>  start?
>>>>>
>>>>> Several drivers (radeon, intel, savage) in the Xorg tree provide
>>>>> support for various tiling methods.  Generally the chip provides a
>>>>> surface control or aperture for exposing a tiled region to the
>>>>> CPU as
>>>>> a linear surface.  For acceleration, you have to keep track of  
>>>>> what
>>>>> buffers are tiled in the driver and do the right thing with the
>>>>> blitter when using those surfaces.
>>>>
>>>>  Yeah, I'm dimly aware of these things - my problem is that the
>>>>  hardware in question doesn't give me a linear view on the
>>>> framebuffer.
>>>>  All I have is a small linear buffer I can use to DMA data in or  
>>>> out
>>>>  of the tiled framebuffer. The other problem is that the machine's
>>>>  native pixel format is RGBA, if I want 24bit colour that's the  
>>>> only
>>>>  one I can use. Fortunately the DMA engine can convert pixels on  
>>>> the
>>>>  fly so I can pretend it's ABGR. So pixels would have to be endian-
>>>>  flipped as well when the fb layer accesses VRAM - is there any  
>>>> prior
>>>>  art for that?
>>>
>>> EXA has prepare/finish access hooks for CPU access to buffers.  I
>>> don't think XAA has anything similar.  There's also an wrapable FB
>>> module, although I think it's only available in Xorg.
>>
>>  I'll have a look at that - the main reason I'm using XFree86 is that
>>  it's already working on NetBSD/sgimips, Xorg needs some more work  
>> but
>>  I'll eventually do it.
>>  Hmm, some drivers access video memory through tiny apertures like  
>> the
>>  VGA range - maybe I can do something like this - let the rest of the
>>  Xserver render into my DMA buffer and then blit it in place.
>
> Use shadowfb and hook in a custom shadowupdate() function.

Wouldn't that interfere with XAA? If I could catch the framebuffer  
writes that bypass XAA that way that would solve my problem.
Thanks!

have fun
Michael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (Darwin)

iQEVAwUBR9BhlspnzkX8Yg2nAQLzKwf9GfmbcQZVMLvhx6Je/CgU6fadr/VJq+AZ
sBetdsOeXhFQxGlUFouG8DrDalrSwccXnEo+S4/zuPd5RGn01XmTfm5MBEvxMDAV
upT1U8a5szyHN8t7MgpGwzVoG6Y21F9n07RHsIs/hXB0OfV9yXaM6J3enKRt84Kp
S0pGZWB5xfyrTqBwP8gn1JSq1uTvJr/2zWHE/bwWu8ShAvD2l87FRrsAy0zKfRY6
NWua4rpwDY+XLAsx/kxkmTWbHsKFie+OuO6RUIyqRV+Ix5auLXb7rDRg5S/rKZfx
n2dXmXDs4BZBcl6WzyxEMzthiS88UCQNYjbhGlcL6cwaWC8H5hja1Q==
=OF0s
-----END PGP SIGNATURE-----