Add _mesa_exec_malloc() and _mesa_exec_free() for allocating
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 18 Oct 2005 13:29:59 +0000 (13:29 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 18 Oct 2005 13:29:59 +0000 (13:29 +0000)
executable memory.  Based on Thomas Hellstrom's patch.
TODO: glapi.c also needs this, but cannot access this code.

13 files changed:
src/mesa/drivers/dri/Makefile.template
src/mesa/drivers/dri/common/mm.c [deleted file]
src/mesa/drivers/dri/common/mm.h [deleted file]
src/mesa/drivers/dri/r200/r200_vtxfmt.c
src/mesa/drivers/dri/r200/r200_vtxfmt.h
src/mesa/drivers/dri/radeon/radeon_vtxfmt.c
src/mesa/drivers/dri/radeon/radeon_vtxfmt.h
src/mesa/main/execmem.c [new file with mode: 0644]
src/mesa/main/imports.h
src/mesa/main/mm.c [new file with mode: 0644]
src/mesa/main/mm.h [new file with mode: 0644]
src/mesa/sources
src/mesa/x86/rtasm/x86sse.c

index 7c217f3d1d7943db10d36aaab63bdc29ca9016c7..35f7fd8a12994254dcd0bbbbb55a1833ff39fc7e 100644 (file)
@@ -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/common/mm.c b/src/mesa/drivers/dri/common/mm.c
deleted file mode 100644 (file)
index 5781d99..0000000
+++ /dev/null
@@ -1,196 +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.
- *
- */
-/* $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 )
-{
-   TMemBlock *p;
-
-   fprintf(stderr, "Memory heap %p:\n", (void *)heap);
-   if (heap == 0) {
-      fprintf(stderr, "  heap == 0\n");
-   } else {
-      p = (TMemBlock *)heap;
-      while (p) {
-        fprintf(stderr, "  Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size,
-                p->free ? '.':'U',
-                p->reserved ? 'R':'.');
-        p = p->next;
-      }
-   }
-   fprintf(stderr, "End of memory blocks\n");
-}
-
-memHeap_t *mmInit(int ofs,
-                 int size)
-{
-   PMemBlock blocks;
-  
-   if (size <= 0) {
-      return NULL;
-   }
-   blocks = (TMemBlock *) calloc(1,sizeof(TMemBlock));
-   if (blocks) {
-      blocks->ofs = ofs;
-      blocks->size = size;
-      blocks->free = 1;
-      return (memHeap_t *)blocks;
-   } else
-      return NULL;
-}
-
-
-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));
-      if (!newblock)
-        return NULL;
-      newblock->ofs = startofs;
-      newblock->size = p->size - (startofs - p->ofs);
-      newblock->free = 1;
-      newblock->next = p->next;
-      p->size -= newblock->size;
-      p->next = newblock;
-      p = newblock;
-   }
-
-   /* break right */
-   if (size < p->size) {
-      newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock));
-      if (!newblock)
-        return NULL;
-      newblock->ofs = startofs + size;
-      newblock->size = p->size - size;
-      newblock->free = 1;
-      newblock->next = p->next;
-      p->size = size;
-      p->next = newblock;
-   }
-
-   /* p = middle block */
-   p->align = alignment;
-   p->free = 0;
-   p->reserved = reserved;
-   return p;
-}
-
-PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
-{
-   int mask,startofs,endofs;
-   TMemBlock *p;
-
-   if (!heap || align2 < 0 || size <= 0)
-      return NULL;
-   mask = (1 << align2)-1;
-   startofs = 0;
-   p = (TMemBlock *)heap;
-   while (p) {
-      if ((p)->free) {
-        startofs = (p->ofs + mask) & ~mask;
-        if ( startofs < startSearch ) {
-           startofs = startSearch;
-        }
-        endofs = startofs+size;
-        if (endofs <= (p->ofs+p->size))
-           break;
-      }
-      p = p->next;
-   }
-   if (!p)
-      return NULL;
-   p = SliceBlock(p,startofs,size,0,mask+1);
-   p->heap = heap;
-   return p;
-}
-
-static __inline__ int Join2Blocks(TMemBlock *p)
-{
-   if (p->free && p->next && p->next->free) {
-      TMemBlock *q = p->next;
-      p->size += q->size;
-      p->next = q->next;
-      free(q);
-      return 1;
-   }
-   return 0;
-}
-
-int mmFreeMem(PMemBlock b)
-{
-   TMemBlock *p,*prev;
-
-   if (!b)
-      return 0;
-   if (!b->heap) {
-      fprintf(stderr, "no heap\n");
-      return -1;
-   }
-   p = b->heap;
-   prev = NULL;
-   while (p && p != b) {
-      prev = p;
-      p = p->next;
-   }
-   if (!p || p->free || p->reserved) {
-      if (!p)
-        fprintf(stderr, "block not found in heap\n");
-      else if (p->free)
-        fprintf(stderr, "block already free\n");
-      else
-        fprintf(stderr, "block is reserved\n");
-      return -1;
-   }
-   p->free = 1;
-   Join2Blocks(p);
-   if (prev)
-      Join2Blocks(prev);
-   return 0;
-}
-
-
-void mmDestroy(memHeap_t *heap)
-{
-   TMemBlock *p,*q;
-
-   if (!heap)
-      return;
-   p = (TMemBlock *)heap;
-   while (p) {
-      q = p->next;
-      free(p);
-      p = q;
-   }
-}
diff --git a/src/mesa/drivers/dri/common/mm.h b/src/mesa/drivers/dri/common/mm.h
deleted file mode 100644 (file)
index 176910d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * GLX Hardware Device Driver common code
- * Copyright (C) 1999 Keith Whitwell
- *
- * 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.
- *
- */
-
-#ifndef MM_INC
-#define MM_INC
-
-struct mem_block_t {
-  struct mem_block_t *next;
-  struct mem_block_t *heap;
-  int ofs,size;
-  int align;
-  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; }
-
-/* 
- * input: total size in bytes
- * return: a heap pointer if OK, NULL if error
- */
-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
- * 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
- */
-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 );
-
-/*
- * destroy MM
- */
-void mmDestroy( memHeap_t *mmInit );
-
-/* For debuging purpose. */
-void mmDumpMemInfo( memHeap_t *mmInit );
-
-#endif
index d9af6bf5f85951da298dbeee144fa04660c06ce6..61a757c870d78d538502654f21ff38c5d3f7f90e 100644 (file)
@@ -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 );
    }
 }
index 82cbda2742b32e213dedd17f053279288d41180a..32a21c48977f8117bb97eeb6a2f448699e2efb42 100644 (file)
@@ -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 )
index c734ab8d5ab100d9795c3b1ef1eb340e739ea567..537a1c03520bdba4dae30fbde834a76977cc3995 100644 (file)
@@ -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 );
    }
 }
index 950d530ae5579ed17dfa4166f57552b139ebd527..a7d5b8334df430eb8c749e3f5efe2a1e8a36d26d 100644 (file)
@@ -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 (file)
index 0000000..17ad06c
--- /dev/null
@@ -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
index 56ba114d9aac7029052ecc2e82e9280b011f75d2..248493302540330fe2961e1ec55acfbb01577ca0 100644 (file)
@@ -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/main/mm.c b/src/mesa/main/mm.c
new file mode 100644 (file)
index 0000000..14563b2
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * 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.
+ *
+ */
+/* $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 )
+{
+   TMemBlock *p;
+
+   fprintf(stderr, "Memory heap %p:\n", (void *)heap);
+   if (heap == 0) {
+      fprintf(stderr, "  heap == 0\n");
+   } else {
+      p = (TMemBlock *)heap;
+      while (p) {
+        fprintf(stderr, "  Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size,
+                p->free ? '.':'U',
+                p->reserved ? 'R':'.');
+        p = p->next;
+      }
+   }
+   fprintf(stderr, "End of memory blocks\n");
+}
+
+memHeap_t *mmInit(int ofs,
+                 int size)
+{
+   PMemBlock blocks;
+  
+   if (size <= 0) {
+      return NULL;
+   }
+   blocks = (TMemBlock *) calloc(1,sizeof(TMemBlock));
+   if (blocks) {
+      blocks->ofs = ofs;
+      blocks->size = size;
+      blocks->free = 1;
+      return (memHeap_t *)blocks;
+   } else
+      return NULL;
+}
+
+
+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));
+      if (!newblock)
+        return NULL;
+      newblock->ofs = startofs;
+      newblock->size = p->size - (startofs - p->ofs);
+      newblock->free = 1;
+      newblock->next = p->next;
+      p->size -= newblock->size;
+      p->next = newblock;
+      p = newblock;
+   }
+
+   /* break right */
+   if (size < p->size) {
+      newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock));
+      if (!newblock)
+        return NULL;
+      newblock->ofs = startofs + size;
+      newblock->size = p->size - size;
+      newblock->free = 1;
+      newblock->next = p->next;
+      p->size = size;
+      p->next = newblock;
+   }
+
+   /* p = middle block */
+   p->align = alignment;
+   p->free = 0;
+   p->reserved = reserved;
+   return p;
+}
+
+PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
+{
+   int mask,startofs,endofs;
+   TMemBlock *p;
+
+   if (!heap || align2 < 0 || size <= 0)
+      return NULL;
+   mask = (1 << align2)-1;
+   startofs = 0;
+   p = (TMemBlock *)heap;
+   while (p) {
+      if ((p)->free) {
+        startofs = (p->ofs + mask) & ~mask;
+        if ( startofs < startSearch ) {
+           startofs = startSearch;
+        }
+        endofs = startofs+size;
+        if (endofs <= (p->ofs+p->size))
+           break;
+      }
+      p = p->next;
+   }
+   if (!p)
+      return NULL;
+   p = SliceBlock(p,startofs,size,0,mask+1);
+   p->heap = heap;
+   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) {
+      TMemBlock *q = p->next;
+      p->size += q->size;
+      p->next = q->next;
+      free(q);
+      return 1;
+   }
+   return 0;
+}
+
+int mmFreeMem(PMemBlock b)
+{
+   TMemBlock *p,*prev;
+
+   if (!b)
+      return 0;
+   if (!b->heap) {
+      fprintf(stderr, "no heap\n");
+      return -1;
+   }
+   p = b->heap;
+   prev = NULL;
+   while (p && p != b) {
+      prev = p;
+      p = p->next;
+   }
+   if (!p || p->free || p->reserved) {
+      if (!p)
+        fprintf(stderr, "block not found in heap\n");
+      else if (p->free)
+        fprintf(stderr, "block already free\n");
+      else
+        fprintf(stderr, "block is reserved\n");
+      return -1;
+   }
+   p->free = 1;
+   Join2Blocks(p);
+   if (prev)
+      Join2Blocks(prev);
+   return 0;
+}
+
+
+void mmDestroy(memHeap_t *heap)
+{
+   TMemBlock *p,*q;
+
+   if (!heap)
+      return;
+   p = (TMemBlock *)heap;
+   while (p) {
+      q = p->next;
+      free(p);
+      p = q;
+   }
+}
diff --git a/src/mesa/main/mm.h b/src/mesa/main/mm.h
new file mode 100644 (file)
index 0000000..83a4ac8
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * GLX Hardware Device Driver common code
+ * Copyright (C) 1999 Keith Whitwell
+ *
+ * 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.
+ *
+ */
+
+#ifndef MM_INC
+#define MM_INC
+
+struct mem_block_t {
+  struct mem_block_t *next;
+  struct mem_block_t *heap;
+  int ofs,size;
+  int align;
+  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; }
+
+/* 
+ * input: total size in bytes
+ * return: a heap pointer if OK, NULL if error
+ */
+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
+ * 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
+ */
+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 );
+
+/*
+ * 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 );
+
+/* For debuging purpose. */
+void mmDumpMemInfo( memHeap_t *mmInit );
+
+#endif
index 5d7df4178934b5e918291e6987f0a7231e3bfe86..8b2819b0e7e19230a6acd4c025e2ab55dbbf0310 100644 (file)
@@ -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 \
index 40ffc03204e20c253fed209cf22b46c9695aa776..0c9ffe25fa29556c9251a6c0fe71736ab7d2ad21 100644 (file)
@@ -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);
 }