Bugzilla #1032: Make rootless acceleration functions compatible with
Damage.
This commit is contained in:
parent
cedb9a8d62
commit
6344bb51e2
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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))
|
||||
|
|
97
miext/rootless/accel/rlAccel.c
Normal file
97
miext/rootless/accel/rlAccel.c
Normal 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;
|
||||
}
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user