[PATCH] Replace screen->rgf scratch GC flags with a bit in each GC.

Jamey Sharp jamey at minilop.net
Thu May 20 10:46:43 PDT 2010


This eliminates a poorly-named, poorly-documented field from the
ScreenRec, using a previously-unused flag bit in each GC instead.

Signed-off-by: Jamey Sharp <jamey at minilop.net>
Cc: Keith Packard <keithp at keithp.com>
Reviewed-by: Keith Packard <keithp at keithp.com>
---
On Wed, May 19, 2010 at 10:22 PM, Keith Packard <keithp at keithp.com> wrote:
> Now that we've got the flag in the GC, if you set this to FALSE in
> CreateGC, you could just check the flag here instead of looping over
> the array in the screen.

Oh. Huh. Yeah, that's better. :-)

> In fact, you could do that check in FreeGC and make FreeScratchGC just
> call that...

I'm not sure I want to encourage confusing those functions...

> On Wed, 19 May 2010 17:25:18 -0700, Jamey Sharp <jamey at minilop.net> wrote:
>> PURPLE!
>
> A fine bikeshed color. Of course, perhaps mauve would be nicer?

Indeed! This bikeshed may not be complete without polka-dots, though.

 dix/dispatch.c       |    1 -
 dix/gc.c             |   37 ++++++++++++++++++-------------------
 hw/xnest/Screen.c    |    1 -
 include/gcstruct.h   |    3 ++-
 include/scrnintstr.h |    1 -
 5 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/dix/dispatch.c b/dix/dispatch.c
index c86011a..27cb220 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++;
diff --git a/dix/gc.c b/dix/gc.c
index 56d5cda..b6027b3 100644
--- a/dix/gc.c
+++ b/dix/gc.c
@@ -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 62255b8..0a05ac8 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 b9fc5ca..3f70ead 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 3a77e0c..6f1936c 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
-- 
1.7.0



More information about the xorg-devel mailing list