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:
George Staplin 2009-01-12 19:30:43 -07:00 committed by Jeremy Huddleston
parent c5d52d4c37
commit 5c41b3f9c8

View File

@ -344,30 +344,26 @@ DRIUpdateSurface(DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc); xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc);
} }
Bool /* Return NULL if an error occurs. */
DRICreateSurface(ScreenPtr pScreen, Drawable id, static DRIDrawablePrivPtr
DrawablePtr pDrawable, xp_client_id client_id, CreateSurfaceForWindow(ScreenPtr pScreen, WindowPtr pWin, xp_window_id *widPtr) {
xp_surface_id *surface_id, unsigned int ret_key[2],
void (*notify) (void *arg, void *data), void *notify_data)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv; DRIDrawablePrivPtr pDRIDrawablePriv;
xp_window_id wid = 0; xp_window_id wid = 0;
if (pDrawable->type == DRAWABLE_WINDOW) { *widPtr = 0;
WindowPtr pWin = (WindowPtr)pDrawable;
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin); pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
if (pDRIDrawablePriv == NULL) { if (pDRIDrawablePriv == NULL) {
xp_error err; xp_error err;
xp_window_changes wc; xp_window_changes wc;
/* allocate a DRI Window Private record */ /* allocate a DRI Window Private record */
if (!(pDRIDrawablePriv = xalloc(sizeof(DRIDrawablePrivRec)))) { if (!(pDRIDrawablePriv = xalloc(sizeof(*pDRIDrawablePriv)))) {
return FALSE; return NULL;
} }
pDRIDrawablePriv->pDraw = pDrawable; pDRIDrawablePriv->pDraw = (DrawablePtr)pWin;
pDRIDrawablePriv->pScreen = pScreen; pDRIDrawablePriv->pScreen = pScreen;
pDRIDrawablePriv->refCount = 0; pDRIDrawablePriv->refCount = 0;
pDRIDrawablePriv->drawableIndex = -1; pDRIDrawablePriv->drawableIndex = -1;
@ -375,49 +371,58 @@ DRICreateSurface(ScreenPtr pScreen, Drawable id,
/* find the physical window */ /* find the physical window */
wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE)); wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE));
if (wid == 0) { if (wid == 0) {
xfree(pDRIDrawablePriv); xfree(pDRIDrawablePriv);
return FALSE; return NULL;
} }
/* allocate the physical surface */ /* allocate the physical surface */
err = xp_create_surface(wid, &pDRIDrawablePriv->sid); err = xp_create_surface(wid, &pDRIDrawablePriv->sid);
if (err != Success) { if (err != Success) {
xfree(pDRIDrawablePriv); xfree(pDRIDrawablePriv);
return FALSE; return NULL;
} }
/* Make it visible */ /* Make it visible */
wc.stack_mode = XP_MAPPED_ABOVE; wc.stack_mode = XP_MAPPED_ABOVE;
wc.sibling = 0; wc.sibling = 0;
err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc); err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc);
if (err != Success)
{ if (err != Success) {
xp_destroy_surface(pDRIDrawablePriv->sid); xp_destroy_surface(pDRIDrawablePriv->sid);
xfree(pDRIDrawablePriv); xfree(pDRIDrawablePriv);
return FALSE; return NULL;
} }
/* save private off of preallocated index */ /* save private off of preallocated index */
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
pDRIDrawablePriv); pDRIDrawablePriv);
} }
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 *widPtr = wid;
else if (pDrawable->type == DRAWABLE_PIXMAP) {
PixmapPtr pPix = (PixmapPtr)pDrawable; return pDRIDrawablePriv;
}
/* Return FALSE if an error occurs. */
static DRIDrawablePrivPtr
CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
DRIDrawablePrivPtr pDRIDrawablePriv;
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix); pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(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(DRIDrawablePrivRec)))) { if (!(pDRIDrawablePriv = xcalloc(1, sizeof(*pDRIDrawablePriv)))) {
return FALSE; return NULL;
} }
pDRIDrawablePriv->pDraw = pDrawable; pDRIDrawablePriv->pDraw = (DrawablePtr)pPix;
pDRIDrawablePriv->pScreen = pScreen; pDRIDrawablePriv->pScreen = pScreen;
pDRIDrawablePriv->refCount = 0; pDRIDrawablePriv->refCount = 0;
pDRIDrawablePriv->drawableIndex = -1; pDRIDrawablePriv->drawableIndex = -1;
@ -429,29 +434,71 @@ DRICreateSurface(ScreenPtr pScreen, Drawable id,
err = xp_create_surface(0, &pDRIDrawablePriv->sid); err = xp_create_surface(0, &pDRIDrawablePriv->sid);
if (err != Success) { if (err != Success) {
xfree(pDRIDrawablePriv); xfree(pDRIDrawablePriv);
return FALSE; 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 */ /* save private off of preallocated index */
dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
pDRIDrawablePriv); pDRIDrawablePriv);
} }
return pDRIDrawablePriv;
}
Bool
DRICreateSurface(ScreenPtr pScreen, Drawable id,
DrawablePtr pDrawable, xp_client_id client_id,
xp_surface_id *surface_id, unsigned int ret_key[2],
void (*notify) (void *arg, void *data), void *notify_data)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
xp_window_id wid = 0;
DRIDrawablePrivPtr pDRIDrawablePriv;
if (pDrawable->type == DRAWABLE_WINDOW) {
pDRIDrawablePriv = CreateSurfaceForWindow(pScreen,
(WindowPtr)pDrawable, &wid);
if(NULL == pDRIDrawablePriv)
return FALSE; /*error*/
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
else if (pDrawable->type == DRAWABLE_PIXMAP) {
pDRIDrawablePriv = CreateSurfaceForPixmap(pScreen,
(PixmapPtr)pDrawable);
if(NULL == pDRIDrawablePriv)
return FALSE; /*error*/
} }
#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) {