135 lines
4.8 KiB
C
135 lines
4.8 KiB
C
#ifndef _HEAP_H_
|
|
#define _HEAP_H_
|
|
//
|
|
// (C) Copyright NVIDIA Corporation Inc., 1995-2000. All rights reserved.
|
|
//
|
|
/*********************** Heap manager data structures **********************\
|
|
* *
|
|
* Module: HEAP.H *
|
|
* Heap manager for allocating memory based on usage and *
|
|
* memory configuration. *
|
|
* *
|
|
*****************************************************************************
|
|
* *
|
|
* History: *
|
|
* David Schmenk (dschmenk) 05/19/98 - wrote it. *
|
|
* *
|
|
\***************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
U032 offset;
|
|
U032 size;
|
|
U032 flags;
|
|
} MEMBANK, *PMEMBANK;
|
|
|
|
typedef struct def_block
|
|
{
|
|
U032 owner;
|
|
U032 mhandle;
|
|
U032 begin;
|
|
U032 align;
|
|
U032 end;
|
|
union
|
|
{
|
|
U032 type;
|
|
struct def_block *prevFree;
|
|
} u0;
|
|
union
|
|
{
|
|
U032 hwres;
|
|
struct def_block *nextFree;
|
|
} u1;
|
|
struct def_block *prev;
|
|
struct def_block *next;
|
|
} MEMBLOCK, *PMEMBLOCK;
|
|
|
|
typedef struct
|
|
{
|
|
U008 *base;
|
|
U032 total;
|
|
U032 free;
|
|
MEMBLOCK *pBlockList;
|
|
MEMBLOCK *pFreeBlockList;
|
|
U032 numBanks;
|
|
U032 memHandle;
|
|
U032 memTypeFlags[11];
|
|
MEMBANK Bank[1];
|
|
} HEAP, *PHEAP;
|
|
//
|
|
// Handy heap macros.
|
|
//
|
|
//#define BLOCK_OFFSET(bp) ((bp)->offset+(bp)->align)
|
|
//#define BLOCK_ADDRESS(hp,bp) ((hp)->base+(bp)->offset+(bp)->align)
|
|
//
|
|
// Pre-defined no-owner ID - i.e. free.
|
|
//
|
|
#define FREE_BLOCK 0xFFFFFFFF
|
|
//
|
|
// Types of memory to allocate.
|
|
//
|
|
#ifndef BIT
|
|
#define BIT(b) (1<<(b))
|
|
#endif
|
|
#define MEM_GROW_UP 0x00000000
|
|
#define MEM_GROW_DOWN 0x80000000
|
|
#define MEM_GROW_MASK 0x80000000
|
|
#define MEM_TYPE_IMAGE 0
|
|
#define MEM_TYPE_DEPTH 1
|
|
#define MEM_TYPE_TEXTURE 2
|
|
#define MEM_TYPE_OVERLAY 3
|
|
#define MEM_TYPE_FONT 4
|
|
#define MEM_TYPE_CURSOR 5
|
|
#define MEM_TYPE_DMA 6
|
|
#define MEM_TYPE_INSTANCE 7
|
|
#define MEM_TYPE_PRIMARY 8
|
|
#define MEM_TYPE_IMAGE_TILED 9
|
|
#define MEM_TYPE_DEPTH_COMPR16 10
|
|
#define MEM_TYPE_DEPTH_COMPR32 11
|
|
#define MEM_TYPE_MAX 11
|
|
#define MEM_TYPE_MASK 0x0000FFFF
|
|
#define MEM_TYPE_IGNORE_BANK_PLACEMENT_FLAG 0x00010000
|
|
#define MEM_TYPE_FORCE_MEM_GROWS_UP_FLAG 0x00020000
|
|
#define MEM_TYPE_FORCE_MEM_GROWS_DOWN_FLAG 0x00040000
|
|
#define MEM_FLAG_IMAGE BIT(MEM_TYPE_IMAGE)
|
|
#define MEM_FLAG_DEPTH BIT(MEM_TYPE_DEPTH)
|
|
#define MEM_FLAG_TEXTURE BIT(MEM_TYPE_TEXTURE)
|
|
#define MEM_FLAG_OVERLAY BIT(MEM_TYPE_OVERLAY)
|
|
#define MEM_FLAG_FONT BIT(MEM_TYPE_FONT)
|
|
#define MEM_FLAG_CURSOR BIT(MEM_TYPE_CURSOR)
|
|
#define MEM_FLAG_DMA BIT(MEM_TYPE_DMA)
|
|
#define MEM_FLAG_INSTANCE BIT(MEM_TYPE_INSTANCE)
|
|
#define MEM_FLAG_PRIMARY BIT(MEM_TYPE_PRIMARY)
|
|
#define MEM_FLAG_IMAGE_TILED BIT(MEM_TYPE_IMAGE_TILED)
|
|
#define MEM_FLAG_DEPTH_COMPR16 BIT(MEM_TYPE_DEPTH_COMPR16)
|
|
#define MEM_FLAG_DEPTH_COMPR32 BIT(MEM_TYPE_DEPTH_COMPR32)
|
|
#define MEM_TYPE_HEAD_MASK 0x80000000
|
|
#define MEM_TYPE_HEAD_SHIFT 31
|
|
|
|
// bits kept in MEMBLOCK->type indicating if/which HW tile range was allocated
|
|
#define MEM_TYPE_TILE_RANGE_SHIFT(i) (1 << (24+(i)))
|
|
#define MEM_TYPE_TILE_RANGE_MASK 0xFF000000
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function prototypes.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
RM_STATUS heapCreate(PHWINFO, U008 *, U032, U032, PHEAP *);
|
|
RM_STATUS heapDestroy(PHWINFO, PHEAP);
|
|
RM_STATUS heapAlloc(PHWINFO, PHEAP, U032, U032 *, U032, U032, U032 *, U032 *);
|
|
RM_STATUS heapFbSetAllocParameters(PHWINFO, PFBALLOCINFO);
|
|
RM_STATUS blockFree(PHWINFO, PHEAP, PMEMBLOCK);
|
|
RM_STATUS heapFree(PHWINFO, PHEAP, U032, U032, U032 *);
|
|
RM_STATUS heapPurge(PHWINFO, PHEAP, U032);
|
|
RM_STATUS heapInfo(PHEAP, U032 *, U032 *, VOID**, U032 *, U032 *);
|
|
RM_STATUS heapInfoFreeBlocks(PHEAP, U032 *, U032 *, U032, U032, U032 *);
|
|
RM_STATUS heapCompact(PHEAP);
|
|
RM_STATUS heapGetSize(PHEAP, U032 *);
|
|
RM_STATUS heapGetFree(PHEAP, U032 *);
|
|
RM_STATUS heapGetMaxFree(PHEAP, U032 *, U032 *);
|
|
RM_STATUS heapGetBase(PHEAP, U008 **);
|
|
|
|
#endif // _HEAP_H_
|