diff options
Diffstat (limited to 'src/gallium')
18 files changed, 207 insertions, 32 deletions
| diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index f22ba40824..68508f24de 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -80,6 +80,10 @@ struct cso_context {  }; +static void +free_framebuffer_state(struct pipe_framebuffer_state *fb); + +  static boolean delete_blend_state(struct cso_context *ctx, void *state)  {     struct cso_blend *cso = (struct cso_blend *)state; @@ -252,6 +256,9 @@ void cso_release_all( struct cso_context *ctx )        pipe_texture_reference(&ctx->textures_saved[i], NULL);     } +   free_framebuffer_state(&ctx->fb); +   free_framebuffer_state(&ctx->fb_saved); +     if (ctx->cache) {        cso_cache_delete( ctx->cache );        ctx->cache = NULL; @@ -765,12 +772,42 @@ void cso_restore_vertex_shader(struct cso_context *ctx)  } +/** + * Copy framebuffer state from src to dst with refcounting of surfaces. + */ +static void +copy_framebuffer_state(struct pipe_framebuffer_state *dst, +                       const struct pipe_framebuffer_state *src) +{ +   uint i; + +   dst->width = src->width; +   dst->height = src->height; +   dst->num_cbufs = src->num_cbufs; +   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { +      pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]); +   } +   pipe_surface_reference(&dst->zsbuf, src->zsbuf); +} + + +static void +free_framebuffer_state(struct pipe_framebuffer_state *fb) +{ +   uint i; + +   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { +      pipe_surface_reference(&fb->cbufs[i], NULL); +   } +   pipe_surface_reference(&fb->zsbuf, NULL); +} +  enum pipe_error cso_set_framebuffer(struct cso_context *ctx,                                      const struct pipe_framebuffer_state *fb)  {     if (memcmp(&ctx->fb, fb, sizeof(*fb)) != 0) { -      ctx->fb = *fb; +      copy_framebuffer_state(&ctx->fb, fb);        ctx->pipe->set_framebuffer_state(ctx->pipe, fb);     }     return PIPE_OK; @@ -778,14 +815,15 @@ enum pipe_error cso_set_framebuffer(struct cso_context *ctx,  void cso_save_framebuffer(struct cso_context *ctx)  { -   ctx->fb_saved = ctx->fb; +   copy_framebuffer_state(&ctx->fb_saved, &ctx->fb);  }  void cso_restore_framebuffer(struct cso_context *ctx)  {     if (memcmp(&ctx->fb, &ctx->fb_saved, sizeof(ctx->fb))) { -      ctx->fb = ctx->fb_saved; +      copy_framebuffer_state(&ctx->fb, &ctx->fb_saved);        ctx->pipe->set_framebuffer_state(ctx->pipe, &ctx->fb); +      free_framebuffer_state(&ctx->fb_saved);     }  } diff --git a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c index 4f1326053d..e1af9e56a2 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c +++ b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c @@ -222,8 +222,8 @@ static void widepoint_first_point( struct draw_stage *stage,        /* find fragment shader PointCoord/Fog input */        wide->point_coord_fs_input = 0; /* XXX fix this! */ -      /* setup extra vp output */ -      draw->extra_vp_outputs.semantic_name = TGSI_SEMANTIC_FOG; +      /* setup extra vp output (point coord implemented as a texcoord) */ +      draw->extra_vp_outputs.semantic_name = TGSI_SEMANTIC_GENERIC;        draw->extra_vp_outputs.semantic_index = 0;        draw->extra_vp_outputs.slot = draw->vs.num_vs_outputs;     } diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c b/src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c index 20fc87b39d..1bf22a2ec0 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c @@ -129,7 +129,7 @@ pb_malloc_buffer_create(size_t size,  static struct pb_buffer * -pb_malloc_buffer_create_buffer(struct pb_manager *mgr,  +pb_malloc_bufmgr_create_buffer(struct pb_manager *mgr,                                  size_t size,                                 const struct pb_desc *desc)   { @@ -138,6 +138,13 @@ pb_malloc_buffer_create_buffer(struct pb_manager *mgr,  static void +pb_malloc_bufmgr_flush(struct pb_manager *mgr)  +{ +   /* No-op */ +} + + +static void  pb_malloc_bufmgr_destroy(struct pb_manager *mgr)   {     /* No-op */ @@ -146,8 +153,9 @@ pb_malloc_bufmgr_destroy(struct pb_manager *mgr)  static struct pb_manager   pb_malloc_bufmgr = { -   pb_malloc_buffer_create_buffer, -   pb_malloc_bufmgr_destroy +   pb_malloc_bufmgr_destroy, +   pb_malloc_bufmgr_create_buffer, +   pb_malloc_bufmgr_flush  }; diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h index 32867029ee..cafbee045a 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h @@ -69,13 +69,22 @@ struct pipe_winsys;   */  struct pb_manager  { +   void +   (*destroy)( struct pb_manager *mgr ); +     struct pb_buffer *     (*create_buffer)( struct pb_manager *mgr,   	             size_t size,  	             const struct pb_desc *desc); +   /** +    * Flush all temporary-held buffers. +    *  +    * Used mostly to aid debugging memory issues or to clean up resources when  +    * the drivers are long lived. +    */     void -   (*destroy)( struct pb_manager *mgr ); +   (*flush)( struct pb_manager *mgr );  }; @@ -153,9 +162,6 @@ struct pb_manager *  pb_cache_manager_create(struct pb_manager *provider,                        	unsigned usecs);  -void -pb_cache_flush(struct pb_manager *mgr); -  /**    * Fenced buffer manager. diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_alt.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_alt.c index 2afaeafa1a..c956924cc7 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_alt.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_alt.c @@ -76,6 +76,21 @@ pb_alt_manager_create_buffer(struct pb_manager *_mgr,  static void +pb_alt_manager_flush(struct pb_manager *_mgr) +{ +   struct pb_alt_manager *mgr = pb_alt_manager(_mgr); +    +   assert(mgr->provider1->flush); +   if(mgr->provider1->flush) +      mgr->provider1->flush(mgr->provider1); +    +   assert(mgr->provider2->flush); +   if(mgr->provider2->flush) +      mgr->provider2->flush(mgr->provider2); +} + + +static void  pb_alt_manager_destroy(struct pb_manager *mgr)  {     FREE(mgr); @@ -97,6 +112,7 @@ pb_alt_manager_create(struct pb_manager *provider1,     mgr->base.destroy = pb_alt_manager_destroy;     mgr->base.create_buffer = pb_alt_manager_create_buffer; +   mgr->base.flush = pb_alt_manager_flush;     mgr->provider1 = provider1;     mgr->provider2 = provider2; diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c index 1ec422fb19..8f118874ec 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c @@ -306,8 +306,8 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,  } -void -pb_cache_flush(struct pb_manager *_mgr) +static void +pb_cache_manager_flush(struct pb_manager *_mgr)  {     struct pb_cache_manager *mgr = pb_cache_manager(_mgr);     struct list_head *curr, *next; @@ -323,13 +323,17 @@ pb_cache_flush(struct pb_manager *_mgr)        next = curr->next;     }     pipe_mutex_unlock(mgr->mutex); +    +   assert(mgr->provider->flush); +   if(mgr->provider->flush) +      mgr->provider->flush(mgr->provider);  }  static void  pb_cache_manager_destroy(struct pb_manager *mgr)  { -   pb_cache_flush(mgr); +   pb_cache_manager_flush(mgr);     FREE(mgr);  } @@ -349,6 +353,7 @@ pb_cache_manager_create(struct pb_manager *provider,     mgr->base.destroy = pb_cache_manager_destroy;     mgr->base.create_buffer = pb_cache_manager_create_buffer; +   mgr->base.flush = pb_cache_manager_flush;     mgr->provider = provider;     mgr->usecs = usecs;     LIST_INITHEAD(&mgr->delayed); diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c index 5f1ed3e5a8..1675e6e182 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c @@ -314,6 +314,16 @@ pb_debug_manager_create_buffer(struct pb_manager *_mgr,  static void +pb_debug_manager_flush(struct pb_manager *_mgr) +{ +   struct pb_debug_manager *mgr = pb_debug_manager(_mgr); +   assert(mgr->provider->flush); +   if(mgr->provider->flush) +      mgr->provider->flush(mgr->provider); +} + + +static void  pb_debug_manager_destroy(struct pb_manager *_mgr)  {     struct pb_debug_manager *mgr = pb_debug_manager(_mgr); @@ -336,6 +346,7 @@ pb_debug_manager_create(struct pb_manager *provider, size_t band_size)     mgr->base.destroy = pb_debug_manager_destroy;     mgr->base.create_buffer = pb_debug_manager_create_buffer; +   mgr->base.flush = pb_debug_manager_flush;     mgr->provider = provider;     mgr->band_size = band_size; diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c index 8fc63ce648..633ee70a75 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c @@ -95,6 +95,19 @@ fenced_bufmgr_create_buffer(struct pb_manager *mgr,  static void +fenced_bufmgr_flush(struct pb_manager *mgr) +{ +   struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr); + +   fenced_buffer_list_check_free(fenced_mgr->fenced_list, TRUE); + +   assert(fenced_mgr->provider->flush); +   if(fenced_mgr->provider->flush) +      fenced_mgr->provider->flush(fenced_mgr->provider); +} + + +static void  fenced_bufmgr_destroy(struct pb_manager *mgr)  {     struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr); @@ -123,6 +136,7 @@ fenced_bufmgr_create(struct pb_manager *provider,     fenced_mgr->base.destroy = fenced_bufmgr_destroy;     fenced_mgr->base.create_buffer = fenced_bufmgr_create_buffer; +   fenced_mgr->base.flush = fenced_bufmgr_flush;     fenced_mgr->provider = provider;     fenced_mgr->fenced_list = fenced_buffer_list_create(winsys); diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c index e8c7f8e1f8..fe80ca30ee 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c @@ -200,6 +200,13 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr,  static void +mm_bufmgr_flush(struct pb_manager *mgr) +{ +   /* No-op */ +} + + +static void  mm_bufmgr_destroy(struct pb_manager *mgr)  {     struct mm_pb_manager *mm = mm_pb_manager(mgr); @@ -230,8 +237,9 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,     if (!mm)        return NULL; -   mm->base.create_buffer = mm_bufmgr_create_buffer;     mm->base.destroy = mm_bufmgr_destroy; +   mm->base.create_buffer = mm_bufmgr_create_buffer; +   mm->base.flush = mm_bufmgr_flush;     mm->size = size;     mm->align2 = align2; /* 64-byte alignment */ diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c index 3ef72c5bbb..61ac291ed7 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c @@ -203,6 +203,13 @@ pool_bufmgr_create_buffer(struct pb_manager *mgr,  static void +pool_bufmgr_flush(struct pb_manager *mgr) +{ +   /* No-op */ +} + + +static void  pool_bufmgr_destroy(struct pb_manager *mgr)  {     struct pool_pb_manager *pool = pool_pb_manager(mgr); @@ -238,6 +245,7 @@ pool_bufmgr_create(struct pb_manager *provider,     pool->base.destroy = pool_bufmgr_destroy;     pool->base.create_buffer = pool_bufmgr_create_buffer; +   pool->base.flush = pool_bufmgr_flush;     LIST_INITHEAD(&pool->free); diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c index 8698c4cff6..2a80154920 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c @@ -407,6 +407,17 @@ pb_slab_manager_create_buffer(struct pb_manager *_mgr,  static void +pb_slab_manager_flush(struct pb_manager *_mgr) +{ +   struct pb_slab_manager *mgr = pb_slab_manager(_mgr); + +   assert(mgr->provider->flush); +   if(mgr->provider->flush) +      mgr->provider->flush(mgr->provider); +} + + +static void  pb_slab_manager_destroy(struct pb_manager *_mgr)  {     struct pb_slab_manager *mgr = pb_slab_manager(_mgr); @@ -430,6 +441,7 @@ pb_slab_manager_create(struct pb_manager *provider,     mgr->base.destroy = pb_slab_manager_destroy;     mgr->base.create_buffer = pb_slab_manager_create_buffer; +   mgr->base.flush = pb_slab_manager_flush;     mgr->provider = provider;     mgr->bufSize = bufSize; @@ -466,6 +478,19 @@ pb_slab_range_manager_create_buffer(struct pb_manager *_mgr,  static void +pb_slab_range_manager_flush(struct pb_manager *_mgr) +{ +   struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr); + +   /* Individual slabs don't hold any temporary buffers so no need to call them */ +    +   assert(mgr->provider->flush); +   if(mgr->provider->flush) +      mgr->provider->flush(mgr->provider); +} + + +static void  pb_slab_range_manager_destroy(struct pb_manager *_mgr)  {     struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr); @@ -499,6 +524,7 @@ pb_slab_range_manager_create(struct pb_manager *provider,     mgr->base.destroy = pb_slab_range_manager_destroy;     mgr->base.create_buffer = pb_slab_range_manager_create_buffer; +   mgr->base.flush = pb_slab_range_manager_flush;     mgr->provider = provider;     mgr->minBufSize = minBufSize; diff --git a/src/gallium/auxiliary/tgsi/Makefile b/src/gallium/auxiliary/tgsi/Makefile index 806a2bd4c5..c7155a9316 100644 --- a/src/gallium/auxiliary/tgsi/Makefile +++ b/src/gallium/auxiliary/tgsi/Makefile @@ -4,6 +4,7 @@ include $(TOP)/configs/current  LIBNAME = tgsi  C_SOURCES = \ +	tgsi_sanity.c \  	tgsi_build.c \  	tgsi_dump.c \  	tgsi_exec.c \ @@ -12,6 +13,7 @@ C_SOURCES = \  	tgsi_parse.c \  	tgsi_scan.c \  	tgsi_sse2.c \ +	tgsi_text.c \  	tgsi_transform.c \  	tgsi_util.c diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c index afc8ffa553..3177f54952 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c @@ -68,6 +68,7 @@ dump_enum(  #define CHR(C)          ctx->printf( ctx, "%c", C )  #define UIX(I)          ctx->printf( ctx, "0x%x", I )  #define UID(I)          ctx->printf( ctx, "%u", I ) +#define INSTID(I)          ctx->printf( ctx, "% 3u", I )  #define SID(I)          ctx->printf( ctx, "%d", I )  #define FLT(F)          ctx->printf( ctx, "%10.4f", F )  #define ENM(E,ENUMS)    dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) ) @@ -315,8 +316,8 @@ iter_instruction(     uint i;     boolean first_reg = TRUE; -   UID( instno ); -   CHR( ':' ); +   INSTID( instno ); +   TXT( ": " );     TXT( tgsi_get_opcode_info( inst->Instruction.Opcode )->mnemonic );     switch (inst->Instruction.Saturate) { diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c index a4899cd4c2..68c7a6b7f5 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info.c +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c @@ -69,7 +69,7 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =     { 1, 1, 0, 0, "COS" },     { 1, 1, 0, 0, "DDX" },     { 1, 1, 0, 0, "DDY" }, -   { 0, 1, 0, 0, "KILP" }, +   { 0, 0, 0, 0, "KILP" },     { 1, 1, 0, 0, "PK2H" },     { 1, 1, 0, 0, "PK2US" },     { 1, 1, 0, 0, "PK4B" }, @@ -146,7 +146,7 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =     { 0, 1, 0, 0, "CALLNZ" },     { 0, 1, 0, 0, "IFC" },     { 0, 1, 0, 0, "BREAKC" }, -   { 0, 0, 0, 0, "KIL" }, +   { 0, 1, 0, 0, "KIL" },     { 0, 0, 0, 0, "END" },     { 1, 1, 0, 0, "SWZ" }  }; diff --git a/src/gallium/auxiliary/tgsi/tgsi_sanity.c b/src/gallium/auxiliary/tgsi/tgsi_sanity.c index c659027296..11659247c0 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_sanity.c +++ b/src/gallium/auxiliary/tgsi/tgsi_sanity.c @@ -152,6 +152,12 @@ check_register_usage(  {     if (!check_file_name( ctx, file ))        return FALSE; + +   if (index < 0 || index > MAX_REGISTERS) { +      report_error( ctx, "%s[%i]: Invalid index %s", file_names[file], index, name ); +      return FALSE; +   } +     if (indirect_access) {        if (!is_any_register_declared( ctx, file ))           report_error( ctx, "%s: Undeclared %s register", file_names[file], name ); @@ -174,12 +180,10 @@ iter_instruction(     const struct tgsi_opcode_info *info;     uint i; -   /* There must be no other instructions after END. -    */ -   if (ctx->index_of_END != ~0) { -      report_error( ctx, "Unexpected instruction after END" ); -   } -   else if (inst->Instruction.Opcode == TGSI_OPCODE_END) { +   if (inst->Instruction.Opcode == TGSI_OPCODE_END) { +      if (ctx->index_of_END != ~0) { +         report_error( ctx, "Too many END instructions" ); +      }        ctx->index_of_END = ctx->num_instructions;     } @@ -301,10 +305,10 @@ epilog(     struct sanity_check_ctx *ctx = (struct sanity_check_ctx *) iter;     uint file; -   /* There must be an END instruction at the end. +   /* There must be an END instruction somewhere.      */ -   if (ctx->index_of_END == ~0 || ctx->index_of_END != ctx->num_instructions - 1) { -      report_error( ctx, "Expected END at end of instruction sequence" ); +   if (ctx->index_of_END == ~0) { +      report_error( ctx, "Missing END instruction" );     }     /* Check if all declared registers were used. diff --git a/src/gallium/auxiliary/util/p_debug_mem.c b/src/gallium/auxiliary/util/p_debug_mem.c index ed18c6540e..9511479cbb 100644 --- a/src/gallium/auxiliary/util/p_debug_mem.c +++ b/src/gallium/auxiliary/util/p_debug_mem.c @@ -122,8 +122,12 @@ debug_malloc(const char *file, unsigned line, const char *function,     struct debug_memory_footer *ftr;     hdr = real_malloc(sizeof(*hdr) + size + sizeof(*ftr)); -   if(!hdr) +   if(!hdr) { +      debug_printf("%s:%u:%s: out of memory when trying to allocate %lu bytes\n", +                   file, line, function, +                   (long unsigned)size);        return NULL; +   }     hdr->no = last_no++;     hdr->file = file; @@ -219,8 +223,12 @@ debug_realloc(const char *file, unsigned line, const char *function,     /* alloc new */     new_hdr = real_malloc(sizeof(*new_hdr) + new_size + sizeof(*new_ftr)); -   if(!new_hdr) +   if(!new_hdr) { +      debug_printf("%s:%u:%s: out of memory when trying to allocate %lu bytes\n", +                   file, line, function, +                   (long unsigned)new_size);        return NULL; +   }     new_hdr->no = old_hdr->no;     new_hdr->file = old_hdr->file;     new_hdr->line = old_hdr->line; @@ -261,8 +269,19 @@ debug_memory_end(unsigned long start_no)     for (; entry != &list; entry = entry->prev) {        struct debug_memory_header *hdr;        void *ptr; +      struct debug_memory_footer *ftr; +        hdr = LIST_ENTRY(struct debug_memory_header, entry, head);        ptr = data_from_header(hdr); +      ftr = footer_from_header(hdr); + +      if(hdr->magic != DEBUG_MEMORY_MAGIC) { +         debug_printf("%s:%u:%s: bad or corrupted memory %p\n", +                      hdr->file, hdr->line, hdr->function, +                      ptr); +         debug_assert(0); +      } +        if((start_no <= hdr->no && hdr->no < last_no) ||  	 (last_no < start_no && (hdr->no < last_no || start_no <= hdr->no))) {  	 debug_printf("%s:%u:%s: %u bytes at %p not freed\n", @@ -270,7 +289,15 @@ debug_memory_end(unsigned long start_no)  		      hdr->size, ptr);  	 total_size += hdr->size;        } + +      if(ftr->magic != DEBUG_MEMORY_MAGIC) { +         debug_printf("%s:%u:%s: buffer overflow %p\n", +                      hdr->file, hdr->line, hdr->function, +                      ptr); +         debug_assert(0); +      }     } +     if(total_size) {        debug_printf("Total of %u KB of system memory apparently leaked\n",  		   (total_size + 1023)/1024); diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h index 0b10622ee7..196aeb28fa 100644 --- a/src/gallium/auxiliary/util/u_math.h +++ b/src/gallium/auxiliary/util/u_math.h @@ -40,6 +40,7 @@  #include "pipe/p_compiler.h" +#include "pipe/p_debug.h"  #ifdef __cplusplus diff --git a/src/gallium/drivers/trace/README b/src/gallium/drivers/trace/README index e7a2f12b02..f0e1cd596d 100644 --- a/src/gallium/drivers/trace/README +++ b/src/gallium/drivers/trace/README @@ -10,7 +10,7 @@ This directory contains a Gallium3D pipe driver which traces all incoming calls.  To build, invoke scons on the top dir as - scons statetrackers=mesa drivers=softpipe,i915simple,trace winsys=xlib + scons statetrackers=mesa drivers=softpipe,i965simple,trace winsys=xlib  = Usage = | 
