Attached is the patch with the modifications you suggested.
--Leif
On Mon, 3 Feb 2003, Ian Romanick wrote:
> Leif Delgass wrote:
>
> > It this looks OK, I will apply it to the branch.
>
> I've poked around with the patch, and it looks good. There are only two
> things that I would change. There should probably be a comment in
> texmem.h that explains the double-duty that tObj does. I think the
> meaning of t->tObj == NULL is important to document.
>
> I would also probably change printLocalLRU and printGlobalLRU to take a
> pointer to __FUNCTION__ and log that in their printfs. I remember
> making that change to the version in the r100 driver when I was first
> mucking with the texmem stuff. That proved very useful when I was
> trying to figure out how it all worked. :)
>
> Nice work!
>
>
>
> -------------------------------------------------------
> This SF.NET email is sponsored by:
> SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
> http://www.vasoftware.com
> _______________________________________________
> Dri-devel mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/dri-devel
>
--
Leif Delgass
http://www.retinalburn.net
Index: lib/GL/mesa/src/drv/common/texmem.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/common/Attic/texmem.c,v
retrieving revision 1.1.2.8
diff -u -r1.1.2.8 texmem.c
--- lib/GL/mesa/src/drv/common/texmem.c 27 Jan 2003 23:43:31 -0000 1.1.2.8
+++ lib/GL/mesa/src/drv/common/texmem.c 4 Feb 2003 16:46:53 -0000
@@ -119,12 +119,10 @@
static void resetGlobalLRU( driTexHeap * heap )
{
- driTexRegion * list = heap->global_regions;
+ drmTextureRegionPtr list = heap->global_regions;
unsigned sz = 1U << heap->logGranularity;
unsigned i;
- heap->local_age = ++heap->global_age[0];
-
for (i = 0 ; (i+1) * sz <= heap->size ; i++) {
list[i].prev = i-1;
list[i].next = i+1;
@@ -140,7 +138,76 @@
heap->global_age[0] = 0;
}
+/**
+ * Print out debugging information about the local texture LRU.
+ *
+ * \param heap Texture heap to be printed
+ */
+static void printLocalLRU( driTexHeap * heap, const char *callername )
+{
+ driTextureObject *t;
+ unsigned sz = 1U << heap->logGranularity;
+ fprintf( stderr, "%s in %s:\nLocal LRU, heap %d:\n",
+ __FUNCTION__, callername, heap->heapId );
+
+ foreach ( t, &heap->texture_objects ) {
+ if (!t->memBlock)
+ continue;
+ if (!t->tObj) {
+ fprintf( stderr, "Placeholder (%p) %d at 0x%x sz 0x%x\n",
+ t,
+ t->memBlock->ofs / sz,
+ t->memBlock->ofs,
+ t->memBlock->size );
+ } else {
+ fprintf( stderr, "Texture (%p) at 0x%x sz 0x%x\n",
+ t,
+ t->memBlock->ofs,
+ t->memBlock->size );
+ }
+ }
+ foreach ( t, heap->swapped_objects ) {
+ if (!t->tObj) {
+ fprintf( stderr, "Swapped Placeholder (%p)\n", t );
+ } else {
+ fprintf( stderr, "Swapped Texture (%p)\n", t );
+ }
+ }
+
+ fprintf( stderr, "\n" );
+}
+
+/**
+ * Print out debugging information about the global texture LRU.
+ *
+ * \param heap Texture heap to be printed
+ */
+static void printGlobalLRU( driTexHeap * heap, const char *callername )
+{
+ drmTextureRegionPtr list = heap->global_regions;
+ int i, j;
+
+ fprintf( stderr, "%s in %s:\nGlobal LRU, heap %d list %p:\n",
+ __FUNCTION__, callername, heap->heapId, list );
+
+ for ( i = 0, j = heap->nrRegions ; i < heap->nrRegions ; i++ ) {
+ fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n",
+ j, list[j].age, list[j].next, list[j].prev, list[j].in_use );
+ j = list[j].next;
+ if ( j == heap->nrRegions ) break;
+ }
+
+ if ( j != heap->nrRegions ) {
+ fprintf( stderr, "Loop detected in global LRU\n" );
+ for ( i = 0 ; i < heap->nrRegions ; i++ ) {
+ fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n",
+ i, list[i].age, list[i].next, list[i].prev, list[i].in_use );
+ }
+ }
+
+ fprintf( stderr, "\n" );
+}
/**
@@ -152,7 +219,7 @@
void driUpdateTextureLRU( driTextureObject * t )
{
driTexHeap * heap;
- driTexRegion * list;
+ drmTextureRegionPtr list;
unsigned shift;
unsigned start;
unsigned end;
@@ -194,6 +261,12 @@
list[(unsigned)list[heap->nrRegions].next].prev = i;
list[heap->nrRegions].next = i;
}
+
+ if ( 0 ) {
+ printGlobalLRU( heap, __FUNCTION__ );
+ printLocalLRU( heap, __FUNCTION__ );
+ }
+
}
}
@@ -326,7 +399,13 @@
}
else
{
- driDestroyTextureObject( t );
+ if ( in_use &&
+ offset == t->memBlock->ofs && size == t->memBlock->size ) {
+ /* Matching placeholder already exists */
+ return;
+ } else {
+ driDestroyTextureObject( t );
+ }
}
}
}
@@ -338,11 +417,12 @@
t->memBlock = mmAllocMem( heap->memory_heap, size, 0, offset );
if ( t->memBlock == NULL ) {
- fprintf( stderr, "Couldn't alloc placeholder sz %x ofs %x\n",
+ fprintf( stderr, "Couldn't alloc placeholder: heap %u sz %x ofs %x\n",
+heap->heapId,
(int)size, (int)offset );
mmDumpMemInfo( heap->memory_heap );
return;
}
+ t->heap = heap;
insert_at_head( & heap->texture_objects, t );
}
}
@@ -361,7 +441,7 @@
void driAgeTextures( driTexHeap * heap )
{
- driTexRegion * list = heap->global_regions;
+ drmTextureRegionPtr list = heap->global_regions;
unsigned sz = 1U << (heap->logGranularity);
unsigned i, nr = 0;
@@ -384,10 +464,9 @@
}
if (list[i].age > heap->local_age)
- driTexturesGone( heap, i * sz, sz, 1);
+ driTexturesGone( heap, i * sz, sz, list[i].in_use);
}
-
/* Loop or uninitialized heap detected. Reset.
*/
@@ -396,6 +475,11 @@
resetGlobalLRU( heap );
}
+ if ( 0 ) {
+ printGlobalLRU( heap, __FUNCTION__ );
+ printLocalLRU( heap, __FUNCTION__ );
+ }
+
heap->local_age = heap->global_age[0];
}
@@ -473,7 +557,12 @@
break;
}
- driSwapOutTextureObject( temp );
+ /* If this is a placeholder, there's no need to keep it */
+ if (temp->tObj)
+ driSwapOutTextureObject( temp );
+ else
+ driDestroyTextureObject( temp );
+
t->memBlock = mmAllocMem( heap->memory_heap, t->totalSize,
heap->alignmentShift, 0 );
}
@@ -534,7 +623,7 @@
* would be 12.
* \param nr_regions Number of regions into which this texture space
* should be partitioned
- * \param global_regions Array of \c driTexRegion structures in the SAREA
+ * \param global_regions Array of \c drmTextureRegion structures in the SAREA
* \param global_age Pointer to the global texture age in the SAREA
* \param swapped_objects Pointer to the list of texture objects that are
* not in texture memory (i.e., have been swapped
@@ -550,7 +639,7 @@
driTexHeap *
driCreateTextureHeap( unsigned heap_id, void * context, unsigned size,
unsigned alignmentShift, unsigned nr_regions,
- driTexRegion * global_regions, unsigned * global_age,
+ drmTextureRegionPtr global_regions, unsigned * global_age,
driTextureObject * swapped_objects,
unsigned texture_object_size,
destroy_texture_object_t * destroy_tex_obj
@@ -591,7 +680,12 @@
heap->texture_object_size = texture_object_size;
heap->destroy_texture_object = destroy_tex_obj;
- heap->local_age = 0;
+ /* Force global heap init */
+ if (heap->global_age == 0)
+ heap->local_age = ~0;
+ else
+ heap->local_age = 0;
+
make_empty_list( & heap->texture_objects );
driSetTextureSwapCounterLocation( heap, NULL );
}
@@ -627,6 +721,10 @@
if ( heap != NULL )
{
foreach_s( t, temp, & heap->texture_objects )
+ {
+ driDestroyTextureObject( t );
+ }
+ foreach_s( t, temp, heap->swapped_objects )
{
driDestroyTextureObject( t );
}
Index: lib/GL/mesa/src/drv/common/texmem.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/common/Attic/texmem.h,v
retrieving revision 1.1.2.6
diff -u -r1.1.2.6 texmem.h
--- lib/GL/mesa/src/drv/common/texmem.h 26 Jan 2003 07:43:46 -0000 1.1.2.6
+++ lib/GL/mesa/src/drv/common/texmem.h 4 Feb 2003 16:46:54 -0000
@@ -41,6 +41,7 @@
#include "mtypes.h"
#include "mm.h"
+#include "xf86drm.h"
struct dri_tex_heap;
typedef struct dri_tex_heap driTexHeap;
@@ -48,8 +49,6 @@
struct dri_texture_object;
typedef struct dri_texture_object driTextureObject;
-struct dri_texture_region;
-typedef struct dri_texture_region driTexRegion;
/**
* Base texture object type. Each driver will extend this type with its own
@@ -61,7 +60,12 @@
struct dri_texture_object * prev;
driTexHeap * heap; /**< Texture heap currently stored in */
- struct gl_texture_object * tObj;
+ struct gl_texture_object * tObj;/**< Pointer to Mesa texture object
+ * If NULL, this texture object is a
+ * "placeholder" object representing
+ * texture memory in use by another context.
+ * A placeholder should have a heap and a
+memBlock.
+ */
PMemBlock memBlock; /**< Memory block containing texture */
unsigned bound; /**< Texture unit currently bound to */
@@ -78,23 +82,6 @@
};
-/**
- * Inter-context texture memory management structure.
- *
- * Each driver will have an array of driTexRegion structures in its SAREA.
- * Each element in the array corresponds to a specific block of texture
- * memory.
- */
-struct dri_texture_region {
- unsigned char next; /**< indices to form a circular LRU */
- unsigned char prev; /**< indices to form a circular LRU */
- unsigned char in_use; /**< owned by a client, or free? */
- unsigned age; /**< tracked by clients to update local LRU's */
-};
-
-
-
-
typedef void (destroy_texture_object_t)( void * driverContext,
driTextureObject * t );
@@ -148,8 +135,8 @@
/** Pointer to SAREA \a driTexRegion array
*/
- driTexRegion * global_regions;
-
+ drmTextureRegionPtr global_regions;
+
/** Pointer to the texture state age (generation number) in the SAREA
*/
unsigned * global_age;
@@ -218,7 +205,7 @@
#define DRI_AGE_TEXTURES( heap ) \
do { \
if ( ((heap) != NULL) \
- && ((heap)->local_age > (heap)->global_age[0]) ) \
+ && ((heap)->local_age != (heap)->global_age[0]) ) \
driAgeTextures( heap ); \
} while( 0 )
@@ -243,7 +230,7 @@
driTexHeap * driCreateTextureHeap( unsigned heap_id, void * context,
unsigned size, unsigned alignmentShift, unsigned nr_regions,
- driTexRegion * global_regions, unsigned * global_age,
+ drmTextureRegionPtr global_regions, unsigned * global_age,
driTextureObject * swapped_objects, unsigned texture_object_size,
destroy_texture_object_t * destroy_tex_obj );
void driDestroyTextureHeap( driTexHeap * heap );
Index: lib/GL/mesa/src/drv/mga/mga_xmesa.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c,v
retrieving revision 1.38.10.7
diff -u -r1.38.10.7 mga_xmesa.c
--- lib/GL/mesa/src/drv/mga/mga_xmesa.c 26 Jan 2003 07:43:46 -0000 1.38.10.7
+++ lib/GL/mesa/src/drv/mga/mga_xmesa.c 4 Feb 2003 16:46:54 -0000
@@ -329,8 +329,8 @@
mgaScreen->textureSize[i],
6,
MGA_NR_TEX_REGIONS,
- (driTexRegion *) & mmesa->sarea->texList,
- (unsigned *) & mmesa->sarea->texAge,
+ mmesa->sarea->texList[i],
+ & mmesa->sarea->texAge[i],
& mmesa->swapped,
sizeof( mgaTextureObject_t ),
(destroy_texture_object_t *) mgaDestroyTexObj );
@@ -479,11 +479,9 @@
*/
int i;
-
assert( is_empty_list( & mmesa->swapped ) );
for ( i = 0 ; i < mmesa->nr_heaps ; i++ ) {
- assert( is_empty_list( & mmesa->texture_heaps[ i ]->texture_objects ) );
driDestroyTextureHeap( mmesa->texture_heaps[ i ] );
mmesa->texture_heaps[ i ] = NULL;
}
Index: lib/GL/mesa/src/drv/r128/r128_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/r128/r128_context.c,v
retrieving revision 1.18.36.4
diff -u -r1.18.36.4 r128_context.c
--- lib/GL/mesa/src/drv/r128/r128_context.c 5 Dec 2002 15:26:13 -0000
1.18.36.4
+++ lib/GL/mesa/src/drv/r128/r128_context.c 4 Feb 2003 16:46:54 -0000
@@ -138,8 +138,8 @@
r128scrn->texSize[i],
12,
R128_NR_TEX_REGIONS,
- (driTexRegion *) & rmesa->sarea->texList,
- (unsigned *) & rmesa->sarea->texAge,
+ rmesa->sarea->texList[i],
+ & rmesa->sarea->texAge[i],
& rmesa->swapped,
sizeof( r128TexObj ),
(destroy_texture_object_t *) r128DestroyTexObj );
@@ -257,11 +257,9 @@
*/
int i;
-
assert( is_empty_list( & rmesa->swapped ) );
for ( i = 0 ; i < rmesa->nr_heaps ; i++ ) {
- assert( is_empty_list( & rmesa->texture_heaps[ i ]->texture_objects ) );
driDestroyTextureHeap( rmesa->texture_heaps[ i ] );
rmesa->texture_heaps[ i ] = NULL;
}
Index: lib/GL/mesa/src/drv/r200/r200_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_context.c,v
retrieving revision 1.9.2.4
diff -u -r1.9.2.4 r200_context.c
--- lib/GL/mesa/src/drv/r200/r200_context.c 26 Jan 2003 07:43:46 -0000
1.9.2.4
+++ lib/GL/mesa/src/drv/r200/r200_context.c 4 Feb 2003 16:46:56 -0000
@@ -281,8 +281,8 @@
screen->texSize[i],
12,
RADEON_NR_TEX_REGIONS,
- (driTexRegion *) & rmesa->sarea->texList,
- (unsigned *) & rmesa->sarea->texAge,
+ rmesa->sarea->texList[i],
+ & rmesa->sarea->texAge[i],
& rmesa->swapped,
sizeof( r200TexObj ),
(destroy_texture_object_t *) r200DestroyTexObj );
@@ -472,11 +472,9 @@
*/
int i;
-
assert( is_empty_list( & rmesa->swapped ) );
for ( i = 0 ; i < rmesa->nr_heaps ; i++ ) {
- assert( is_empty_list( & rmesa->texture_heaps[ i ]->texture_objects ) );
driDestroyTextureHeap( rmesa->texture_heaps[ i ] );
rmesa->texture_heaps[ i ] = NULL;
}
Index: lib/GL/mesa/src/drv/radeon/radeon_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v
retrieving revision 1.20.2.7
diff -u -r1.20.2.7 radeon_context.c
--- lib/GL/mesa/src/drv/radeon/radeon_context.c 5 Dec 2002 15:26:34 -0000
1.20.2.7
+++ lib/GL/mesa/src/drv/radeon/radeon_context.c 4 Feb 2003 16:47:00 -0000
@@ -279,8 +279,8 @@
screen->texSize[i],
12,
RADEON_NR_TEX_REGIONS,
- (driTexRegion *) & rmesa->sarea->texList,
- (unsigned *) & rmesa->sarea->texAge,
+ rmesa->sarea->texList[i],
+ & rmesa->sarea->texAge[i],
& rmesa->swapped,
sizeof( radeonTexObj ),
(destroy_texture_object_t *) radeonDestroyTexObj );
@@ -460,11 +460,9 @@
*/
int i;
-
assert( is_empty_list( & rmesa->swapped ) );
for ( i = 0 ; i < rmesa->nr_heaps ; i++ ) {
- assert( is_empty_list( & rmesa->texture_heaps[ i ]->texture_objects ) );
driDestroyTextureHeap( rmesa->texture_heaps[ i ] );
rmesa->texture_heaps[ i ] = NULL;
}
Index: programs/Xserver/hw/xfree86/drivers/ati/r128_sarea.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_sarea.h,v
retrieving revision 1.10.48.1
diff -u -r1.10.48.1 r128_sarea.h
--- programs/Xserver/hw/xfree86/drivers/ati/r128_sarea.h 11 Nov 2002 23:32:30
-0000 1.10.48.1
+++ programs/Xserver/hw/xfree86/drivers/ati/r128_sarea.h 4 Feb 2003 16:47:05
+-0000
@@ -149,12 +149,6 @@
} r128_texture_regs_t;
typedef struct {
- unsigned char next, prev; /* indices to form a circular LRU */
- unsigned char in_use; /* owned by a client, or free? */
- int age; /* tracked by clients to update local LRU's */
-} r128_tex_region_t;
-
-typedef struct {
/* The channel for communication of state information to the kernel
* on firing a vertex buffer.
*/
@@ -191,9 +185,9 @@
* else's - simply eject them all in LRU order.
*/
/* Last elt is sentinal */
- r128_tex_region_t texList[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS+1];
+ drmTextureRegion texList[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS+1];
/* last time texture was uploaded */
- int texAge[R128_NR_TEX_HEAPS];
+ unsigned int texAge[R128_NR_TEX_HEAPS];
int ctxOwner; /* last context to upload state */
} R128SAREAPriv, *R128SAREAPrivPtr;
Index: programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h,v
retrieving revision 1.6.14.1
diff -u -r1.6.14.1 radeon_sarea.h
--- programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h 11 Nov 2002 23:32:31
-0000 1.6.14.1
+++ programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h 4 Feb 2003 16:47:08
+-0000
@@ -185,12 +185,6 @@
} radeon_texture_regs_t;
typedef struct {
- unsigned char next, prev; /* indices to form a circular LRU */
- unsigned char in_use; /* owned by a client, or free? */
- int age; /* tracked by clients to update local LRU's */
-} radeon_tex_region_t;
-
-typedef struct {
/* The channel for communication of state information to the kernel
* on firing a vertex buffer.
*/
@@ -224,9 +218,9 @@
* else's - simply eject them all in LRU order.
*/
/* Last elt is sentinal */
- radeon_tex_region_t texList[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1];
+ drmTextureRegion texList[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1];
/* last time texture was uploaded */
- int texAge[RADEON_NR_TEX_HEAPS];
+ unsigned int texAge[RADEON_NR_TEX_HEAPS];
int ctxOwner; /* last context to upload state */
int pfAllowPageFlip; /* set by the 2d driver, read by the client */
Index: programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_drm.h
===================================================================
RCS file:
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_drm.h,v
retrieving revision 1.2.12.1
diff -u -r1.2.12.1 r128_drm.h
--- programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_drm.h 6 Nov 2002
00:53:07 -0000 1.2.12.1
+++ programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_drm.h 4 Feb 2003
+16:47:13 -0000
@@ -162,7 +162,7 @@
unsigned int last_dispatch;
drm_tex_region_t tex_list[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS+1];
- int tex_age[R128_NR_TEX_HEAPS];
+ unsigned int tex_age[R128_NR_TEX_HEAPS];
int ctx_owner;
} drm_r128_sarea_t;
Index: programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drm.h
===================================================================
RCS file:
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drm.h,v
retrieving revision 1.6.2.1
diff -u -r1.6.2.1 radeon_drm.h
--- programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drm.h 6 Nov
2002 00:53:07 -0000 1.6.2.1
+++ programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drm.h 4 Feb
+2003 16:47:15 -0000
@@ -323,12 +323,6 @@
typedef struct {
- unsigned char next, prev;
- unsigned char in_use;
- int age;
-} drm_radeon_tex_region_t;
-
-typedef struct {
/* The channel for communication of state information to the
* kernel on firing a vertex buffer with either of the
* obsoleted vertex/index ioctls.
@@ -350,8 +344,8 @@
unsigned int last_dispatch;
unsigned int last_clear;
- drm_radeon_tex_region_t
tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1];
- int tex_age[RADEON_NR_TEX_HEAPS];
+ drm_tex_region_t tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1];
+ unsigned int tex_age[RADEON_NR_TEX_HEAPS];
int ctx_owner;
int pfState; /* number of 3d windows (0,1,2ormore) */
int pfCurrentPage; /* which buffer is being displayed? */
@@ -382,7 +376,7 @@
#define DRM_IOCTL_RADEON_STIPPLE DRM_IOW( 0x4c, drm_radeon_stipple_t)
#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t)
#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t)
-#define DRM_IOCTL_RADEON_VERTEX2 DRM_IOW( 0x4f, drm_radeon_vertex_t)
+#define DRM_IOCTL_RADEON_VERTEX2 DRM_IOW( 0x4f, drm_radeon_vertex2_t)
#define DRM_IOCTL_RADEON_CMDBUF DRM_IOW( 0x50, drm_radeon_cmd_buffer_t)
#define DRM_IOCTL_RADEON_GETPARAM DRM_IOWR(0x51, drm_radeon_getparam_t)
#define DRM_IOCTL_RADEON_FLIP DRM_IO( 0x52)