Just a side comment on Ian's excellent summary...

On Tue, Feb 12, 2002 at 11:45:58AM -0800, Ian Romanick wrote:
| - If an allocation (via the memHeap_t) fails when texture space is allocated
|   (radeonUploadTexImages in lib/GL/mesa/src/drv/radeon/radeon_texmem.c),
|   blocks at the end of the texList queue are freed until the allocation can
|   succeed.  This may be an area where the algorithm could be improved.  For
|   example, it might be better to find the largest free block (in the
|   memHeap_t) and release memory around that block in LRU or least-often-used
|   fashion until the allocation can succeed.

I spent some time last year looking into memory management issues for
OpenGL.  One of the things I noticed was that most apps render the
primitives in a scene in roughly the same order from frame to frame.
Consequently textures are referenced in roughly the same order each time
a frame is drawn:  T0, T1, T2, ...; T0, T1, T2, ... and so on.

If texture memory is overcommitted, then an LRU strategy yields a
pattern of memory management operations something like this:

    Frame 0:
        Load T0
        Use T0
        Load T1
        Use T1
        Unload T0 to generate free space for T2
        Load T2
        Use T2
    Frame 1:
        Unload T1 to generate free space for T0
        Load T0
        Use T0
        Unload T2 to generate free space for T1
        Load T1
        Use T1
        Unload T0 to generate free space for T2
        Load T2
        Use T2

All subsequent frames follow the pattern set by Frame 1.  You need to
unload one or more textures each time you want to use new ones.

On the other hand, a LIFO strategy yields a pattern like this:

    Frame 0:
        Load T0
        Use T0
        Load T1
        Use T1
        Unload T1 to generate free space for T2
        Load T2
        Use T2
    Frame 1:
        (T0 is still loaded)
        Use T0
        Unload T2 to generate free space for T1
        Load T1
        Use T1
        Unload T1 to generate free space for T2
        Load T2
        Use T2

Subsequent frames follow the pattern for Frame 1.

In this case LIFO saves one unload and one load per frame.  In practice
the actual savings depend on the relative sizes of textures, the total
memory load, and memory fragmentation, of course.  But in general, if
textures are re-used sequentially on each frame, LIFO is a better
strategy than LRU.

OpenGL needs mechanisms to provide better control over memory
allocation.  There wasn't enough interest on the part of the vendors to
come to agreement on an extension for OpenGL 1.X, but the OpenGL 2.0
proposal does include new features for memory management.

Allen

_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to