Re: Some considerations
Keith Whitwell <keith-CdwZJljFklH+2FeEXyspIVaTQe2KTcn/@public.gmane.org>
| Newsgroups | gmane.comp.freedesktop.xserver |
|---|---|
| Message-ID | <[email protected]> |
Marcelo E. Magallon wrote: > On Wed, Nov 26, 2003 at 01:19:14AM -0800, Keith Packard wrote: > > > Window buffers which aren't actively updating will be migrated back > > to main memory if other applications have more pressing need for > > video memory. But, if everything is updating all the time, you're > > gonna need piles of memory to keep everything resident. Do realize > > that even a full-screen image is "small" these days -- with 256meg > > video cards, even several 4meg full-screen images are manageable. > > Well, yes, but you are ignoring windowed OpenGL applications that _use_ > those 256 MB of RAM (or something close to it), e.g. Maya, which the OP > mentioned. The question is probably how is texture memory going to be > used? Does every application get its own texture? A pretty smart > texture manager is in order. Since window resizes would mean > destroying and allocating new textures, that might wreak havoc with the > driver's texture manager. > > I have been reading the last few weeks worth of posts to this mailing > lists, particularly looking for something related to the OpenGL-based > renderer, particularly: > > * How to leverage existing proprietary OpenGL drivers > > * How will OpenGL applications work > > * What's the impact on OpenGL applications > > For the first question, as far as I understand it, there's a regular > Xserver using the proprietary driver, and a fullscreen application runs > on this. This application receives all the requests from clients and > translates them to an OpenGL command stream to do the actual rendering. > The actual implementation might look a bit different, but somewhere > there's got to be a client that uses the vendor's OpenGL driver. Since > all the proprietary OpenGL drivers are GLX-based, you need an Xserver. Initially this is correct, but I see this as a development/transitional architecture to be replaced by one in which the proprietry and opensource drivers are engineered to exist and operate without a second X server. > That has an impact on the second question. A great deal of effort has > been put into implementing direct rendering drivers (and I'm not > refering only to those provided by the DRI project). In plain English, > OpenGL applications running locally are direct rendering clients for > all situations of interest. The application sets up a window and event > loops with the Xserver but all of the rendering in that window goes > straight to the card bypassing the Xserver. > > Which brings me to the third question: on SGIs, where sync-to-vblank is > standard, I can have continously updating OpenGL applications running > side-by-side with little trouble. On Linux using NVIDIA drivers and a > 2.6 kernel, this gets very jerky (_even_ with sync-to-vblank). > Framerates aren't bad, but inconsistent. In the context of transparent > windows, double-buffering gets interesting :-) This has much to do with scheduling algorithms - SGI I'm sure has done a lot of work to integrate the behaviour of opengl apps and the system scheduler so that this appearance of smooth behaviour results. Additionally, there's a suprising amount of work, including probably hardware support you need to get multiple applications running sync-to-vblank efficiently. My (limited) understanding is that the nvidia hardware has much of what's required, but who knows if it's been a priority for them at the driver level. If you think about it, a GL app with direct rendering probably looks a lot like a batch application to the scheduler. > Much larger areas of > the screen get damaged. In can imagine the best solution is to render > each window to a texture and then rendering a bunch of polygons one on > top of the other. Who is doing this rendering? Are you talking about doing the rendering on CPU to a buffer which is then handed off to the card as a texture? > The blending code I posted before is pretty good, > but it only beats up blending on the card _if_ the data isn't already > available on the card's memory: > > Operation | Texture | DrawPixels > ======================================= > Clear | 1 | 1 > ======================================= > Texture upload | 36 | > Texture upload | 36 | > Render quad | 1 | > Render quad | 1 | > --------------------------------------- > DrawPixels | | 16 > DrawPixels | | 18 > --------------------------------------- > ReadPixels | 42 | 41 > --------------------------------------- > Total | 117 | 76 > > (times are ms; images are 1k x 1k RGBA; hardware is a > GeForce3) > > Just ignore the ReadPixels call. > > Blending a handful of large quads is not _that_ expensive, but > uploading large amounts of texture data is. > > And where does that leave my OpenGL application? As long as my OpenGL > application is a top-level window everything is ok, but when I lower > it, I start to get inconsistent results, or did I miss something? I'm not really sure what you're getting at - an opengl app would be rendering to an offscreen buffer and composited along with everything else. Keith