Re: xaa vs. WriteImage()

Michael Lorenz <[email protected]> Thu, 6 Mar 2008 14:58:17 -0500
Newsgroups gmane.comp.xfree86.devel
Message-ID <[email protected]>
-----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.

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

iQEVAwUBR9BM2cpnzkX8Yg2nAQK+dAf7B+5F0uHL8Vh0o7FCqWmdEHMs0EFT1eb1
4tvc/V8SVB2ZFnHBdkA5YdwXq6dIhNeQQRFDCu29VFBwlj4GHzkhAcYdkI00sDDa
84OpdxtuYTT0WvC74uaW486zMpEze0/0AvI3ZFeiP078TCUJ4161u8pA5zq6VkOu
FjaFBYcte/rGhNcg/VsBsDOx5gLwQxpEqImtFuqIRg9xgN2R1Zmto7BZvKV7eUvS
FRnvfZjBiTt/AbjdHtwwWEeRnp/3vu4cTz3+6pWmDMlVq4UFtLkvLVk8429Oz/eQ
tjv3MlU7cpeXLwFz3s3QqJ/4RYlmQGI7dDGYHDWT1yRLdAnDLVdafg==
=Biva
-----END PGP SIGNATURE-----