Bugzilla #1032: Make rootless acceleration functions compatible with

Damage.
This commit is contained in:
Torrey Lyons 2004-09-18 00:38:30 +00:00
parent cedb9a8d62
commit 6344bb51e2
8 changed files with 139 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $XdotOrg: xc/programs/Xserver/hw/darwin/quartz/cr/crScreen.m,v 1.3 2004/07/30 19:12:18 torrey Exp $ */
/* $XdotOrg: xc/programs/Xserver/hw/darwin/quartz/cr/crScreen.m,v 1.4 2004/08/12 20:24:36 torrey Exp $ */
/*
* Cocoa rootless implementation initialization
*/
@ -261,6 +261,10 @@ CRSetupScreen(int index, ScreenPtr pScreen)
}
#endif /* RENDER */
// Initialize accelerated rootless drawing
// Note that this must be done before DamageSetup().
RootlessAccelInit(pScreen);
#ifdef DAMAGE
// The Damage extension needs to wrap underneath the
// generic rootless layer, so do it now.

View File

@ -1,4 +1,4 @@
/* $XdotOrg: xc/programs/Xserver/hw/darwin/quartz/xpr/xprScreen.c,v 1.3 2004/07/30 19:12:18 torrey Exp $ */
/* $XdotOrg: xc/programs/Xserver/hw/darwin/quartz/xpr/xprScreen.c,v 1.4 2004/08/12 20:24:36 torrey Exp $ */
/*
* Xplugin rootless implementation screen functions
*/
@ -325,6 +325,10 @@ xprSetupScreen(int index, ScreenPtr pScreen)
}
#endif /* RENDER */
// Initialize accelerated rootless drawing
// Note that this must be done before DamageSetup().
RootlessAccelInit(pScreen);
#ifdef DAMAGE
// The Damage extension needs to wrap underneath the
// generic rootless layer, so do it now.

View File

@ -1,3 +1,9 @@
2004-09-17 Torrey Lyons <torrey at freedesktop dot org>
* winscrinit.c: (winFinishScreenInitFB):
Bugzilla #1032: Make rootless acceleration functions compatible with
Damage.
2004-09-16 Alexander Gottwald <ago at freedesktop dot org>
* wincreatewnd.c (winCreateBoundingWindowWindowed):

View File

@ -365,6 +365,22 @@ winFinishScreenInitFB (int index,
pScreen->blockData = pScreen;
pScreen->wakeupData = pScreen;
#ifdef XWIN_MULTIWINDOWEXTWM
/*
* Setup acceleration for multi-window external window manager mode.
* To be compatible with the Damage extension, this must be done
* before calling miDCInitialize, which calls DamageSetup.
*/
if (pScreenInfo->fMWExtWM)
{
if (!RootlessAccelInit (pScreen))
{
ErrorF ("winFinishScreenInitFB - RootlessAccelInit () failed\n");
return FALSE;
}
}
#endif
#ifdef RENDER
/* Render extension initialization, calls miPictureInit */
if (!fbPictureInit (pScreen, NULL, 0))

View File

@ -0,0 +1,97 @@
/*
* Support for accelerated rootless code
*/
/*
* Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the name(s) of the above copyright
* holders shall not be used in advertising or otherwise to promote the sale,
* use or other dealings in this Software without prior written authorization.
*/
/* $XdotOrg: $ */
#include "rootless.h"
#include "rlAccel.h"
typedef struct _rlAccelScreenRec {
CreateGCProcPtr CreateGC;
} rlAccelScreenRec, *rlAccelScreenPtr;
static int rlAccelScreenPrivateIndex = -1;
#define RLACCELREC(pScreen) \
((rlAccelScreenRec *)(pScreen)->devPrivates[rlAccelScreenPrivateIndex].ptr)
/*
* Screen function to create a graphics context
*/
static Bool
rlCreateGC(GCPtr pGC)
{
ScreenPtr pScreen = pGC->pScreen;
rlAccelScreenRec *s = RLACCELREC(pScreen);
Bool result;
// Unwrap and call
pScreen->CreateGC = s->CreateGC;
result = s->CreateGC(pGC);
// Accelerated GC ops replace some ops
pGC->ops->FillSpans = rlFillSpans;
pGC->ops->CopyArea = rlCopyArea;
pGC->ops->PolyFillRect = rlPolyFillRect;
pGC->ops->ImageGlyphBlt = rlImageGlyphBlt;
// Rewrap
s->CreateGC = pScreen->CreateGC;
pScreen->CreateGC = rlCreateGC;
return result;
}
/*
* RootlessAccelInit
* Called by the rootless implementation to initialize accelerated
* rootless drawing.
*/
Bool
RootlessAccelInit(ScreenPtr pScreen)
{
static unsigned long rlAccelGeneration = 0;
rlAccelScreenRec *s;
if (rlAccelGeneration != serverGeneration) {
rlAccelScreenPrivateIndex = AllocateScreenPrivateIndex();
if (rlAccelScreenPrivateIndex == -1) return FALSE;
}
s = xalloc(sizeof(rlAccelScreenRec));
if (!s) return FALSE;
RLACCELREC(pScreen) = s;
// Wrap the one screen function we need
s->CreateGC = pScreen->CreateGC;
pScreen->CreateGC = rlCreateGC;
return TRUE;
}

View File

@ -28,6 +28,8 @@
*/
/* $XFree86: xc/programs/Xserver/miext/rootless/rootlessCommon.c,v 1.4 2003/10/18 00:00:34 torrey Exp $ */
#include "fb.h"
/*
* rlBlt.c
*/

View File

@ -368,6 +368,13 @@ typedef struct _RootlessFrameProcs {
*/
Bool RootlessInit(ScreenPtr pScreen, RootlessFrameProcsPtr procs);
/*
* Initialize acceleration for rootless mode on a given screen.
* Note: RootlessAccelInit() must be called before DamageSetup()
* and RootlessInit() must be called afterwards.
*/
Bool RootlessAccelInit(ScreenPtr pScreen);
/*
* Return the frame ID for the physical window displaying the given window.
*

View File

@ -45,10 +45,6 @@
#include "rootlessCommon.h"
#if ROOTLESS_ACCEL
#include "rlAccel.h"
#endif
// GC functions
static void RootlessValidateGC(GCPtr pGC, unsigned long changes,
@ -165,7 +161,7 @@ static GCOps rootlessGCOps = {
...
if (can_accel_xxx(..) && otherwise-suitable)
if (canAccelxxx(..) && otherwise-suitable)
GC_UNSET_PM(gc, dst);
gc->funcs->OP(gc, ...);
@ -283,13 +279,6 @@ RootlessCreateGC(GCPtr pGC)
devPrivates[rootlessScreenPrivateIndex].ptr;
result = s->CreateGC(pGC);
#if ROOTLESS_ACCEL
pGC->ops->FillSpans = rlFillSpans;
pGC->ops->CopyArea = rlCopyArea;
pGC->ops->PolyFillRect = rlPolyFillRect;
pGC->ops->ImageGlyphBlt = rlImageGlyphBlt;
#endif
gcrec = (RootlessGCRec *) pGC->devPrivates[rootlessGCPrivateIndex].ptr;
gcrec->originalOps = NULL; // don't wrap ops yet
gcrec->originalFuncs = pGC->funcs;