mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-20 11:20:31 +01:00
Hook on CreateWindow instead of CreateScreenResources.
This commit is contained in:
parent
f3f75eb06e
commit
a4ca4cb8a9
2 changed files with 87 additions and 44 deletions
|
|
@ -57,7 +57,7 @@ int xglGlyphPrivateIndex;
|
|||
|
||||
static int glucoseGeneration = -1;
|
||||
int glucoseScreenPrivateIndex;
|
||||
int glucoseCreateScreenResourcesIndex;
|
||||
int glucoseCreateWindowIndex;
|
||||
|
||||
xglScreenInfoRec xglScreenInfo = {
|
||||
NULL, 0, 0, 0, 0, 0,
|
||||
|
|
@ -79,33 +79,40 @@ xglScreenInfoRec xglScreenInfo = {
|
|||
static glitz_drawable_format_t *
|
||||
glucoseInitOutput(__GLXscreen *screen);
|
||||
|
||||
/* Wrapped for glxext close down */
|
||||
static void glucoseDestroyGLXscreen(__GLXscreen *screen)
|
||||
{
|
||||
ErrorF("SHUTDOWN EXTENSION\n");
|
||||
}
|
||||
|
||||
static Bool
|
||||
glucoseCreateScreenResources(ScreenPtr pScreen)
|
||||
glucoseCreateWindow(WindowPtr pWin)
|
||||
{
|
||||
int ret = TRUE;
|
||||
CreateScreenResourcesProcPtr CreateScreenResources =
|
||||
(CreateScreenResourcesProcPtr)(pScreen->devPrivates[glucoseCreateScreenResourcesIndex].ptr);
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
CreateWindowProcPtr CreateWindow =
|
||||
(CreateWindowProcPtr)(pScreen->devPrivates[glucoseCreateWindowIndex].ptr);
|
||||
GlucoseScreenPrivPtr pScreenPriv = GlucoseGetScreenPriv(pScreen);
|
||||
int err;
|
||||
|
||||
xf86DrvMsg(pScreen->myNum, X_INFO,
|
||||
"Glucose initializing screen %d\n",pScreen->myNum);
|
||||
|
||||
if ( pScreen->CreateScreenResources != glucoseCreateScreenResources ) {
|
||||
if ( pScreen->CreateWindow != glucoseCreateWindow ) {
|
||||
/* Can't find hook we are hung on */
|
||||
xf86DrvMsg(pScreen->myNum, X_WARNING /* X_ERROR */,
|
||||
"glucoseCreateScreenResources %p called when not in pScreen->CreateScreenResources %p n",
|
||||
(void *)glucoseCreateScreenResources,
|
||||
(void *)pScreen->CreateScreenResources );
|
||||
"glucoseCreateWindow %p called when not in pScreen->CreateWindow %p n",
|
||||
(void *)glucoseCreateWindow,
|
||||
(void *)pScreen->CreateWindow );
|
||||
}
|
||||
|
||||
/* Unhook this function ... */
|
||||
pScreen->CreateScreenResources = CreateScreenResources;
|
||||
pScreen->devPrivates[glucoseCreateScreenResourcesIndex].ptr = NULL;
|
||||
pScreen->CreateWindow = CreateWindow;
|
||||
pScreen->devPrivates[glucoseCreateWindowIndex].ptr = NULL;
|
||||
|
||||
/* ... and call the previous CreateScreenResources fuction, if any */
|
||||
if (NULL!=pScreen->CreateScreenResources) {
|
||||
ret = (*pScreen->CreateScreenResources)(pScreen);
|
||||
/* ... and call the previous CreateWindow fuction, if any */
|
||||
if (NULL!=pScreen->CreateWindow) {
|
||||
ret = (*pScreen->CreateWindow)(pWin);
|
||||
}
|
||||
|
||||
xglScreenInfo.width = pScreen->width;
|
||||
|
|
@ -115,6 +122,9 @@ glucoseCreateScreenResources(ScreenPtr pScreen)
|
|||
|
||||
pScreenPriv->screen = __glXActiveScreens[pScreen->myNum];
|
||||
|
||||
pScreenPriv->destroyGLXscreen = pScreenPriv->screen->destroy;
|
||||
pScreenPriv->screen->destroy = glucoseDestroyGLXscreen;
|
||||
|
||||
{
|
||||
glitz_drawable_t *drawable;
|
||||
glitz_drawable_format_t *format;
|
||||
|
|
@ -124,6 +134,14 @@ glucoseCreateScreenResources(ScreenPtr pScreen)
|
|||
|
||||
__pGlxClient = serverClient;
|
||||
|
||||
/* track root pixmap */
|
||||
if (pPixmap)
|
||||
{
|
||||
pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
||||
pPixmap->drawable.id = FakeClientID(0);
|
||||
AddResource(pPixmap->drawable.id, RT_PIXMAP, (pointer)pPixmap);
|
||||
}
|
||||
|
||||
pScreenPriv->rootDrawable = pScreenPriv->screen->createDrawable(pScreenPriv->screen, (DrawablePtr)pPixmap, pPixmap->drawable.id, modes);
|
||||
|
||||
if (!pScreenPriv->rootDrawable) {
|
||||
|
|
@ -162,8 +180,8 @@ glucoseCreateScreenResources(ScreenPtr pScreen)
|
|||
|
||||
drawable = glitz_glucose_create_drawable_for_window(pScreenPriv->screen,
|
||||
format, pScreenPriv->rootDrawable,
|
||||
pPixmap->drawable.width,
|
||||
pPixmap->drawable.height);
|
||||
pScreen->width,
|
||||
pScreen->height);
|
||||
|
||||
if (!drawable) {
|
||||
__glXenterServer(FALSE);
|
||||
|
|
@ -205,7 +223,7 @@ glucoseCreateScreenResources(ScreenPtr pScreen)
|
|||
|
||||
REGION_UNINIT (pPixmap->drawable.pScreen, &pPixmapPriv->bitRegion);
|
||||
|
||||
xglPixmapSurfaceInit(pPixmap, xglScreenPriv->features, pPixmap->drawable.width, pPixmap->drawable.height);
|
||||
xglPixmapSurfaceInit(pPixmap, xglScreenPriv->features, pScreen->width, pScreen->height);
|
||||
|
||||
if (pScreen->devPrivate && pPixmapPriv->pDamage) {
|
||||
RegionPtr pRegion = DamageRegion (pPixmapPriv->pDamage);
|
||||
|
|
@ -242,8 +260,8 @@ glucoseAllocatePrivates(ScreenPtr pScreen)
|
|||
glucoseScreenPrivateIndex = AllocateScreenPrivateIndex();
|
||||
if (glucoseScreenPrivateIndex < 0)
|
||||
return FALSE;
|
||||
glucoseCreateScreenResourcesIndex = AllocateScreenPrivateIndex();
|
||||
if (glucoseCreateScreenResourcesIndex < 0)
|
||||
glucoseCreateWindowIndex = AllocateScreenPrivateIndex();
|
||||
if (glucoseCreateWindowIndex < 0)
|
||||
return FALSE;
|
||||
|
||||
glucoseGeneration = serverGeneration;
|
||||
|
|
@ -258,9 +276,9 @@ glucoseAllocatePrivates(ScreenPtr pScreen)
|
|||
|
||||
pScreen->devPrivates[glucoseScreenPrivateIndex].ptr = (pointer) pScreenPriv;
|
||||
|
||||
pScreen->devPrivates[glucoseCreateScreenResourcesIndex].ptr
|
||||
= (void*)(pScreen->CreateScreenResources);
|
||||
pScreen->CreateScreenResources = glucoseCreateScreenResources;
|
||||
pScreen->devPrivates[glucoseCreateWindowIndex].ptr
|
||||
= (void*)(pScreen->CreateWindow);
|
||||
pScreen->CreateWindow = glucoseCreateWindow;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -359,6 +377,21 @@ xglAllocatePrivates (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
glucoseDestroyPixmap (PixmapPtr pPixmap)
|
||||
{
|
||||
ScreenPtr pScreen = pPixmap->drawable.pScreen;
|
||||
PixmapPtr pScreenPixmap = pScreen->GetScreenPixmap(pScreen);
|
||||
|
||||
if (pPixmap == pScreenPixmap) {
|
||||
ErrorF("SHUTTING DOWN\n");
|
||||
/* we're shutting down, we'll clean this up later */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return xglDestroyPixmap(pPixmap);
|
||||
}
|
||||
|
||||
Bool
|
||||
glucoseScreenInit (ScreenPtr pScreen, int flags)
|
||||
{
|
||||
|
|
@ -404,7 +437,7 @@ glucoseScreenInit (ScreenPtr pScreen, int flags)
|
|||
|
||||
|
||||
pScreen->CreatePixmap = xglCreatePixmap;
|
||||
pScreen->DestroyPixmap = xglDestroyPixmap;
|
||||
pScreen->DestroyPixmap = glucoseDestroyPixmap;
|
||||
|
||||
#ifdef MITSHM
|
||||
ShmRegisterFuncs (pScreen, &shmFuncs);
|
||||
|
|
@ -676,10 +709,8 @@ glucoseFinishScreenInit (ScreenPtr pScreen)
|
|||
#endif
|
||||
|
||||
#if 0 /* Let the driver do this ! */
|
||||
#ifdef XV
|
||||
if (!xglXvScreenInit (pScreen))
|
||||
return FALSE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -694,12 +725,13 @@ glucoseCloseScreen (int index,
|
|||
XGL_SCREEN_PRIV (pScreen);
|
||||
XGL_PIXMAP_PRIV (pScreenPriv->pScreenPixmap);
|
||||
XGL_SCREEN_UNWRAP (CloseScreen);
|
||||
GlucoseScreenPrivPtr pPriv = GlucoseGetScreenPriv(pScreen);
|
||||
|
||||
{
|
||||
GlucoseScreenPrivPtr pScreenPriv = GlucoseGetScreenPriv(pScreen);
|
||||
__pGlxClient = serverClient;
|
||||
|
||||
pScreenPriv->rootContext->makeCurrent(pScreenPriv->rootContext);
|
||||
}
|
||||
xglFiniPixmap (pScreenPriv->pScreenPixmap);
|
||||
if (pPixmapPriv->pDamage)
|
||||
DamageDestroy (pPixmapPriv->pDamage);
|
||||
|
||||
#ifdef RENDER
|
||||
int i;
|
||||
|
|
@ -714,9 +746,29 @@ glucoseCloseScreen (int index,
|
|||
FreePicture ((pointer) pScreenPriv->trapInfo.pMask, 0);
|
||||
#endif
|
||||
|
||||
xglFiniPixmap (pScreenPriv->pScreenPixmap);
|
||||
if (pPixmapPriv->pDamage)
|
||||
DamageDestroy (pPixmapPriv->pDamage);
|
||||
if (pScreenPriv->surface)
|
||||
glitz_surface_destroy (pScreenPriv->surface);
|
||||
pPixmapPriv->surface = NULL;
|
||||
pScreenPriv->surface = NULL;
|
||||
|
||||
GEOMETRY_UNINIT (&pScreenPriv->scratchGeometry);
|
||||
|
||||
if (pScreenPriv->drawable)
|
||||
glitz_drawable_destroy(pScreenPriv->drawable);
|
||||
pPixmapPriv->drawable = NULL;
|
||||
pScreenPriv->drawable = NULL;
|
||||
xglScreenInfo.drawable = NULL;
|
||||
|
||||
/* tear down glucose now */
|
||||
#if 0
|
||||
/* Unfortunately, this causes some problems in hardware drivers */
|
||||
/* Debug, them and re-enable this */
|
||||
pPriv->rootContext->destroy(pPriv->rootContext);
|
||||
#endif
|
||||
pPriv->rootDrawable->destroy(pPriv->rootDrawable);
|
||||
|
||||
xfree(pPriv);
|
||||
pPriv = NULL;
|
||||
|
||||
while (pScreenPriv->pVisual)
|
||||
{
|
||||
|
|
@ -727,18 +779,5 @@ glucoseCloseScreen (int index,
|
|||
xfree(pScreenPriv);
|
||||
pScreenPriv = NULL;
|
||||
|
||||
/* tear down glucose now */
|
||||
{
|
||||
GlucoseScreenPrivPtr pScreenPriv = GlucoseGetScreenPriv(pScreen);
|
||||
|
||||
__pGlxClient = serverClient;
|
||||
|
||||
pScreenPriv->rootContext->destroy(pScreenPriv->rootContext);
|
||||
pScreenPriv->rootDrawable->destroy(pScreenPriv->rootDrawable);
|
||||
|
||||
xfree(pScreenPriv);
|
||||
pScreenPriv = NULL;
|
||||
}
|
||||
|
||||
return (*pScreen->CloseScreen) (index, pScreen);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,11 +40,15 @@ glucoseFinishScreenInit (ScreenPtr pScreen);
|
|||
Bool
|
||||
glucoseScreenInit (ScreenPtr pScreen, int flags);
|
||||
|
||||
typedef void (*destroyGLXscreenProcPtr)(__GLXscreen *screen);
|
||||
|
||||
typedef struct {
|
||||
__GLXdrawable *rootDrawable;
|
||||
__GLXcontext *rootContext;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
DestroyPixmapProcPtr *DestroyPixmap;
|
||||
__GLXscreen *screen;
|
||||
destroyGLXscreenProcPtr destroyGLXscreen;
|
||||
} GlucoseScreenPrivRec, *GlucoseScreenPrivPtr;
|
||||
|
||||
extern int glucoseScreenPrivateIndex;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue