XQuartz: xpr: The dri.c code for pixmaps was wrong in several ways. They weren't
being exported correctly by Xplugin. This should fix a bug with the surface for a window, when an export fails. Before the export could fail and leave behind an invalid (freed) pointer in the dix privates. I have an idea of how to fix the GLXPixmaps now without using CGLSetOffScreen. This work is a step towards that. The Xplugin will need a small patch to fix an issue that this change brought forth. (cherry picked from commit 58c4116c47543b5e30c2232e7bee8efc0b9be176)
This commit is contained in:
parent
b17d6bed97
commit
d229ba7068
|
@ -406,7 +406,7 @@ CreateSurfaceForWindow(ScreenPtr pScreen, WindowPtr pWin, xp_window_id *widPtr)
|
||||||
return pDRIDrawablePriv;
|
return pDRIDrawablePriv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return FALSE if an error occurs. */
|
/* Return NULL if an error occurs. */
|
||||||
static DRIDrawablePrivPtr
|
static DRIDrawablePrivPtr
|
||||||
CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
|
CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv;
|
DRIDrawablePrivPtr pDRIDrawablePriv;
|
||||||
|
@ -415,7 +415,6 @@ CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
|
||||||
|
|
||||||
if (pDRIDrawablePriv == NULL) {
|
if (pDRIDrawablePriv == NULL) {
|
||||||
xp_error err;
|
xp_error err;
|
||||||
xp_window_changes wc;
|
|
||||||
|
|
||||||
/* allocate a DRI Window Private record */
|
/* allocate a DRI Window Private record */
|
||||||
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(*pDRIDrawablePriv)))) {
|
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(*pDRIDrawablePriv)))) {
|
||||||
|
@ -437,18 +436,10 @@ CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
wc.x = 0;
|
/*
|
||||||
wc.y = 0;
|
* The DRIUpdateSurface will be called to resize the surface
|
||||||
wc.width = pPix->drawable.width;
|
* after this function, if the export is successful.
|
||||||
wc.height = pPix->drawable.height;
|
*/
|
||||||
|
|
||||||
err = xp_configure_surface(pDRIDrawablePriv->sid, XP_BOUNDS, &wc);
|
|
||||||
|
|
||||||
if(err != Success) {
|
|
||||||
xp_destroy_surface(pDRIDrawablePriv->sid);
|
|
||||||
xfree(pDRIDrawablePriv);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save private off of preallocated index */
|
/* save private off of preallocated index */
|
||||||
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
|
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
|
||||||
|
@ -491,19 +482,37 @@ DRICreateSurface(ScreenPtr pScreen, Drawable id,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Finish initialization of new surfaces */
|
/* Finish initialization of new surfaces */
|
||||||
if (pDRIDrawablePriv->refCount == 0) {
|
if (pDRIDrawablePriv->refCount == 0) {
|
||||||
unsigned int key[2] = {0};
|
unsigned int key[2] = {0};
|
||||||
xp_error err;
|
xp_error err;
|
||||||
|
|
||||||
/* try to give the client access to the surface */
|
/* try to give the client access to the surface */
|
||||||
if (client_id != 0 && wid != 0) {
|
if (client_id != 0) {
|
||||||
|
/*
|
||||||
|
* Xplugin accepts a 0 wid if the surface id is offscreen, such
|
||||||
|
* as for a pixmap.
|
||||||
|
*/
|
||||||
err = xp_export_surface(wid, pDRIDrawablePriv->sid,
|
err = xp_export_surface(wid, pDRIDrawablePriv->sid,
|
||||||
client_id, key);
|
client_id, key);
|
||||||
if (err != Success) {
|
if (err != Success) {
|
||||||
xp_destroy_surface(pDRIDrawablePriv->sid);
|
xp_destroy_surface(pDRIDrawablePriv->sid);
|
||||||
xfree(pDRIDrawablePriv);
|
xfree(pDRIDrawablePriv);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now set the dix privates to NULL that were previously set.
|
||||||
|
* This prevents reusing an invalid pointer.
|
||||||
|
*/
|
||||||
|
if(pDrawable->type == DRAWABLE_WINDOW) {
|
||||||
|
WindowPtr pWin = (WindowPtr)pDrawable;
|
||||||
|
|
||||||
|
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
|
||||||
|
} else if(pDrawable->type == DRAWABLE_PIXMAP) {
|
||||||
|
PixmapPtr pPix = (PixmapPtr)pDrawable;
|
||||||
|
|
||||||
|
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue