Hi Mathias: Just interested to know, what's the relationship between surfaceflinger and pixelflinger? Meanwhile, is there some document on sufraceflinger and pixelflinger? Thanks. -- Chen
On Sat, Jan 17, 2009 at 5:58 AM, Mathias Agopian <pixelflin...@google.com>wrote: > > On Fri, Jan 16, 2009 at 8:18 AM, F H <expelia...@googlemail.com> wrote: > > Thanks Mathias, that helps *a lot*. > > > > My brain hurts from looking at the memory stuff! > > > > I can now see that each client maps in the 8Mb shared memory region once. > > > > What I don't understand at the moment is where the pointer to the surface > > data is passed back to the client - can you say at what point that > happens? > > There is a control block in shared-memory, per surface. It contains an > offset to the surface's buffers from the beginning of their heap. Both > the client and SurfaceFlinger use this offset to access the buffer; > ;but they each have their own view of the pointer to the heap. > > Have a look at SurfaceComposerClient.cpp for implementation details. > > > > When a client uses a buffer (e.g. to draw to it) does it retrieve the > > pointer by first getting the base address of the related heap, and then > > digging out an offset from the surface? > > yes. the offset is controlled by SurfaceFlinger. > > > If we assume that I have my own buffer abstraction (whereby I could map a > > buffer into both SurfaceFlinger and the client process) that wasn't based > on > > having a Heap of contiguous memory. > > That would not work. SurfaceFlinger's design assumes Surfaces are > attached to a heap. > > A heap is by definition contiguous address-space (not to be confused > with physically contiguous memory). > > > >Then could the following be made to work > > easily: > > > > - Add a new Heap type, which would have an effective base of zero (see > > later). > > - The allocator would be simple (wouldn't need to worry about > fragmentation > > itself). > > - An offset associated with the buffer that was effectively an offset > from 0 > > (yeilding a 32 bit virtual pointer). > > - I might need to add and subtract a bias or would a heap base of 0 be > OK? > > No. absolutely not (see below). > > > > Also: > > - Presumably all rendering done by Android honours the fact that the > buffer > > stride may not be the same as the width? > > yes. > > > - Presumably Android doesn't 'lock' and 'unlock' a buffer between > rendering > > anywhere? > > correct. > > If you need to use your own memory type, you'd make the changes in > VRamHeap.cpp, which is where whole the memory management is done > (you'd need the cupcake branch, because things were even more > complicated before). > > In theory whole you need to do is to write a kernel driver than can > allocate your own type of memory, and use that instead of /dev/pmem or > /dev/ashmem. > > for this to work, your driver will have to be able to allocated > several of these heaps, which may not be possible. On the G1, we had > 8MB total to share with all apps. For obvious security reason, we > couldn't allow each client app to map the same 8MB into their address > space. > This is where pmem comes into play. pmem wraps a new "heap" around a > master heap and allows the server process to "slap" and "unslap" > individual pages in its client processes. "slapping" is like > "mmapping" except when you "unslap" the pages are replaced by a > "garbage" page (instead of a black hole). > > This way, the unique 8MB heap, is shared securely between all > clients, which, each are allowed to "see" only the pages they need. > > You would have to replicate this mechanism if your kernel allocator > cannot create multiple heaps. The easiest way would be to start from > our pmem driver and modify it to suit your needs. > > > Mathias > > > > > > > Thanks, > > Fred. > > > > > > On Fri, Jan 16, 2009 at 3:02 AM, Mathias Agopian < > pixelflin...@google.com> > > wrote: > >> > >> Hi, > >> > >> On Thu, Jan 15, 2009 at 9:53 AM, F H <expelia...@googlemail.com> wrote: > >> > I have a few questions regarding integration of an accelerated > >> > capability > >> > into Android. > >> > >> Before we go further, I would like to point out that there are no > >> OpenGL ES driver model in Android 1.0. We're trying very hard to > >> finalize it for the cupcake release but there are no garantees. > >> You must understand that the work you'll be doing for h/w integration > >> before that happens, will become obsolete and we will not try to > >> ensure backward compatibility. > >> > >> > I understand that Android must draw to surfaces in Software. In our > >> > environment we can create a buffer that can be drawn to both by > Hardware > >> > and > >> > software, but it is one of our components that must allocate the > memory > >> > in > >> > order to do this. > >> > >> > I've been looking at some various components in SurfaceFlinger that > may > >> > be > >> > of help (or possibly red-herrings) and have a few questions: > >> > >> > - Do *all* surfaces which can be drawn to instances of one particular > >> > class > >> > and if so which one? (I'd like to hook in our own memory surface class > >> > at > >> > this point rather than a raw memory allocation). Is there a single > point > >> > for > >> > which this allocation is done? > >> > >> The allocation is done in SurfaceFlinger. The current scheme is very > >> messy. Look at Layer.cpp and LayerBitmap.cpp. They eventually acquire > >> an allocator object. > >> > >> In fact, on the G1, there is the same issue, all the surfaces need to > >> be allocated in a certain way (look for the Pmem allocator). > >> > >> > - Does a layer have a 1:1 correspondence with a drawable Surface? Or > are > >> > multiple Surfaces placed into a Layer? > >> > >> The naming conventions are not always consistent, but in short: > >> > >> A Layer is something that can be composited by SurfaceFlinger (should > >> have been called LayerFlinger). There are several types of Layers if > >> you look in the code, in particular the regular ones (Layer.cpp) , > >> they are backed by a Surface, and the LayerBuffer (very badly chosen > >> name) which don't have a backing store, but receive one from their > >> client. > >> > >> A Surface has a certain number of Buffers, usually 2. > >> > >> Note that the GGLSurface type, should have been called GGLBuffer. > >> > >> > >> > - Presumably multiple layers are just composited to the final buffer > in > >> > their Z order? > >> > >> Yes. > >> > >> > - What's the GPUHardware class for? - is it there just for chip access > >> > arbitration or debugging (It looked for example like the allocator was > >> > only > >> > used if the debug.egl.hw property were set). Is this needed if > >> > arbitration > >> > is handled through EGL/GL? > >> > >> GPUHardware will go away. It is used for managing the GPU > >> (Arbitration) and allocating the GPU memory, so that GL Surfaces can > >> reside on the chip. > >> > >> > - Is it true that for surfaces only one allocator will be used either > >> > GPU, > >> > /dev/pmem or heap in that order? Under what circumstances is /dev/pmem > >> > needed? > >> > >> The current implementation deals only with the emulator and the G1. > >> The g1 needs pmem memory for using h/w acceleration for the > >> compositing. > >> So pmem is always used on the G1 (which doesn't use ashmem at all). > >> > >> > - Is the 8Mb SurfaceFlinger allocation per process or a one-off for > the > >> > system? > >> > >> Depends. On the G1 it's for everyone. and it's physical. On the > >> Emulator we have 8MB of *address space* per process/ > >> > >> > >> > - Presumably there is only one compositor (running in a system > thread)? > >> > When > >> > a surface is allocated is it done through the applications thread or > the > >> > thread that looks after the composition? (Is there an accompanying > call > >> > somewhere to map memory from one process into another?) > >> > >> Memory is always allocated in Surfaceflinger, it is stuffed into an > >> IMemory object, which takes care of mapping it to the destination > >> process automatically (see IMemory.cpp, if you want to hurt your > >> brain). > >> > >> > - When the compositor is refreshing the display what mechanisms is it > >> > using > >> > to access buffers that are in a different address space? > >> > >> They're all in shared memory. The SurfaceFlinger mmaps the surface > >> heaps (which is different from the main heap) of each of its client > >> processes into its own address space. This consumes 8MB of address > >> space per client process inside surfaceflinger. > >> > >> > - On the off-chance is there any porting documentation related to > >> > surface > >> > flinger and how it works? > >> > >> Sorry. :) > >> > >> > >> You should be able to implement basic 2D h/w acceleration though the > >> copybit hal module. > >> > >> I hope this helps. > >> > >> Mathias > >> >> > > > > > > --~--~---------~--~----~------------~-------~--~----~ unsubscribe: android-porting+unsubscr...@googlegroups.com website: http://groups.google.com/group/android-porting -~----------~----~----~----~------~----~------~--~---