diff options
-rw-r--r-- | dix/dispatch.c | 1 | ||||
-rw-r--r-- | dix/gc.c | 37 | ||||
-rw-r--r-- | hw/xnest/Screen.c | 1 | ||||
-rw-r--r-- | include/gcstruct.h | 3 | ||||
-rw-r--r-- | include/scrnintstr.h | 1 |
5 files changed, 20 insertions, 23 deletions
diff --git a/dix/dispatch.c b/dix/dispatch.c index c86011a83..27cb22022 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -3916,7 +3916,6 @@ AddScreen( any of the strings pointed to by argv. They may be passed to multiple screens. */ - pScreen->rgf = ~0L; /* there are no scratch GCs yet*/ WindowTable[i] = NullWindow; screenInfo.screens[i] = pScreen; screenInfo.numScreens++; @@ -537,6 +537,9 @@ CreateGC(DrawablePtr pDrawable, BITS32 mask, XID *pval, int *pStatus, pGC->stipple = pGC->pScreen->PixmapPerDepth[0]; pGC->stipple->refcnt++; + /* this is not a scratch GC */ + pGC->scratch_inuse = FALSE; + /* security creation/labeling check */ *pStatus = XaceHook(XACE_RESOURCE_ACCESS, client, gcid, RT_GC, pGC, RT_NONE, NULL, DixCreateAccess|DixSetAttrAccess); @@ -844,6 +847,9 @@ CreateScratchGC(ScreenPtr pScreen, unsigned depth) pGC->lastWinOrg.x = 0; pGC->lastWinOrg.y = 0; + /* scratch GCs in the GCperDepth pool start off unused */ + pGC->scratch_inuse = FALSE; + pGC->stateChanges = GCAllBits; if (!(*pScreen->CreateGC)(pGC)) { @@ -864,8 +870,10 @@ FreeGCperDepth(int screenNum) ppGC = pScreen->GCperDepth; for (i = 0; i <= pScreen->numDepths; i++) + { (void)FreeGC(ppGC[i], (XID)0); - pScreen->rgf = ~0L; + ppGC[i] = NULL; + } } @@ -878,7 +886,6 @@ CreateGCperDepth(int screenNum) GCPtr *ppGC; pScreen = screenInfo.screens[screenNum]; - pScreen->rgf = 0; ppGC = pScreen->GCperDepth; /* do depth 1 separately because it's not included in list */ if (!(ppGC[0] = CreateScratchGC(pScreen, 1))) @@ -1097,12 +1104,11 @@ GetScratchGC(unsigned depth, ScreenPtr pScreen) GCPtr pGC; for (i=0; i<=pScreen->numDepths; i++) - if ( pScreen->GCperDepth[i]->depth == depth && - !(pScreen->rgf & (1L << (i+1))) - ) + { + pGC = pScreen->GCperDepth[i]; + if (pGC && pGC->depth == depth && !pGC->scratch_inuse) { - pScreen->rgf |= (1L << (i+1)); - pGC = (pScreen->GCperDepth[i]); + pGC->scratch_inuse = TRUE; pGC->alu = GXcopy; pGC->planemask = ~0; @@ -1127,6 +1133,7 @@ GetScratchGC(unsigned depth, ScreenPtr pScreen) pGC->stateChanges = GCAllBits; return pGC; } + } /* if we make it this far, need to roll our own */ pGC = CreateScratchGC(pScreen, depth); if (pGC) @@ -1142,16 +1149,8 @@ mark it as available. void FreeScratchGC(GCPtr pGC) { - ScreenPtr pScreen = pGC->pScreen; - int i; - - for (i=0; i<=pScreen->numDepths; i++) - { - if ( pScreen->GCperDepth[i] == pGC) - { - pScreen->rgf &= ~(1L << (i+1)); - return; - } - } - (void)FreeGC(pGC, (GContext)0); + if (pGC->scratch_inuse) + pGC->scratch_inuse = FALSE; + else + FreeGC(pGC, (GContext)0); } diff --git a/hw/xnest/Screen.c b/hw/xnest/Screen.c index 62255b883..0a05ac8da 100644 --- a/hw/xnest/Screen.c +++ b/hw/xnest/Screen.c @@ -243,7 +243,6 @@ xnestOpenScreen(int index, ScreenPtr pScreen, int argc, char *argv[]) pScreen->saveUnderSupport = NotUseful; pScreen->whitePixel = xnestWhitePixel; pScreen->blackPixel = xnestBlackPixel; - /* rgf */ /* GCperDepth */ /* PixmapPerDepth */ pScreen->devPrivate = NULL; diff --git a/include/gcstruct.h b/include/gcstruct.h index b9fc5cace..3f70eada4 100644 --- a/include/gcstruct.h +++ b/include/gcstruct.h @@ -292,7 +292,8 @@ typedef struct _GC { unsigned int tileIsPixel:1; /* tile is solid pixel */ unsigned int fExpose:1; /* Call exposure handling */ unsigned int freeCompClip:1; /* Free composite clip */ - unsigned int unused:14; /* see comment above */ + unsigned int scratch_inuse:1; /* is this GC in a pool for reuse? */ + unsigned int unused:13; /* see comment above */ unsigned long planemask; unsigned long fgPixel; unsigned long bgPixel; diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 3a77e0cf1..6f1936c1f 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -455,7 +455,6 @@ typedef struct _Screen { short minInstalledCmaps, maxInstalledCmaps; char backingStoreSupport, saveUnderSupport; unsigned long whitePixel, blackPixel; - unsigned long rgf; /* array of flags; she's -- HUNGARIAN */ GCPtr GCperDepth[MAXFORMATS+1]; /* next field is a stipple to use as default in a GC. we don't build default tiles of all depths |