diff options
Diffstat (limited to 'xorg-server/hw/xfree86')
-rw-r--r-- | xorg-server/hw/xfree86/dri2/dri2.c | 35 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/dri2/dri2.h | 9 |
2 files changed, 36 insertions, 8 deletions
diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c index babf32f13..d0f17896d 100644 --- a/xorg-server/hw/xfree86/dri2/dri2.c +++ b/xorg-server/hw/xfree86/dri2/dri2.c @@ -104,7 +104,8 @@ typedef struct _DRI2Screen { DRI2ScheduleSwapProcPtr ScheduleSwap; DRI2GetMSCProcPtr GetMSC; DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC; - DRI2AuthMagicProcPtr AuthMagic; + DRI2AuthMagic2ProcPtr AuthMagic; + DRI2AuthMagicProcPtr LegacyAuthMagic; DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify; DRI2SwapLimitValidateProcPtr SwapLimitValidate; DRI2GetParamProcPtr GetParam; @@ -1110,12 +1111,22 @@ DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd, return TRUE; } +static Bool +DRI2AuthMagic (ScreenPtr pScreen, uint32_t magic) +{ + DRI2ScreenPtr ds = DRI2GetScreen(pScreen); + if (ds == NULL || (*ds->LegacyAuthMagic) (ds->fd, magic)) + return FALSE; + + return TRUE; +} + Bool DRI2Authenticate(ScreenPtr pScreen, uint32_t magic) { DRI2ScreenPtr ds = DRI2GetScreen(pScreen); - if (ds == NULL || (*ds->AuthMagic) (ds->fd, magic)) + if (ds == NULL || (*ds->AuthMagic) (pScreen, magic)) return FALSE; return TRUE; @@ -1202,8 +1213,11 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) cur_minor = 1; } + if (info->version >= 8) { + ds->AuthMagic = info->AuthMagic2; + } if (info->version >= 5) { - ds->AuthMagic = info->AuthMagic; + ds->LegacyAuthMagic = info->AuthMagic; } if (info->version >= 6) { @@ -1218,14 +1232,21 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) /* * if the driver doesn't provide an AuthMagic function or the info struct - * version is too low, it relies on the old method (using libdrm) or fail + * version is too low, call through LegacyAuthMagic */ - if (!ds->AuthMagic) + if (!ds->AuthMagic) { + ds->AuthMagic = DRI2AuthMagic; + /* + * If the driver doesn't provide an AuthMagic function + * it relies on the old method (using libdrm) or fails + */ + if (!ds->LegacyAuthMagic) #ifdef WITH_LIBDRM - ds->AuthMagic = drmAuthMagic; + ds->LegacyAuthMagic = drmAuthMagic; #else - goto err_out; + goto err_out; #endif + } /* Initialize minor if needed and set to minimum provied by DDX */ if (!dri2_minor || dri2_minor > cur_minor) diff --git a/xorg-server/hw/xfree86/dri2/dri2.h b/xorg-server/hw/xfree86/dri2/dri2.h index f849be67a..4fd0fbc52 100644 --- a/xorg-server/hw/xfree86/dri2/dri2.h +++ b/xorg-server/hw/xfree86/dri2/dri2.h @@ -64,6 +64,7 @@ typedef void (*DRI2CopyRegionProcPtr) (DrawablePtr pDraw, DRI2BufferPtr pSrcBuffer); typedef void (*DRI2WaitProcPtr) (WindowPtr pWin, unsigned int sequence); typedef int (*DRI2AuthMagicProcPtr) (int fd, uint32_t magic); +typedef int (*DRI2AuthMagic2ProcPtr) (ScreenPtr pScreen, uint32_t magic); /** * Schedule a buffer swap @@ -192,7 +193,7 @@ typedef int (*DRI2GetParamProcPtr) (ClientPtr client, /** * Version of the DRI2InfoRec structure defined in this header */ -#define DRI2INFOREC_VERSION 7 +#define DRI2INFOREC_VERSION 8 typedef struct { unsigned int version; /**< Version of this struct */ @@ -229,6 +230,12 @@ typedef struct { /* added in version 7 */ DRI2GetParamProcPtr GetParam; + + /* added in version 8 */ + /* AuthMagic callback which passes extra context */ + /* If this is NULL the AuthMagic callback is used */ + /* If this is non-NULL the AuthMagic callback is ignored */ + DRI2AuthMagic2ProcPtr AuthMagic2; } DRI2InfoRec, *DRI2InfoPtr; extern _X_EXPORT int DRI2EventBase; |