diff options
author | Brian Paul <brian.paul@tungstengraphics.com> | 2005-10-19 01:21:12 +0000 |
---|---|---|
committer | Brian Paul <brian.paul@tungstengraphics.com> | 2005-10-19 01:21:12 +0000 |
commit | cb16208ec076cd68b4ba1ce5aca3426dca20d2b8 (patch) | |
tree | 33d31693356a74a021a510fefe43f8d8c56ed140 /src | |
parent | 88107bea5616b94499de7e5edb9e8f0fcb0c289d (diff) |
Import exec-malloc changes from trunk.
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/Makefile.template | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_vtxfmt.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_vtxfmt.h | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_vtxfmt.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_vtxfmt.h | 4 | ||||
-rw-r--r-- | src/mesa/main/execmem.c | 132 | ||||
-rw-r--r-- | src/mesa/main/imports.h | 6 | ||||
-rw-r--r-- | src/mesa/main/mm.c (renamed from src/mesa/drivers/dri/common/mm.c) | 74 | ||||
-rw-r--r-- | src/mesa/main/mm.h (renamed from src/mesa/drivers/dri/common/mm.h) | 69 | ||||
-rw-r--r-- | src/mesa/sources | 2 | ||||
-rw-r--r-- | src/mesa/x86/rtasm/x86sse.c | 5 |
11 files changed, 253 insertions, 56 deletions
diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template index 9e22f9e82ec..c8fef8aac98 100644 --- a/src/mesa/drivers/dri/Makefile.template +++ b/src/mesa/drivers/dri/Makefile.template @@ -4,7 +4,6 @@ MESA_MODULES = $(TOP)/src/mesa/mesa.a COMMON_SOURCES = \ ../../common/driverfuncs.c \ - ../common/mm.c \ ../common/utils.c \ ../common/texmem.c \ ../common/vblank.c \ diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt.c b/src/mesa/drivers/dri/r200/r200_vtxfmt.c index c5d1f131d06..08173fda2dd 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.c @@ -1171,8 +1171,8 @@ static void free_funcs( struct dynfn *l ) struct dynfn *f, *tmp; foreach_s (f, tmp, l) { remove_from_list( f ); - ALIGN_FREE( f->code ); - FREE( f ); + _mesa_exec_free( f->code ); + _mesa_free( f ); } } diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt.h b/src/mesa/drivers/dri/r200/r200_vtxfmt.h index 82cbda2742b..15486de7788 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt.h +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.h @@ -57,10 +57,10 @@ do { \ char *start = (char *)&FUNC; \ char *end = (char *)&FUNC##_end; \ insert_at_head( &CACHE, dfn ); \ - dfn->key[0] = key[0]; \ - dfn->key[1] = key[1]; \ - dfn->code = ALIGN_MALLOC( end - start, 16 ); \ - memcpy (dfn->code, start, end - start); \ + dfn->key[0] = key[0]; \ + dfn->key[1] = key[1]; \ + dfn->code = _mesa_exec_malloc( end - start, 16 ); \ + _mesa_memcpy(dfn->code, start, end - start); \ } \ while ( 0 ) diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c index c5ea51cea9d..5a4cad8ba6f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c @@ -1046,8 +1046,8 @@ static void free_funcs( struct dynfn *l ) struct dynfn *f, *tmp; foreach_s (f, tmp, l) { remove_from_list( f ); - ALIGN_FREE( f->code ); - FREE( f ); + _mesa_exec_free( f->code ); + _mesa_free( f ); } } diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h index 950d530ae55..53a80408b29 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h @@ -56,8 +56,8 @@ do { \ char *end = (char *)&FUNC##_end; \ insert_at_head( &CACHE, dfn ); \ dfn->key = key; \ - dfn->code = ALIGN_MALLOC( end - start, 16 ); \ - memcpy (dfn->code, start, end - start); \ + dfn->code = _mesa_exec_malloc( end - start, 16 ); \ + _mesa_memcpy(dfn->code, start, end - start); \ } \ while ( 0 ) diff --git a/src/mesa/main/execmem.c b/src/mesa/main/execmem.c new file mode 100644 index 00000000000..89deaafad3a --- /dev/null +++ b/src/mesa/main/execmem.c @@ -0,0 +1,132 @@ +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + + +/** + * \file exemem.c + * Functions for allocating executable memory. + * + * \author Keith Whitwell + */ + + +#include "imports.h" +#include "glthread.h" + + + +#ifdef __linux__ + +/* + * Allocate a large block of memory which can hold code then dole it out + * in pieces by means of the generic memory manager code. +*/ + + +#include <unistd.h> +#include <sys/mman.h> +#include "mm.h" + +#define EXEC_HEAP_SIZE (128*1024) + +_glthread_DECLARE_STATIC_MUTEX(exec_mutex); + +static memHeap_t *exec_heap = NULL; +static unsigned char *exec_mem = NULL; + + +static void +init_heap(void) +{ + if (!exec_heap) + exec_heap = mmInit( 0, EXEC_HEAP_SIZE ); + + if (!exec_mem) + exec_mem = (unsigned char *) mmap(0, EXEC_HEAP_SIZE, + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +} + + +void * +_mesa_exec_malloc(GLuint size) +{ + PMemBlock block = NULL; + void *addr = NULL; + + _glthread_LOCK_MUTEX(exec_mutex); + + init_heap(); + + if (exec_heap) { + size = (size + 31) & ~31; + block = mmAllocMem( exec_heap, size, 32, 0 ); + } + + if (block) + addr = exec_mem + block->ofs; + + _glthread_UNLOCK_MUTEX(exec_mutex); + + return addr; +} + + +void +_mesa_exec_free(void *addr) +{ + _glthread_LOCK_MUTEX(exec_mutex); + + if (exec_heap) { + PMemBlock block = mmFindBlock(exec_heap, (unsigned char *)addr - exec_mem); + + if (block) + mmFreeMem(block); + } + + _glthread_UNLOCK_MUTEX(exec_mutex); +} + + +#else + +/* + * Just use regular memory. + */ + +void * +_mesa_exec_malloc(GLuint size) +{ + return _mesa_malloc( size ); +} + + +void +_mesa_exec_free(void *addr) +{ + _mesa_free(addr); +} + + +#endif diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h index 8d53e49769f..2ee66d9ac9b 100644 --- a/src/mesa/main/imports.h +++ b/src/mesa/main/imports.h @@ -661,6 +661,12 @@ extern void _mesa_align_free( void *ptr ); extern void * +_mesa_exec_malloc( GLuint size ); + +extern void +_mesa_exec_free( void *addr ); + +extern void * _mesa_realloc( void *oldBuffer, size_t oldSize, size_t newSize ); extern void * diff --git a/src/mesa/drivers/dri/common/mm.c b/src/mesa/main/mm.c index 5781d9936c2..e4c96821732 100644 --- a/src/mesa/drivers/dri/common/mm.c +++ b/src/mesa/main/mm.c @@ -21,17 +21,14 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/lib/GL/mesa/src/drv/common/mm.c,v 1.4 2002/10/30 12:51:27 alanh Exp $ */ - -#include <stdlib.h> -#include <stdio.h> #include "mm.h" -void mmDumpMemInfo( memHeap_t *heap ) +void +mmDumpMemInfo(const memHeap_t *heap) { - TMemBlock *p; + const TMemBlock *p; fprintf(stderr, "Memory heap %p:\n", (void *)heap); if (heap == 0) { @@ -48,34 +45,37 @@ void mmDumpMemInfo( memHeap_t *heap ) fprintf(stderr, "End of memory blocks\n"); } -memHeap_t *mmInit(int ofs, - int size) +memHeap_t * +mmInit(int ofs, int size) { PMemBlock blocks; if (size <= 0) { return NULL; } - blocks = (TMemBlock *) calloc(1,sizeof(TMemBlock)); + blocks = (TMemBlock *) _mesa_calloc(sizeof(TMemBlock)); if (blocks) { blocks->ofs = ofs; blocks->size = size; blocks->free = 1; return (memHeap_t *)blocks; - } else + } + else { return NULL; + } } -static TMemBlock* SliceBlock(TMemBlock *p, - int startofs, int size, - int reserved, int alignment) +static TMemBlock * +SliceBlock(TMemBlock *p, + int startofs, int size, + int reserved, int alignment) { TMemBlock *newblock; /* break left */ if (startofs > p->ofs) { - newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock)); + newblock = (TMemBlock*) _mesa_calloc(sizeof(TMemBlock)); if (!newblock) return NULL; newblock->ofs = startofs; @@ -89,7 +89,7 @@ static TMemBlock* SliceBlock(TMemBlock *p, /* break right */ if (size < p->size) { - newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock)); + newblock = (TMemBlock*) _mesa_calloc(sizeof(TMemBlock)); if (!newblock) return NULL; newblock->ofs = startofs + size; @@ -107,7 +107,9 @@ static TMemBlock* SliceBlock(TMemBlock *p, return p; } -PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch) + +PMemBlock +mmAllocMem(memHeap_t *heap, int size, int align2, int startSearch) { int mask,startofs,endofs; TMemBlock *p; @@ -136,19 +138,39 @@ PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch) return p; } -static __inline__ int Join2Blocks(TMemBlock *p) + +PMemBlock +mmFindBlock(memHeap_t *heap, int start) { + TMemBlock *p = (TMemBlock *)heap; + + while (p) { + if (p->ofs == start && p->free) + return p; + + p = p->next; + } + + return NULL; +} + + +static INLINE int +Join2Blocks(TMemBlock *p) +{ + /* XXX there should be some assertions here */ if (p->free && p->next && p->next->free) { TMemBlock *q = p->next; p->size += q->size; p->next = q->next; - free(q); + _mesa_free(q); return 1; } return 0; } -int mmFreeMem(PMemBlock b) +int +mmFreeMem(PMemBlock b) { TMemBlock *p,*prev; @@ -181,16 +203,18 @@ int mmFreeMem(PMemBlock b) } -void mmDestroy(memHeap_t *heap) +void +mmDestroy(memHeap_t *heap) { - TMemBlock *p,*q; + TMemBlock *p; if (!heap) return; - p = (TMemBlock *)heap; + + p = (TMemBlock *) heap; while (p) { - q = p->next; - free(p); - p = q; + TMemBlock *next = p->next; + _mesa_free(p); + p = next; } } diff --git a/src/mesa/drivers/dri/common/mm.h b/src/mesa/main/mm.h index 176910d70b6..33c986b4c7d 100644 --- a/src/mesa/drivers/dri/common/mm.h +++ b/src/mesa/main/mm.h @@ -19,11 +19,21 @@ * 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. - * */ -#ifndef MM_INC -#define MM_INC + +/** + * Memory manager code. Primarily used by device drivers to manage texture + * heaps, etc. + */ + + +#ifndef MM_H +#define MM_H + + +#include "imports.h" + struct mem_block_t { struct mem_block_t *next; @@ -33,25 +43,39 @@ struct mem_block_t { unsigned int free:1; unsigned int reserved:1; }; + typedef struct mem_block_t TMemBlock; + typedef struct mem_block_t *PMemBlock; /* a heap is just the first block in a chain */ typedef struct mem_block_t memHeap_t; -static __inline__ int mmBlockSize(PMemBlock b) -{ return b->size; } -static __inline__ int mmOffset(PMemBlock b) -{ return b->ofs; } +/* XXX are these needed? */ +#if 0 +static INLINE int +mmBlockSize(PMemBlock b) +{ + return b->size; +} -/* +static INLINE int +mmOffset(PMemBlock b) +{ + return b->ofs; +} +#endif + + + +/** * input: total size in bytes * return: a heap pointer if OK, NULL if error */ -memHeap_t *mmInit( int ofs, int size ); +extern memHeap_t *mmInit(int ofs, int 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 @@ -61,22 +85,31 @@ memHeap_t *mmInit( int ofs, int size ); * startSearch = linear offset from start of heap to begin search * return: pointer to the allocated block, 0 if error */ -PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, - int startSearch ); +extern PMemBlock mmAllocMem(memHeap_t *heap, int size, int align2, + int startSearch); -/* +/** * Free block starts at offset * input: pointer to a block * return: 0 if OK, -1 if error */ -int mmFreeMem( PMemBlock b ); +extern int mmFreeMem(PMemBlock b); -/* +/** + * Free block starts at offset + * input: pointer to a heap, start offset + * return: pointer to a block + */ +extern PMemBlock mmFindBlock(memHeap_t *heap, int start); + +/** * destroy MM */ -void mmDestroy( memHeap_t *mmInit ); +extern void mmDestroy(memHeap_t *mmInit); -/* For debuging purpose. */ -void mmDumpMemInfo( memHeap_t *mmInit ); +/** + * For debuging purpose. + */ +extern void mmDumpMemInfo(const memHeap_t *mmInit); #endif diff --git a/src/mesa/sources b/src/mesa/sources index 937405474db..48c3ab543b0 100644 --- a/src/mesa/sources +++ b/src/mesa/sources @@ -22,6 +22,7 @@ MAIN_SOURCES = \ main/enable.c \ main/enums.c \ main/eval.c \ + main/execmem.c \ main/extensions.c \ main/fbobject.c \ main/feedback.c \ @@ -37,6 +38,7 @@ MAIN_SOURCES = \ main/light.c \ main/lines.c \ main/matrix.c \ + main/mm.c \ main/occlude.c \ main/pixel.c \ main/points.c \ diff --git a/src/mesa/x86/rtasm/x86sse.c b/src/mesa/x86/rtasm/x86sse.c index adc7126801d..0c9ffe25fa2 100644 --- a/src/mesa/x86/rtasm/x86sse.c +++ b/src/mesa/x86/rtasm/x86sse.c @@ -1,5 +1,6 @@ #if defined(USE_X86_ASM) +#include "imports.h" #include "x86sse.h" #define DISASSEM 0 @@ -970,13 +971,13 @@ struct x86_reg x86_fn_arg( struct x86_function *p, void x86_init_func( struct x86_function *p ) { - p->store = malloc(1024); + p->store = _mesa_exec_malloc(1024); p->csr = p->store; } void x86_release_func( struct x86_function *p ) { - free(p->store); + _mesa_exec_free(p->store); } |