aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xfree86
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xfree86')
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2.c35
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2.h9
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;