XQuartz: xpr: Cleanup some of the code and possibly fix part of the GLX Pixmap problem.
Split DRICreateSurface into 3 functions. Make CreateSurfaceForPixmap use xp_configure_surface. I suspect this is partly why GLXPixmaps never worked. It will require some more work and thoughts for pbuffers, unless we fake those with pixmaps and surfaces. (cherry picked from commit 9cf264e67744262b9f45079e6cd752eb3e3b0e08)
This commit is contained in:
parent
c5d52d4c37
commit
5c41b3f9c8
|
@ -344,6 +344,121 @@ DRIUpdateSurface(DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
|
||||||
xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc);
|
xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return NULL if an error occurs. */
|
||||||
|
static DRIDrawablePrivPtr
|
||||||
|
CreateSurfaceForWindow(ScreenPtr pScreen, WindowPtr pWin, xp_window_id *widPtr) {
|
||||||
|
DRIDrawablePrivPtr pDRIDrawablePriv;
|
||||||
|
xp_window_id wid = 0;
|
||||||
|
|
||||||
|
*widPtr = 0;
|
||||||
|
|
||||||
|
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
||||||
|
|
||||||
|
if (pDRIDrawablePriv == NULL) {
|
||||||
|
xp_error err;
|
||||||
|
xp_window_changes wc;
|
||||||
|
|
||||||
|
/* allocate a DRI Window Private record */
|
||||||
|
if (!(pDRIDrawablePriv = xalloc(sizeof(*pDRIDrawablePriv)))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pDRIDrawablePriv->pDraw = (DrawablePtr)pWin;
|
||||||
|
pDRIDrawablePriv->pScreen = pScreen;
|
||||||
|
pDRIDrawablePriv->refCount = 0;
|
||||||
|
pDRIDrawablePriv->drawableIndex = -1;
|
||||||
|
pDRIDrawablePriv->notifiers = NULL;
|
||||||
|
|
||||||
|
/* find the physical window */
|
||||||
|
wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE));
|
||||||
|
|
||||||
|
if (wid == 0) {
|
||||||
|
xfree(pDRIDrawablePriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate the physical surface */
|
||||||
|
err = xp_create_surface(wid, &pDRIDrawablePriv->sid);
|
||||||
|
|
||||||
|
if (err != Success) {
|
||||||
|
xfree(pDRIDrawablePriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make it visible */
|
||||||
|
wc.stack_mode = XP_MAPPED_ABOVE;
|
||||||
|
wc.sibling = 0;
|
||||||
|
err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc);
|
||||||
|
|
||||||
|
if (err != Success) {
|
||||||
|
xp_destroy_surface(pDRIDrawablePriv->sid);
|
||||||
|
xfree(pDRIDrawablePriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save private off of preallocated index */
|
||||||
|
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
|
||||||
|
pDRIDrawablePriv);
|
||||||
|
}
|
||||||
|
|
||||||
|
*widPtr = wid;
|
||||||
|
|
||||||
|
return pDRIDrawablePriv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return FALSE if an error occurs. */
|
||||||
|
static DRIDrawablePrivPtr
|
||||||
|
CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
|
||||||
|
DRIDrawablePrivPtr pDRIDrawablePriv;
|
||||||
|
|
||||||
|
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
|
||||||
|
|
||||||
|
if (pDRIDrawablePriv == NULL) {
|
||||||
|
xp_error err;
|
||||||
|
xp_window_changes wc;
|
||||||
|
|
||||||
|
/* allocate a DRI Window Private record */
|
||||||
|
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(*pDRIDrawablePriv)))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pDRIDrawablePriv->pDraw = (DrawablePtr)pPix;
|
||||||
|
pDRIDrawablePriv->pScreen = pScreen;
|
||||||
|
pDRIDrawablePriv->refCount = 0;
|
||||||
|
pDRIDrawablePriv->drawableIndex = -1;
|
||||||
|
pDRIDrawablePriv->notifiers = NULL;
|
||||||
|
|
||||||
|
/* Passing a null window id to Xplugin in 10.3+ asks for
|
||||||
|
an accelerated offscreen surface. */
|
||||||
|
|
||||||
|
err = xp_create_surface(0, &pDRIDrawablePriv->sid);
|
||||||
|
if (err != Success) {
|
||||||
|
xfree(pDRIDrawablePriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wc.x = 0;
|
||||||
|
wc.y = 0;
|
||||||
|
wc.width = pPix->drawable.width;
|
||||||
|
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 */
|
||||||
|
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
|
||||||
|
pDRIDrawablePriv);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pDRIDrawablePriv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
DRICreateSurface(ScreenPtr pScreen, Drawable id,
|
DRICreateSurface(ScreenPtr pScreen, Drawable id,
|
||||||
DrawablePtr pDrawable, xp_client_id client_id,
|
DrawablePtr pDrawable, xp_client_id client_id,
|
||||||
|
@ -351,107 +466,39 @@ DRICreateSurface(ScreenPtr pScreen, Drawable id,
|
||||||
void (*notify) (void *arg, void *data), void *notify_data)
|
void (*notify) (void *arg, void *data), void *notify_data)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv;
|
|
||||||
xp_window_id wid = 0;
|
xp_window_id wid = 0;
|
||||||
|
DRIDrawablePrivPtr pDRIDrawablePriv;
|
||||||
|
|
||||||
if (pDrawable->type == DRAWABLE_WINDOW) {
|
if (pDrawable->type == DRAWABLE_WINDOW) {
|
||||||
WindowPtr pWin = (WindowPtr)pDrawable;
|
pDRIDrawablePriv = CreateSurfaceForWindow(pScreen,
|
||||||
|
(WindowPtr)pDrawable, &wid);
|
||||||
|
|
||||||
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
if(NULL == pDRIDrawablePriv)
|
||||||
if (pDRIDrawablePriv == NULL) {
|
return FALSE; /*error*/
|
||||||
xp_error err;
|
|
||||||
xp_window_changes wc;
|
|
||||||
|
|
||||||
/* allocate a DRI Window Private record */
|
|
||||||
if (!(pDRIDrawablePriv = xalloc(sizeof(DRIDrawablePrivRec)))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pDRIDrawablePriv->pDraw = pDrawable;
|
|
||||||
pDRIDrawablePriv->pScreen = pScreen;
|
|
||||||
pDRIDrawablePriv->refCount = 0;
|
|
||||||
pDRIDrawablePriv->drawableIndex = -1;
|
|
||||||
pDRIDrawablePriv->notifiers = NULL;
|
|
||||||
|
|
||||||
/* find the physical window */
|
|
||||||
wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE));
|
|
||||||
if (wid == 0) {
|
|
||||||
xfree(pDRIDrawablePriv);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate the physical surface */
|
|
||||||
err = xp_create_surface(wid, &pDRIDrawablePriv->sid);
|
|
||||||
if (err != Success) {
|
|
||||||
xfree(pDRIDrawablePriv);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make it visible */
|
|
||||||
wc.stack_mode = XP_MAPPED_ABOVE;
|
|
||||||
wc.sibling = 0;
|
|
||||||
err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc);
|
|
||||||
if (err != Success)
|
|
||||||
{
|
|
||||||
xp_destroy_surface(pDRIDrawablePriv->sid);
|
|
||||||
xfree(pDRIDrawablePriv);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save private off of preallocated index */
|
|
||||||
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
|
|
||||||
pDRIDrawablePriv);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
||||||
else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
||||||
PixmapPtr pPix = (PixmapPtr)pDrawable;
|
pDRIDrawablePriv = CreateSurfaceForPixmap(pScreen,
|
||||||
|
(PixmapPtr)pDrawable);
|
||||||
|
|
||||||
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
|
if(NULL == pDRIDrawablePriv)
|
||||||
if (pDRIDrawablePriv == NULL) {
|
return FALSE; /*error*/
|
||||||
xp_error err;
|
|
||||||
|
|
||||||
/* allocate a DRI Window Private record */
|
|
||||||
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(DRIDrawablePrivRec)))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pDRIDrawablePriv->pDraw = pDrawable;
|
|
||||||
pDRIDrawablePriv->pScreen = pScreen;
|
|
||||||
pDRIDrawablePriv->refCount = 0;
|
|
||||||
pDRIDrawablePriv->drawableIndex = -1;
|
|
||||||
pDRIDrawablePriv->notifiers = NULL;
|
|
||||||
|
|
||||||
/* Passing a null window id to Xplugin in 10.3+ asks for
|
|
||||||
an accelerated offscreen surface. */
|
|
||||||
|
|
||||||
err = xp_create_surface(0, &pDRIDrawablePriv->sid);
|
|
||||||
if (err != Success) {
|
|
||||||
xfree(pDRIDrawablePriv);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save private off of preallocated index */
|
|
||||||
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
|
|
||||||
pDRIDrawablePriv);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
else { /* for GLX 1.3, a PBuffer */
|
else { /* for GLX 1.3, a PBuffer */
|
||||||
/* NOT_DONE */
|
/* NOT_DONE */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* 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 && wid != 0) {
|
||||||
{
|
|
||||||
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) {
|
||||||
|
|
Loading…
Reference in New Issue