With Savage DRM version 2.3.x or later use event counters for texture

heap aging, similar to the way it's done in the i810 and i855 drivers.
This avoids idling the engine on every texture upload.
This commit is contained in:
Felix Kuehling 2005-02-23 16:37:27 +00:00
parent 8f5f6b3d59
commit 540b260cbd
3 changed files with 30 additions and 1 deletions

View file

@ -742,6 +742,7 @@ void savageGetLock( savageContextPtr imesa, GLuint flags )
int me = imesa->hHWContext;
int stamp = dPriv->lastStamp;
int heap;
unsigned int timestamp = 0;
@ -781,6 +782,15 @@ void savageGetLock( savageContextPtr imesa, GLuint flags )
}
for (heap = 0; heap < imesa->lastTexHeap; ++heap) {
/* If a heap was changed, update its timestamp. Do this before
* DRI_AGE_TEXTURES updates the local_age. */
if (imesa->textureHeaps[heap] &&
imesa->textureHeaps[heap]->global_age[0] >
imesa->textureHeaps[heap]->local_age) {
if (timestamp == 0)
timestamp = savageEmitEventLocked(imesa, 0);
imesa->textureHeaps[heap]->timestamp = timestamp;
}
DRI_AGE_TEXTURES( imesa->textureHeaps[heap] );
}

View file

@ -617,6 +617,18 @@ void savageFlushCmdBufLocked( savageContextPtr imesa, GLboolean discard )
imesa->cmdBuf.write = imesa->cmdBuf.base;
savageEmitOldState(imesa);
imesa->cmdBuf.start = imesa->cmdBuf.write;
/* Timestamp current texture objects for texture heap aging.
* Only useful with long-lived 32-bit event tags available
* with Savage DRM 2.3.x or later. */
if ((imesa->CurrentTexObj[0] || imesa->CurrentTexObj[1]) &&
imesa->savageScreen->driScrnPriv->drmMinor >= 3) {
unsigned int e = savageEmitEventLocked(imesa, 0);
if (imesa->CurrentTexObj[0])
imesa->CurrentTexObj[0]->timestamp = e;
if (imesa->CurrentTexObj[1])
imesa->CurrentTexObj[1]->timestamp = e;
}
}
if (discard) {

View file

@ -770,7 +770,14 @@ static void savageUploadTexImages( savageContextPtr imesa, savageTexObjPtr t )
savageFlushVertices (imesa);
LOCK_HARDWARE(imesa);
savageFlushCmdBufLocked (imesa, GL_FALSE);
WAIT_IDLE_EMPTY_LOCKED(imesa);
/* Heap timestamps are only reliable with Savage DRM 2.3.x or
* later. Earlier versions had only 16 bit time stamps which
* would wrap too frequently. */
if (imesa->savageScreen->driScrnPriv->drmMinor >= 3) {
unsigned int heap = t->base.heap->heapId;
savageWaitEvent (imesa, imesa->textureHeaps[heap]->timestamp);
} else
WAIT_IDLE_EMPTY_LOCKED(imesa);
for (i = 0 ; i < numLevels ; i++) {
const GLint j = t->base.firstLevel + i; /* the texObj's level */