mm.h revision aae2b8b8eba46594d0915725c57f45d2965b15d6
193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell/*
293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * GLX Hardware Device Driver common code
3aae2b8b8eba46594d0915725c57f45d2965b15d6Keith Whitwell * Copyright (C) 1999 Wittawat Yamwong
493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell *
593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * copy of this software and associated documentation files (the "Software"),
793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * to deal in the Software without restriction, including without limitation
893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
1093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Software is furnished to do so, subject to the following conditions:
1193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell *
1293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * The above copyright notice and this permission notice shall be included
1393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * in all copies or substantial portions of the Software.
1493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell *
1593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
1993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
2193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */
2393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
241c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
251c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
261c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul * Memory manager code.  Primarily used by device drivers to manage texture
271c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul * heaps, etc.
281c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul */
291c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
301c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
311c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul#ifndef MM_H
321c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul#define MM_H
331c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
341c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
351c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul#include "imports.h"
361c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
3793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
3893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellstruct mem_block_t {
3993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell  struct mem_block_t *next;
4093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell  struct mem_block_t *heap;
4193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell  int ofs,size;
4293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell  int align;
438352666a9db11cfc5f41b9ca0b135750b606d2f2Keith Whitwell  unsigned int free:1;
448352666a9db11cfc5f41b9ca0b135750b606d2f2Keith Whitwell  unsigned int reserved:1;
4593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell};
461c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
4793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwelltypedef struct mem_block_t TMemBlock;
481c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
4993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwelltypedef struct mem_block_t *PMemBlock;
5093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
5193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell/* a heap is just the first block in a chain */
5293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwelltypedef struct mem_block_t memHeap_t;
5393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
5493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
551c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/* XXX are these needed? */
561c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul#if 0
571c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulstatic INLINE int
581c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian PaulmmBlockSize(PMemBlock b)
591c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul{
601c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul   return b->size;
611c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul}
6293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
631c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulstatic INLINE int
641c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian PaulmmOffset(PMemBlock b)
651c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul{
661c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul   return b->ofs;
671c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul}
681c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul#endif
691c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
701c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
711c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul
721c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
7393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * input: total size in bytes
7493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * return: a heap pointer if OK, NULL if error
7593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */
761c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern memHeap_t *mmInit(int ofs, int size);
7793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
781c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
7993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Allocate 'size' bytes with 2^align2 bytes alignment,
8093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * restrict the search to free memory after 'startSearch'
8193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * depth and back buffers should be in different 4mb banks
8293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * to get better page hits if possible
8393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * input:	size = size of block
8493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell *       	align2 = 2^align2 bytes alignment
8593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell *		startSearch = linear offset from start of heap to begin search
8693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * return: pointer to the allocated block, 0 if error
8793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */
881c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern PMemBlock mmAllocMem(memHeap_t *heap, int size, int align2,
891c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul                            int startSearch);
9093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
911c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
9293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Free block starts at offset
9393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * input: pointer to a block
9493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * return: 0 if OK, -1 if error
9593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */
961c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern int mmFreeMem(PMemBlock b);
9793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
981c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
99005469005df6ba5f80e382d5371c6d069c27738bKeith Whitwell * Free block starts at offset
100005469005df6ba5f80e382d5371c6d069c27738bKeith Whitwell * input: pointer to a heap, start offset
101005469005df6ba5f80e382d5371c6d069c27738bKeith Whitwell * return: pointer to a block
102005469005df6ba5f80e382d5371c6d069c27738bKeith Whitwell */
1031c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern PMemBlock mmFindBlock(memHeap_t *heap, int start);
104005469005df6ba5f80e382d5371c6d069c27738bKeith Whitwell
1051c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
10693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * destroy MM
10793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */
1081c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern void mmDestroy(memHeap_t *mmInit);
10993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
1101c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul/**
1111c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul * For debuging purpose.
1121c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paul */
1131c236fd5c734b7388d7625ce8c3d4b2d6da9fcfbBrian Paulextern void mmDumpMemInfo(const memHeap_t *mmInit);
11493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell
11593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#endif
116