From 62299f69fd79528a1ce3c3544e2033846a107cf0 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Thu, 1 May 2003 13:02:33 +0000 Subject: Use mprotect() to protect the sarea when not in focus. --- src/mesa/drivers/dri/radeon/radeon_context.c | 45 ++++++++++++++++++++++++- src/mesa/drivers/dri/radeon/radeon_context.h | 3 ++ src/mesa/drivers/dri/radeon/radeon_ioctl.c | 19 +++++++---- src/mesa/drivers/dri/radeon/radeon_ioctl.h | 1 + src/mesa/drivers/dri/radeon/radeon_subset.h | 2 -- src/mesa/drivers/dri/radeon/radeon_subset_vtx.c | 22 ------------ src/mesa/drivers/dri/radeon/server/radeon_dri.c | 4 +-- 7 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 7b325b6b31f..130cecc622f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -61,7 +61,10 @@ #include "X86/common_x86_asm.h" #endif -#define RADEON_DATE "20021125" +#include + + +#define RADEON_DATE "20030501" #ifndef RADEON_DEBUG int RADEON_DEBUG = (0); @@ -517,6 +520,7 @@ radeonDestroyContext( __DRIcontextPrivate *driContextPriv ) #endif if (rmesa->dma.current.buf) { + assert(rmesa->radeonScreen->buffers); radeonReleaseDmaRegion( rmesa, &rmesa->dma.current, __FUNCTION__ ); radeonFlushCmdBuf( rmesa, __FUNCTION__ ); } @@ -715,6 +719,45 @@ radeonUnbindContext( __DRIcontextPrivate *driContextPriv ) } + + +void radeonNotifyFocus( int have_focus ) +{ +#if !_HAVE_FULL_GL + GET_CURRENT_CONTEXT(ctx); + radeonContextPtr rmesa = RADEON_CONTEXT(ctx); + int SAREASize = rmesa->dri.screen->display->driverContext.shared.SAREASize; + + if (ctx->Driver.CurrentExecPrimitive != GL_POLYGON+1) + ctx->Exec->End(); + + if (have_focus && !rmesa->radeonScreen->buffers) { + rmesa->radeonScreen->buffers = drmMapBufs( rmesa->dri.fd ); + + /* Use mprotect rather than unmapping the framebuffer due to the + * large number of derived pointers into the sarea which would + * have to be updated if it changed its location on re-mapping. + */ + mprotect(rmesa->dri.screen->pSAREA, SAREASize, PROT_READ|PROT_WRITE); + } + else if (!have_focus && rmesa->radeonScreen->buffers) { + if (rmesa->dma.current.buf) + radeonReleaseDmaRegion( rmesa, &rmesa->dma.current, __FUNCTION__ ); + RADEON_FIREVERTICES( rmesa ); + + drmUnmapBufs( rmesa->radeonScreen->buffers ); + rmesa->radeonScreen->buffers = 0; + + mprotect(rmesa->dri.screen->pSAREA, SAREASize, PROT_NONE); + + assert(!rmesa->dma.current.buf); + } + + radeonVtxfmtInit( ctx ); +#endif +} + + /** * \brief Open/close fullscreen mode. * diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h index 4f041e2d158..eacefb19a70 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_context.h @@ -755,6 +755,9 @@ static __inline GLuint radeonPackColor( GLuint cpp, } +extern void radeonNotifyFocus( int have_focus ); + + /****************************************************************** * Debugging: */ diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c index 9b10fc13891..4e5650ac824 100644 --- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c +++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c @@ -185,6 +185,7 @@ extern void radeonEmitVbufPrim( radeonContextPtr rmesa, assert(rmesa->dri.drmMinor >= 3); assert(!(primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); + assert(rmesa->radeonScreen->buffers ); radeonEmitState( rmesa ); @@ -248,6 +249,7 @@ GLushort *radeonAllocEltsOpenEnded( radeonContextPtr rmesa, assert(rmesa->dri.drmMinor >= 3); assert((primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); + assert(rmesa->radeonScreen->buffers ); radeonEmitState( rmesa ); @@ -398,6 +400,7 @@ void radeonFlushCmdBuf( radeonContextPtr rmesa, const char *caller ) { int ret; assert (rmesa->dri.drmMinor >= 3); + assert (rmesa->radeonScreen->buffers); LOCK_HARDWARE( rmesa ); ret = radeonFlushCmdBufLocked( rmesa, caller ); @@ -442,9 +445,10 @@ void radeonRefillCurrentDmaRegion( radeonContextPtr rmesa ) if (RADEON_DEBUG & (DEBUG_IOCTL|DEBUG_DMA)) fprintf(stderr, "%s\n", __FUNCTION__); - if (rmesa->dma.flush) { + assert( rmesa->radeonScreen->buffers ); + + if (rmesa->dma.flush) rmesa->dma.flush( rmesa ); - } if (rmesa->dma.current.buf) radeonReleaseDmaRegion( rmesa, &rmesa->dma.current, __FUNCTION__ ); @@ -750,6 +754,8 @@ static void radeonWaitForFrameCompletion( radeonContextPtr rmesa ) { RADEONSAREAPrivPtr sarea = rmesa->sarea; + assert (rmesa->radeonScreen->buffers); + if (rmesa->do_irqs) { if (radeonGetLastFrame(rmesa) < sarea->last_frame) { if (!rmesa->irqsEmitted) { @@ -773,7 +779,7 @@ static void radeonWaitForFrameCompletion( radeonContextPtr rmesa ) while (radeonGetLastFrame (rmesa) < sarea->last_frame) { UNLOCK_HARDWARE( rmesa ); if (rmesa->do_usleeps) - usleep(1); + usleep(1); LOCK_HARDWARE( rmesa ); } } @@ -1160,9 +1166,10 @@ void radeonWaitForIdleLocked( radeonContextPtr rmesa ) */ static void radeonWaitForIdle( radeonContextPtr rmesa ) { - LOCK_HARDWARE(rmesa); - radeonWaitForIdleLocked( rmesa ); - UNLOCK_HARDWARE(rmesa); + assert(rmesa->radeonScreen->buffers); + LOCK_HARDWARE(rmesa); + radeonWaitForIdleLocked( rmesa ); + UNLOCK_HARDWARE(rmesa); } diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.h b/src/mesa/drivers/dri/radeon/radeon_ioctl.h index 0adb182b2bd..23e64bb442a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_ioctl.h +++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.h @@ -179,6 +179,7 @@ static __inline char *radeonAllocCmdBuf( radeonContextPtr rmesa, radeonFlushCmdBuf( rmesa, __FUNCTION__ ); assert(rmesa->dri.drmMinor >= 3); + assert(rmesa->radeonScreen->buffers); { char *head = rmesa->store.cmd_buf + rmesa->store.cmd_used; diff --git a/src/mesa/drivers/dri/radeon/radeon_subset.h b/src/mesa/drivers/dri/radeon/radeon_subset.h index c7f169281e0..1b6e7bd432c 100644 --- a/src/mesa/drivers/dri/radeon/radeon_subset.h +++ b/src/mesa/drivers/dri/radeon/radeon_subset.h @@ -72,6 +72,4 @@ extern void radeonAgeTextures( radeonContextPtr rmesa, int heap ); extern void radeonDestroyTexObj( radeonContextPtr rmesa, radeonTexObjPtr t ); -extern void radeonVtxfmtNotifyFocus( int have_focus ); - #endif diff --git a/src/mesa/drivers/dri/radeon/radeon_subset_vtx.c b/src/mesa/drivers/dri/radeon/radeon_subset_vtx.c index 8533f7be682..235f4acea3a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_subset_vtx.c +++ b/src/mesa/drivers/dri/radeon/radeon_subset_vtx.c @@ -50,7 +50,6 @@ #include "radeon_ioctl.h" #include "radeon_subset.h" - /** * \brief Union for vertex data. */ @@ -988,24 +987,3 @@ void radeonVtxfmtInit( GLcontext *ctx ) /*@}*/ -void radeonVtxfmtNotifyFocus( int have_focus ) -{ - GET_CURRENT_CONTEXT(ctx); - radeonContextPtr rmesa = RADEON_CONTEXT(ctx); - - if (ctx->Driver.CurrentExecPrimitive != GL_POLYGON+1) - radeon_End(); - - if (have_focus && !rmesa->radeonScreen->buffers) { - rmesa->radeonScreen->buffers = drmMapBufs( rmesa->dri.fd ); - } - else if (!have_focus && rmesa->radeonScreen->buffers) { - RADEON_FIREVERTICES( rmesa ); - drmUnmapBufs( rmesa->radeonScreen->buffers ); - rmesa->radeonScreen->buffers = 0; -/* assert(!rmesa->dma.current.buf); */ - } - - radeonVtxfmtInit( ctx ); -} - diff --git a/src/mesa/drivers/dri/radeon/server/radeon_dri.c b/src/mesa/drivers/dri/radeon/server/radeon_dri.c index dc467f9669f..298f646773a 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_dri.c +++ b/src/mesa/drivers/dri/radeon/server/radeon_dri.c @@ -1228,7 +1228,7 @@ static void radeonHaltFBDev( struct DRIDriverContextRec *ctx ) } -extern void radeonVtxfmtNotifyFocus( int ); +extern void radeonNotifyFocus( int ); /** * \brief Exported driver interface for Mini GLX. @@ -1246,6 +1246,6 @@ struct DRIDriverRec __driDriver = { #if _HAVE_FULL_GL 0, #else - radeonVtxfmtNotifyFocus, + radeonNotifyFocus, #endif }; -- cgit v1.2.3