summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2005-10-18 13:29:59 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2005-10-18 13:29:59 +0000
commit005469005df6ba5f80e382d5371c6d069c27738b (patch)
tree3724212c691417d4dc08213d02b217d346cb25c3 /src
parent05e1a49ab4b0d34aba4bdf55ed7ffe5b6d4411f8 (diff)
Add _mesa_exec_malloc() and _mesa_exec_free() for allocating
executable memory. Based on Thomas Hellstrom's patch. TODO: glapi.c also needs this, but cannot access this code.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/Makefile.template1
-rw-r--r--src/mesa/drivers/dri/r200/r200_vtxfmt.c2
-rw-r--r--src/mesa/drivers/dri/r200/r200_vtxfmt.h2
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_vtxfmt.c2
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_vtxfmt.h2
-rw-r--r--src/mesa/main/execmem.c83
-rw-r--r--src/mesa/main/imports.h9
-rw-r--r--src/mesa/main/mm.c (renamed from src/mesa/drivers/dri/common/mm.c)15
-rw-r--r--src/mesa/main/mm.h (renamed from src/mesa/drivers/dri/common/mm.h)7
-rw-r--r--src/mesa/sources2
-rw-r--r--src/mesa/x86/rtasm/x86sse.c4
11 files changed, 122 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template
index 7c217f3d1d..35f7fd8a12 100644
--- a/src/mesa/drivers/dri/Makefile.template
+++ b/src/mesa/drivers/dri/Makefile.template
@@ -4,7 +4,6 @@ MESA_MODULES = $(TOP)/src/mesa/libmesa.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 d9af6bf5f8..61a757c870 100644
--- a/src/mesa/drivers/dri/r200/r200_vtxfmt.c
+++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.c
@@ -1172,7 +1172,7 @@ static void free_funcs( struct dynfn *l )
struct dynfn *f, *tmp;
foreach_s (f, tmp, l) {
remove_from_list( f );
- ALIGN_FREE( f->code );
+ _mesa_exec_free( f->code );
FREE( f );
}
}
diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt.h b/src/mesa/drivers/dri/r200/r200_vtxfmt.h
index 82cbda2742..32a21c4897 100644
--- a/src/mesa/drivers/dri/r200/r200_vtxfmt.h
+++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.h
@@ -59,7 +59,7 @@ do { \
insert_at_head( &CACHE, dfn ); \
dfn->key[0] = key[0]; \
dfn->key[1] = key[1]; \
- dfn->code = ALIGN_MALLOC( end - start, 16 ); \
+ dfn->code = _mesa_exec_malloc( end - start ); \
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 c734ab8d5a..537a1c0352 100644
--- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c
+++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c
@@ -1038,7 +1038,7 @@ static void free_funcs( struct dynfn *l )
struct dynfn *f, *tmp;
foreach_s (f, tmp, l) {
remove_from_list( f );
- ALIGN_FREE( f->code );
+ _mesa_exec_free( f->code );
FREE( f );
}
}
diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h
index 950d530ae5..a7d5b8334d 100644
--- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h
+++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h
@@ -56,7 +56,7 @@ do { \
char *end = (char *)&FUNC##_end; \
insert_at_head( &CACHE, dfn ); \
dfn->key = key; \
- dfn->code = ALIGN_MALLOC( end - start, 16 ); \
+ dfn->code = _mesa_exec_malloc( end - start ); \
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 0000000000..17ad06c90a
--- /dev/null
+++ b/src/mesa/main/execmem.c
@@ -0,0 +1,83 @@
+#include "imports.h"
+#include "glthread.h"
+
+
+
+#ifdef __linux__
+
+#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
+
+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 56ba114d9a..2484933025 100644
--- a/src/mesa/main/imports.h
+++ b/src/mesa/main/imports.h
@@ -723,6 +723,15 @@ _mesa_exit( int status );
extern void
_mesa_init_default_imports( __GLimports *imports, void *driverCtx );
+/* Allocate executable memory for codegen:
+ */
+extern void *
+_mesa_exec_malloc( GLuint size );
+
+extern void
+_mesa_exec_free( void *addr );
+
+
#ifdef __cplusplus
}
diff --git a/src/mesa/drivers/dri/common/mm.c b/src/mesa/main/mm.c
index 5781d9936c..14563b2591 100644
--- a/src/mesa/drivers/dri/common/mm.c
+++ b/src/mesa/main/mm.c
@@ -136,6 +136,21 @@ PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
return 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)
{
if (p->free && p->next && p->next->free) {
diff --git a/src/mesa/drivers/dri/common/mm.h b/src/mesa/main/mm.h
index 176910d70b..83a4ac8c74 100644
--- a/src/mesa/drivers/dri/common/mm.h
+++ b/src/mesa/main/mm.h
@@ -72,6 +72,13 @@ PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2,
int mmFreeMem( PMemBlock b );
/*
+ * Free block starts at offset
+ * input: pointer to a heap, start offset
+ * return: pointer to a block
+ */
+PMemBlock mmFindBlock( memHeap_t *heap, int start);
+
+/*
* destroy MM
*/
void mmDestroy( memHeap_t *mmInit );
diff --git a/src/mesa/sources b/src/mesa/sources
index 5d7df41789..8b2819b0e7 100644
--- a/src/mesa/sources
+++ b/src/mesa/sources
@@ -21,6 +21,7 @@ MAIN_SOURCES = \
main/enable.c \
main/enums.c \
main/eval.c \
+ main/execmem.c \
main/extensions.c \
main/fbobject.c \
main/feedback.c \
@@ -36,6 +37,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 40ffc03204..0c9ffe25fa 100644
--- a/src/mesa/x86/rtasm/x86sse.c
+++ b/src/mesa/x86/rtasm/x86sse.c
@@ -971,13 +971,13 @@ struct x86_reg x86_fn_arg( struct x86_function *p,
void x86_init_func( struct x86_function *p )
{
- p->store = _mesa_malloc(1024);
+ p->store = _mesa_exec_malloc(1024);
p->csr = p->store;
}
void x86_release_func( struct x86_function *p )
{
- _mesa_free(p->store);
+ _mesa_exec_free(p->store);
}