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