From 540b260cbd39c103c045410b5312d4c57a569e33 Mon Sep 17 00:00:00 2001 From: Felix Kuehling Date: Wed, 23 Feb 2005 16:37:27 +0000 Subject: 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. --- src/mesa/drivers/dri/savage/savage_xmesa.c | 10 ++++++++++ src/mesa/drivers/dri/savage/savageioctl.c | 12 ++++++++++++ src/mesa/drivers/dri/savage/savagetex.c | 9 ++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/savage/savage_xmesa.c b/src/mesa/drivers/dri/savage/savage_xmesa.c index 3c0fae76473..8d274866371 100644 --- a/src/mesa/drivers/dri/savage/savage_xmesa.c +++ b/src/mesa/drivers/dri/savage/savage_xmesa.c @@ -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] ); } diff --git a/src/mesa/drivers/dri/savage/savageioctl.c b/src/mesa/drivers/dri/savage/savageioctl.c index 707fcb6ffb5..3c932553613 100644 --- a/src/mesa/drivers/dri/savage/savageioctl.c +++ b/src/mesa/drivers/dri/savage/savageioctl.c @@ -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) { diff --git a/src/mesa/drivers/dri/savage/savagetex.c b/src/mesa/drivers/dri/savage/savagetex.c index ec04b189620..0badde9dac7 100644 --- a/src/mesa/drivers/dri/savage/savagetex.c +++ b/src/mesa/drivers/dri/savage/savagetex.c @@ -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 */ -- cgit v1.2.3