xfree86: dri: extra safety checks for NULL pointers / disabled extension
Be more cautious on possible NULL pointers or not yet registered devPrivates. Better a gracefully fail instead of hard segfault. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
567898f17d
commit
9b17febf75
|
@ -105,6 +105,15 @@ drmServerInfo DRIDRMServerInfo;
|
||||||
*/
|
*/
|
||||||
#define DRI_MSG_VERBOSITY 1
|
#define DRI_MSG_VERBOSITY 1
|
||||||
|
|
||||||
|
static inline DRIScreenPrivPtr DRI_SCREEN_PRIV(ScreenPtr pScreen) {
|
||||||
|
if (!dixPrivateKeyRegistered(&DRIScreenPrivKeyRec))
|
||||||
|
return NULL;
|
||||||
|
if (!pScreen)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return dixLookupPrivate(&(pScreen)->devPrivates, DRIScreenPrivKey);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
|
DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
|
||||||
_X_ATTRIBUTE_PRINTF(3,4);
|
_X_ATTRIBUTE_PRINTF(3,4);
|
||||||
|
@ -286,6 +295,7 @@ static void
|
||||||
dri_crtc_notify(ScreenPtr pScreen)
|
dri_crtc_notify(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
assert(pDRIPriv);
|
||||||
|
|
||||||
DRIClipNotifyAllDrawables(pScreen);
|
DRIClipNotifyAllDrawables(pScreen);
|
||||||
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
|
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
|
||||||
|
@ -640,6 +650,8 @@ Bool
|
||||||
DRIFinishScreenInit(ScreenPtr pScreen)
|
DRIFinishScreenInit(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
/* Wrap DRI support */
|
/* Wrap DRI support */
|
||||||
|
@ -865,6 +877,8 @@ Bool
|
||||||
DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
|
DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
*hSAREA = pDRIPriv->hSAREA;
|
*hSAREA = pDRIPriv->hSAREA;
|
||||||
*busIdString = pDRIPriv->pDriverInfo->busIdString;
|
*busIdString = pDRIPriv->pDriverInfo->busIdString;
|
||||||
|
@ -876,6 +890,8 @@ Bool
|
||||||
DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
|
DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (drmAuthMagic(pDRIPriv->drmFD, magic))
|
if (drmAuthMagic(pDRIPriv->drmFD, magic))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -895,6 +911,8 @@ DRIGetClientDriverName(ScreenPtr pScreen,
|
||||||
int *ddxDriverPatchVersion, char **clientDriverName)
|
int *ddxDriverPatchVersion, char **clientDriverName)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
*ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
|
*ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
|
||||||
*ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
|
*ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
|
||||||
|
@ -921,6 +939,8 @@ DRICreateContextPriv(ScreenPtr pScreen,
|
||||||
drm_context_t * pHWContext, DRIContextFlags flags)
|
drm_context_t * pHWContext, DRIContextFlags flags)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
|
if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -933,10 +953,15 @@ DRIContextPrivPtr
|
||||||
DRICreateContextPrivFromHandle(ScreenPtr pScreen,
|
DRICreateContextPrivFromHandle(ScreenPtr pScreen,
|
||||||
drm_context_t hHWContext, DRIContextFlags flags)
|
drm_context_t hHWContext, DRIContextFlags flags)
|
||||||
{
|
{
|
||||||
|
assert(pScreen);
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return NULL;
|
||||||
DRIContextPrivPtr pDRIContextPriv;
|
DRIContextPrivPtr pDRIContextPriv;
|
||||||
int contextPrivSize;
|
int contextPrivSize;
|
||||||
|
|
||||||
|
assert(pDRIPriv);
|
||||||
|
|
||||||
contextPrivSize = sizeof(DRIContextPrivRec) +
|
contextPrivSize = sizeof(DRIContextPrivRec) +
|
||||||
pDRIPriv->pDriverInfo->contextSize;
|
pDRIPriv->pDriverInfo->contextSize;
|
||||||
if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
|
if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
|
||||||
|
@ -974,12 +999,12 @@ DRICreateContextPrivFromHandle(ScreenPtr pScreen,
|
||||||
Bool
|
Bool
|
||||||
DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
|
DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv;
|
|
||||||
|
|
||||||
if (!pDRIContextPriv)
|
if (!pDRIContextPriv)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
|
if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
|
||||||
/* Don't delete reserved contexts from
|
/* Don't delete reserved contexts from
|
||||||
|
@ -1003,9 +1028,14 @@ static Bool
|
||||||
DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
|
DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
DRIContextPrivPtr pDRIContextPriv;
|
DRIContextPrivPtr pDRIContextPriv;
|
||||||
void *contextStore;
|
void *contextStore;
|
||||||
|
|
||||||
|
assert(pDRIPriv);
|
||||||
|
assert(pDRIPriv->pSAREA);
|
||||||
if (!(pDRIContextPriv =
|
if (!(pDRIContextPriv =
|
||||||
DRICreateContextPriv(pScreen, &pDRIPriv->pSAREA->dummy_context, 0))) {
|
DRICreateContextPriv(pScreen, &pDRIPriv->pSAREA->dummy_context, 0))) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1031,6 +1061,8 @@ static void
|
||||||
DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
|
DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
|
DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
|
||||||
void *contextStore;
|
void *contextStore;
|
||||||
|
|
||||||
|
@ -1053,6 +1085,8 @@ DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
|
||||||
XID context, drm_context_t * pHWContext)
|
XID context, drm_context_t * pHWContext)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
DRIContextPrivPtr pDRIContextPriv;
|
DRIContextPrivPtr pDRIContextPriv;
|
||||||
void *contextStore;
|
void *contextStore;
|
||||||
|
|
||||||
|
@ -1099,12 +1133,12 @@ Bool
|
||||||
DRIContextPrivDelete(void *pResource, XID id)
|
DRIContextPrivDelete(void *pResource, XID id)
|
||||||
{
|
{
|
||||||
DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr) pResource;
|
DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr) pResource;
|
||||||
DRIScreenPrivPtr pDRIPriv;
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
|
||||||
void *contextStore;
|
if ((!pDRIPriv) || (!pDRIPriv->pDriverInfo))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
|
|
||||||
if (pDRIPriv->pDriverInfo->DestroyContext) {
|
if (pDRIPriv->pDriverInfo->DestroyContext) {
|
||||||
contextStore = DRIGetContextStore(pDRIContextPriv);
|
void *contextStore = DRIGetContextStore(pDRIContextPriv);
|
||||||
pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
|
pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
|
||||||
pDRIContextPriv->hwContext,
|
pDRIContextPriv->hwContext,
|
||||||
(DRIContextType) (long)
|
(DRIContextType) (long)
|
||||||
|
@ -1124,7 +1158,8 @@ DRIClipNotifyAllDrawables(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
|
for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
|
||||||
pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
|
pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
|
||||||
}
|
}
|
||||||
|
@ -1134,6 +1169,8 @@ static void
|
||||||
DRITransitionToSharedBuffers(ScreenPtr pScreen)
|
DRITransitionToSharedBuffers(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
DRIClipNotifyAllDrawables(pScreen);
|
DRIClipNotifyAllDrawables(pScreen);
|
||||||
|
@ -1146,6 +1183,8 @@ static void
|
||||||
DRITransitionToPrivateBuffers(ScreenPtr pScreen)
|
DRITransitionToPrivateBuffers(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
DRIClipNotifyAllDrawables(pScreen);
|
DRIClipNotifyAllDrawables(pScreen);
|
||||||
|
@ -1158,6 +1197,8 @@ static void
|
||||||
DRITransitionTo3d(ScreenPtr pScreen)
|
DRITransitionTo3d(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
DRIClipNotifyAllDrawables(pScreen);
|
DRIClipNotifyAllDrawables(pScreen);
|
||||||
|
@ -1170,6 +1211,8 @@ static void
|
||||||
DRITransitionTo2d(ScreenPtr pScreen)
|
DRITransitionTo2d(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
DRIClipNotifyAllDrawables(pScreen);
|
DRIClipNotifyAllDrawables(pScreen);
|
||||||
|
@ -1186,6 +1229,8 @@ DRIDCNTreeTraversal(WindowPtr pWin, void *data)
|
||||||
if (pDRIDrawablePriv) {
|
if (pDRIDrawablePriv) {
|
||||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return WT_WALKCHILDREN;
|
||||||
|
|
||||||
if (RegionNumRects(&pWin->clipList) > 0) {
|
if (RegionNumRects(&pWin->clipList) > 0) {
|
||||||
WindowPtr *pDRIWindows = (WindowPtr *) data;
|
WindowPtr *pDRIWindows = (WindowPtr *) data;
|
||||||
|
@ -1211,7 +1256,7 @@ DRIDriverClipNotify(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
|
||||||
if (pDRIPriv->pDriverInfo->ClipNotify) {
|
if (pDRIPriv && pDRIPriv->pDriverInfo && pDRIPriv->pDriverInfo->ClipNotify) {
|
||||||
WindowPtr *pDRIWindows = calloc(pDRIPriv->nrWindows, sizeof(WindowPtr));
|
WindowPtr *pDRIWindows = calloc(pDRIPriv->nrWindows, sizeof(WindowPtr));
|
||||||
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
|
||||||
|
|
||||||
|
@ -1231,6 +1276,8 @@ static void
|
||||||
DRIIncreaseNumberVisible(ScreenPtr pScreen)
|
DRIIncreaseNumberVisible(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (++pDRIPriv->nrWindowsVisible) {
|
switch (++pDRIPriv->nrWindowsVisible) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -1250,6 +1297,8 @@ static void
|
||||||
DRIDecreaseNumberVisible(ScreenPtr pScreen)
|
DRIDecreaseNumberVisible(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (--pDRIPriv->nrWindowsVisible) {
|
switch (--pDRIPriv->nrWindowsVisible) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -1270,6 +1319,9 @@ DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
|
||||||
drm_drawable_t * hHWDrawable)
|
drm_drawable_t * hHWDrawable)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv;
|
DRIDrawablePrivPtr pDRIDrawablePriv;
|
||||||
WindowPtr pWin;
|
WindowPtr pWin;
|
||||||
|
|
||||||
|
@ -1338,13 +1390,15 @@ DRIDrawablePrivDestroy(WindowPtr pWin)
|
||||||
{
|
{
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
||||||
ScreenPtr pScreen;
|
ScreenPtr pScreen;
|
||||||
DRIScreenPrivPtr pDRIPriv;
|
|
||||||
|
|
||||||
if (!pDRIDrawablePriv)
|
if (!pDRIDrawablePriv)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pScreen = pWin->drawable.pScreen;
|
pScreen = pWin->drawable.pScreen;
|
||||||
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
||||||
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
if (pDRIDrawablePriv->drawableIndex != -1) {
|
if (pDRIDrawablePriv->drawableIndex != -1) {
|
||||||
/* bump stamp to force outstanding 3D requests to resync */
|
/* bump stamp to force outstanding 3D requests to resync */
|
||||||
|
@ -1439,6 +1493,9 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
|
||||||
int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
|
int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
|
DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
|
||||||
WindowPtr pWin, pOldWin;
|
WindowPtr pWin, pOldWin;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1608,6 +1665,8 @@ DRIGetDeviceInfo(ScreenPtr pScreen,
|
||||||
int *fbStride, int *devPrivateSize, void **pDevPrivate)
|
int *fbStride, int *devPrivateSize, void **pDevPrivate)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
*hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
|
*hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
|
||||||
*fbOrigin = 0;
|
*fbOrigin = 0;
|
||||||
|
@ -1684,6 +1743,8 @@ void
|
||||||
DRIDoWakeupHandler(ScreenPtr pScreen, int result)
|
DRIDoWakeupHandler(ScreenPtr pScreen, int result)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
DRILock(pScreen, 0);
|
DRILock(pScreen, 0);
|
||||||
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
|
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
|
||||||
|
@ -1701,6 +1762,8 @@ void
|
||||||
DRIDoBlockHandler(ScreenPtr pScreen, void *timeout)
|
DRIDoBlockHandler(ScreenPtr pScreen, void *timeout)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
|
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
|
||||||
/* hide X context by swapping 2D component here */
|
/* hide X context by swapping 2D component here */
|
||||||
|
@ -1726,6 +1789,9 @@ DRISwapContext(int drmFD, void *oldctx, void *newctx)
|
||||||
DRIContextPrivPtr newContext = (DRIContextPrivPtr) newctx;
|
DRIContextPrivPtr newContext = (DRIContextPrivPtr) newctx;
|
||||||
ScreenPtr pScreen = newContext->pScreen;
|
ScreenPtr pScreen = newContext->pScreen;
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
void *oldContextStore = NULL;
|
void *oldContextStore = NULL;
|
||||||
DRIContextType oldContextType;
|
DRIContextType oldContextType;
|
||||||
void *newContextStore = NULL;
|
void *newContextStore = NULL;
|
||||||
|
@ -1880,7 +1946,7 @@ DRIWindowExposures(WindowPtr pWin, RegionPtr prgn)
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
||||||
|
|
||||||
if (pDRIDrawablePriv) {
|
if (pDRIPriv && pDRIDrawablePriv) {
|
||||||
(*pDRIPriv->pDriverInfo->InitBuffers) (pWin, prgn,
|
(*pDRIPriv->pDriverInfo->InitBuffers) (pWin, prgn,
|
||||||
pDRIDrawablePriv->drawableIndex);
|
pDRIDrawablePriv->drawableIndex);
|
||||||
}
|
}
|
||||||
|
@ -1908,6 +1974,8 @@ DRITreeTraversal(WindowPtr pWin, void *data)
|
||||||
if (pDRIDrawablePriv) {
|
if (pDRIDrawablePriv) {
|
||||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return WT_WALKCHILDREN;
|
||||||
|
|
||||||
if (RegionNumRects(&(pWin->clipList)) > 0) {
|
if (RegionNumRects(&(pWin->clipList)) > 0) {
|
||||||
RegionPtr reg = (RegionPtr) data;
|
RegionPtr reg = (RegionPtr) data;
|
||||||
|
@ -2146,24 +2214,24 @@ CARD32
|
||||||
DRIGetDrawableIndex(WindowPtr pWin)
|
DRIGetDrawableIndex(WindowPtr pWin)
|
||||||
{
|
{
|
||||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
||||||
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
||||||
CARD32 index;
|
if (pDRIDrawablePriv)
|
||||||
|
return pDRIDrawablePriv->drawableIndex;
|
||||||
|
|
||||||
if (pDRIDrawablePriv) {
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
index = pDRIDrawablePriv->drawableIndex;
|
if (pDRIPriv)
|
||||||
}
|
return pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
|
||||||
else {
|
|
||||||
index = pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
return index;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
|
DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
|
return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
|
||||||
}
|
}
|
||||||
|
@ -2172,6 +2240,8 @@ void
|
||||||
DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
|
DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
|
||||||
{
|
{
|
||||||
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return;
|
||||||
|
|
||||||
ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
|
ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
|
||||||
}
|
}
|
||||||
|
@ -2268,6 +2338,9 @@ DRIGetTexOffsetFuncs(ScreenPtr pScreen,
|
||||||
DRIWrappedFuncsRec *
|
DRIWrappedFuncsRec *
|
||||||
DRIGetWrappedFuncs(ScreenPtr pScreen)
|
DRIGetWrappedFuncs(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
|
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
||||||
|
if (!pDRIPriv)
|
||||||
|
return NULL;
|
||||||
return &(DRI_SCREEN_PRIV(pScreen)->wrap);
|
return &(DRI_SCREEN_PRIV(pScreen)->wrap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,10 +58,6 @@ struct _DRIContextPrivRec {
|
||||||
void **pContextStore;
|
void **pContextStore;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DRI_SCREEN_PRIV(pScreen) ((DRIScreenPrivPtr) \
|
|
||||||
(dixPrivateKeyRegistered(DRIScreenPrivKey) ? \
|
|
||||||
dixLookupPrivate(&(pScreen)->devPrivates, DRIScreenPrivKey) : NULL))
|
|
||||||
|
|
||||||
#define DRI_SCREEN_PRIV_FROM_INDEX(screenIndex) ((DRIScreenPrivPtr) \
|
#define DRI_SCREEN_PRIV_FROM_INDEX(screenIndex) ((DRIScreenPrivPtr) \
|
||||||
dixLookupPrivate(&screenInfo.screens[screenIndex]->devPrivates, \
|
dixLookupPrivate(&screenInfo.screens[screenIndex]->devPrivates, \
|
||||||
DRIScreenPrivKey))
|
DRIScreenPrivKey))
|
||||||
|
|
Loading…
Reference in New Issue