diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources index 438cb600953..46c443b5747 100644 --- a/src/gallium/auxiliary/Makefile.sources +++ b/src/gallium/auxiliary/Makefile.sources @@ -264,8 +264,6 @@ C_SOURCES := \ util/u_linear.h \ util/u_log.c \ util/u_log.h \ - util/u_mm.c \ - util/u_mm.h \ util/u_network.c \ util/u_network.h \ util/u_pack_color.h \ diff --git a/src/gallium/auxiliary/meson.build b/src/gallium/auxiliary/meson.build index f96b32e9d75..65e4eda87ef 100644 --- a/src/gallium/auxiliary/meson.build +++ b/src/gallium/auxiliary/meson.build @@ -284,8 +284,6 @@ files_libgallium = files( 'util/u_linear.h', 'util/u_log.c', 'util/u_log.h', - 'util/u_mm.c', - 'util/u_mm.h', 'util/u_network.c', 'util/u_network.h', 'util/u_pack_color.h', diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index acb0c2b53cf..dfdff434c4d 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -149,8 +149,6 @@ MAIN_FILES = \ main/matrix.h \ main/mipmap.c \ main/mipmap.h \ - main/mm.c \ - main/mm.h \ main/menums.h \ main/mtypes.h \ main/multisample.c \ diff --git a/src/mesa/main/execmem.c b/src/mesa/main/execmem.c index 2142b50a6e9..8c7325bebf3 100644 --- a/src/mesa/main/execmem.c +++ b/src/mesa/main/execmem.c @@ -46,7 +46,7 @@ #include #include -#include "mm.h" +#include "util/u_mm.h" #ifdef MESA_SELINUX #include @@ -78,11 +78,11 @@ init_heap(void) #endif if (!exec_heap) - exec_heap = mmInit( 0, EXEC_HEAP_SIZE ); + exec_heap = u_mmInit( 0, EXEC_HEAP_SIZE ); if (!exec_mem) exec_mem = mmap(NULL, EXEC_HEAP_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); return (exec_mem != MAP_FAILED); } @@ -101,7 +101,7 @@ _mesa_exec_malloc(GLuint size) if (exec_heap) { size = (size + 31) & ~31; - block = mmAllocMem( exec_heap, size, 32, 0 ); + block = u_mmAllocMem( exec_heap, size, 32, 0 ); } if (block) @@ -122,10 +122,10 @@ _mesa_exec_free(void *addr) mtx_lock(&exec_mutex); if (exec_heap) { - struct mem_block *block = mmFindBlock(exec_heap, (unsigned char *)addr - exec_mem); + struct mem_block *block = u_mmFindBlock(exec_heap, (unsigned char *)addr - exec_mem); if (block) - mmFreeMem(block); + u_mmFreeMem(block); } mtx_unlock(&exec_mutex); diff --git a/src/mesa/main/mm.c b/src/mesa/main/mm.c deleted file mode 100644 index 5f0bfe96911..00000000000 --- a/src/mesa/main/mm.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * GLX Hardware Device Driver common code - * Copyright (C) 1999 Wittawat Yamwong - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#include -#include -#include - -#include "mm.h" - - -void -mmDumpMemInfo(const struct mem_block *heap) -{ - fprintf(stderr, "Memory heap %p:\n", (void *)heap); - if (heap == 0) { - fprintf(stderr, " heap == 0\n"); - } else { - const struct mem_block *p; - - for(p = heap->next; p != heap; p = p->next) { - fprintf(stderr, " Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size, - p->free ? 'F':'.', - p->reserved ? 'R':'.'); - } - - fprintf(stderr, "\nFree list:\n"); - - for(p = heap->next_free; p != heap; p = p->next_free) { - fprintf(stderr, " FREE Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size, - p->free ? 'F':'.', - p->reserved ? 'R':'.'); - } - - } - fprintf(stderr, "End of memory blocks\n"); -} - -struct mem_block * -mmInit(unsigned ofs, unsigned size) -{ - struct mem_block *heap, *block; - - if (!size) - return NULL; - - heap = calloc(1, sizeof(struct mem_block)); - if (!heap) - return NULL; - - block = calloc(1, sizeof(struct mem_block)); - if (!block) { - free(heap); - return NULL; - } - - heap->next = block; - heap->prev = block; - heap->next_free = block; - heap->prev_free = block; - - block->heap = heap; - block->next = heap; - block->prev = heap; - block->next_free = heap; - block->prev_free = heap; - - block->ofs = ofs; - block->size = size; - block->free = 1; - - return heap; -} - - -static struct mem_block * -SliceBlock(struct mem_block *p, - unsigned startofs, unsigned size, - unsigned reserved, unsigned alignment) -{ - struct mem_block *newblock; - - /* break left [p, newblock, p->next], then p = newblock */ - if (startofs > p->ofs) { - newblock = calloc(1, sizeof(struct mem_block)); - if (!newblock) - return NULL; - newblock->ofs = startofs; - newblock->size = p->size - (startofs - p->ofs); - newblock->free = 1; - newblock->heap = p->heap; - - newblock->next = p->next; - newblock->prev = p; - p->next->prev = newblock; - p->next = newblock; - - newblock->next_free = p->next_free; - newblock->prev_free = p; - p->next_free->prev_free = newblock; - p->next_free = newblock; - - p->size -= newblock->size; - p = newblock; - } - - /* break right, also [p, newblock, p->next] */ - if (size < p->size) { - newblock = calloc(1, sizeof(struct mem_block)); - if (!newblock) - return NULL; - newblock->ofs = startofs + size; - newblock->size = p->size - size; - newblock->free = 1; - newblock->heap = p->heap; - - newblock->next = p->next; - newblock->prev = p; - p->next->prev = newblock; - p->next = newblock; - - newblock->next_free = p->next_free; - newblock->prev_free = p; - p->next_free->prev_free = newblock; - p->next_free = newblock; - - p->size = size; - } - - /* p = middle block */ - p->free = 0; - - /* Remove p from the free list: - */ - p->next_free->prev_free = p->prev_free; - p->prev_free->next_free = p->next_free; - - p->next_free = 0; - p->prev_free = 0; - - p->reserved = reserved; - return p; -} - - -struct mem_block * -mmAllocMem(struct mem_block *heap, unsigned size, unsigned align2, unsigned startSearch) -{ - struct mem_block *p; - const unsigned mask = (1 << align2)-1; - unsigned startofs = 0; - unsigned endofs; - - if (!heap || !size) - return NULL; - - for (p = heap->next_free; p != heap; p = p->next_free) { - assert(p->free); - - startofs = (p->ofs + mask) & ~mask; - if ( startofs < startSearch ) { - startofs = startSearch; - } - endofs = startofs+size; - if (endofs <= (p->ofs+p->size)) - break; - } - - if (p == heap) - return NULL; - - assert(p->free); - p = SliceBlock(p,startofs,size,0,mask+1); - - return p; -} - - -struct mem_block * -mmFindBlock(struct mem_block *heap, unsigned start) -{ - struct mem_block *p; - - for (p = heap->next; p != heap; p = p->next) { - if (p->ofs == start) - return p; - } - - return NULL; -} - - -static inline int -Join2Blocks(struct mem_block *p) -{ - /* XXX there should be some assertions here */ - - /* NOTE: heap->free == 0 */ - - if (p->free && p->next->free) { - struct mem_block *q = p->next; - - assert(p->ofs + p->size == q->ofs); - p->size += q->size; - - p->next = q->next; - q->next->prev = p; - - q->next_free->prev_free = q->prev_free; - q->prev_free->next_free = q->next_free; - - free(q); - return 1; - } - return 0; -} - -int -mmFreeMem(struct mem_block *b) -{ - if (!b) - return 0; - - if (b->free) { - fprintf(stderr, "block already free\n"); - return -1; - } - if (b->reserved) { - fprintf(stderr, "block is reserved\n"); - return -1; - } - - b->free = 1; - b->next_free = b->heap->next_free; - b->prev_free = b->heap; - b->next_free->prev_free = b; - b->prev_free->next_free = b; - - Join2Blocks(b); - if (b->prev != b->heap) - Join2Blocks(b->prev); - - return 0; -} - - -void -mmDestroy(struct mem_block *heap) -{ - struct mem_block *p; - - if (!heap) - return; - - for (p = heap->next; p != heap; ) { - struct mem_block *next = p->next; - free(p); - p = next; - } - - free(heap); -} diff --git a/src/mesa/main/mm.h b/src/mesa/main/mm.h deleted file mode 100644 index 228721ca2a5..00000000000 --- a/src/mesa/main/mm.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * GLX Hardware Device Driver common code - * Copyright (C) 1999 Wittawat Yamwong - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * Memory manager code. Primarily used by device drivers to manage texture - * heaps, etc. - */ - - -#ifndef MM_H -#define MM_H - - -struct mem_block { - struct mem_block *next, *prev; - struct mem_block *next_free, *prev_free; - struct mem_block *heap; - unsigned ofs; - unsigned size; - unsigned free:1; - unsigned reserved:1; -}; - - - -/** - * input: total size in bytes - * return: a heap pointer if OK, NULL if error - */ -extern struct mem_block *mmInit(unsigned ofs, unsigned size); - -/** - * Allocate 'size' bytes with 2^align2 bytes alignment, - * restrict the search to free memory after 'startSearch' - * depth and back buffers should be in different 4mb banks - * to get better page hits if possible - * input: size = size of block - * align2 = 2^align2 bytes alignment - * startSearch = linear offset from start of heap to begin search - * return: pointer to the allocated block, 0 if error - */ -extern struct mem_block *mmAllocMem(struct mem_block *heap, unsigned size, - unsigned align2, unsigned startSearch); - -/** - * Free block starts at offset - * input: pointer to a block - * return: 0 if OK, -1 if error - */ -extern int mmFreeMem(struct mem_block *b); - -/** - * Free block starts at offset - * input: pointer to a heap, start offset - * return: pointer to a block - */ -extern struct mem_block *mmFindBlock(struct mem_block *heap, unsigned start); - -/** - * destroy MM - */ -extern void mmDestroy(struct mem_block *mmInit); - -/** - * For debuging purpose. - */ -extern void mmDumpMemInfo(const struct mem_block *mmInit); - -#endif diff --git a/src/mesa/meson.build b/src/mesa/meson.build index 27e8058766a..1254ccc619e 100644 --- a/src/mesa/meson.build +++ b/src/mesa/meson.build @@ -189,8 +189,6 @@ files_libmesa_common = files( 'main/matrix.h', 'main/mipmap.c', 'main/mipmap.h', - 'main/mm.c', - 'main/mm.h', 'main/menums.h', 'main/mtypes.h', 'main/multisample.c', diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources index dbdcbede627..cce28db005e 100644 --- a/src/util/Makefile.sources +++ b/src/util/Makefile.sources @@ -112,6 +112,8 @@ MESA_UTIL_FILES := \ os_memory_stdc.h \ os_memory.h \ u_memory.h \ + u_mm.h \ + u_mm.c \ vma.c \ vma.h diff --git a/src/util/meson.build b/src/util/meson.build index 9300cb6e34a..540e4e9ce43 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -106,6 +106,8 @@ files_mesa_util = files( 'u_vector.h', 'u_math.c', 'u_math.h', + 'u_mm.c', + 'u_mm.h', 'u_debug.c', 'u_debug.h', 'u_cpu_detect.c', diff --git a/src/gallium/auxiliary/util/u_mm.c b/src/util/u_mm.c similarity index 99% rename from src/gallium/auxiliary/util/u_mm.c rename to src/util/u_mm.c index c15f62dd731..0d275976688 100644 --- a/src/gallium/auxiliary/util/u_mm.c +++ b/src/util/u_mm.c @@ -23,7 +23,6 @@ **************************************************************************/ -#include "pipe/p_compiler.h" #include "util/u_debug.h" #include "util/u_memory.h" diff --git a/src/gallium/auxiliary/util/u_mm.h b/src/util/u_mm.h similarity index 100% rename from src/gallium/auxiliary/util/u_mm.h rename to src/util/u_mm.h