From: Martin Peres <martin.pe...@labri.fr>

Signed-off-by: Martin Peres <martin.peres at labri.fr>
---
 glx/glxdri2.c             |  3 ++-
 hw/xfree86/dri2/dri2.c    | 11 ++++++++++-
 hw/xfree86/dri2/dri2.h    |  8 ++++++--
 hw/xfree86/dri2/dri2ext.c |  8 ++++++--
 4 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index bce1bfa..ead24bc 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -929,6 +929,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     __GLXDRIscreen *screen;
     size_t buffer_size;
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    unsigned char devReqAuth;

     screen = calloc(1, sizeof *screen);
     if (screen == NULL)
@@ -936,7 +937,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)

     if (!xf86LoaderCheckSymbol("DRI2Connect") ||
         !DRI2Connect(serverClient, pScreen, DRI2DriverDRI,
-                     &screen->fd, &driverName, &deviceName)) {
+                     &screen->fd, &driverName, &deviceName, &devReqAuth)) {
         LogMessage(X_INFO,
                    "AIGLX: Screen %d is not DRI2 capable\n", pScreen->myNum);
         return NULL;
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 40963c3..6238caa 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -115,6 +115,7 @@ typedef struct _DRI2Screen {
     int fd;
     unsigned int lastSequence;
     int prime_id;
+    unsigned int device_requires_auth;

     DRI2CreateBufferProcPtr CreateBuffer;
     DRI2DestroyBufferProcPtr DestroyBuffer;
@@ -1317,7 +1318,8 @@ DRI2HasSwapControl(ScreenPtr pScreen)
 Bool
 DRI2Connect(ClientPtr client, ScreenPtr pScreen,
             unsigned int driverType, int *fd,
-            const char **driverName, const char **deviceName)
+            const char **driverName, const char **deviceName,
+           unsigned char *deviceRequiresAuth)
 {
     DRI2ScreenPtr ds;
     uint32_t prime_id = DRI2DriverPrimeId(driverType);
@@ -1503,6 +1505,13 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
         ds->DestroyBuffer2 = info->DestroyBuffer2;
         ds->CopyRegion2 = info->CopyRegion2;
     }
+    
+    if (info->version >= 10) {
+        ds->device_requires_auth = info->device_requires_auth;
+        xf86DrvMsg(pScreen->myNum, X_INFO,
+                   "[DRI2] The device %s authentication\n",
+                  info->device_requires_auth?"requires":"doesn't require");
+    }

     /*
      * if the driver doesn't provide an AuthMagic function or the info struct
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index 1e7afdd..f855565 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -205,7 +205,7 @@ typedef int (*DRI2GetParamProcPtr) (ClientPtr client,
 /**
  * Version of the DRI2InfoRec structure defined in this header
  */
-#define DRI2INFOREC_VERSION 9
+#define DRI2INFOREC_VERSION 10

 typedef struct {
     unsigned int version;       /**< Version of this struct */
@@ -252,6 +252,9 @@ typedef struct {
     DRI2CreateBuffer2ProcPtr CreateBuffer2;
     DRI2DestroyBuffer2ProcPtr DestroyBuffer2;
     DRI2CopyRegion2ProcPtr CopyRegion2;
+    
+     /* added in version 10 */
+     unsigned char device_requires_auth;
 } DRI2InfoRec, *DRI2InfoPtr;

 extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info);
@@ -264,7 +267,8 @@ extern _X_EXPORT Bool DRI2Connect(ClientPtr client, 
ScreenPtr pScreen,
                                   unsigned int driverType,
                                   int *fd,
                                   const char **driverName,
-                                  const char **deviceName);
+                                  const char **deviceName,
+                                 unsigned char *deviceRequiresAuth);

 extern _X_EXPORT Bool DRI2Authenticate(ClientPtr client, ScreenPtr pScreen, 
uint32_t magic);

diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index e1decec..1a78916 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -107,12 +107,14 @@ ProcDRI2Connect(ClientPtr client)
         .sequenceNumber = client->sequence,
         .length = 0,
         .driverNameLength = 0,
-        .deviceNameLength = 0
+        .deviceNameLength = 0,
+        .deviceRequiresAuth = 1
     };
     DrawablePtr pDraw;
     int fd, status;
     const char *driverName;
     const char *deviceName;
+    unsigned char deviceRequiresAuth;

     REQUEST_SIZE_MATCH(xDRI2ConnectReq);
     if (!validDrawable(client, stuff->window, DixGetAttrAccess,
@@ -120,11 +122,13 @@ ProcDRI2Connect(ClientPtr client)
         return status;

     if (!DRI2Connect(client, pDraw->pScreen,
-                     stuff->driverType, &fd, &driverName, &deviceName))
+                     stuff->driverType, &fd, &driverName, &deviceName, 
+                    &deviceRequiresAuth))
         goto fail;

     rep.driverNameLength = strlen(driverName);
     rep.deviceNameLength = strlen(deviceName);
+    rep.deviceRequiresAuth = deviceRequiresAuth;
     rep.length = (rep.driverNameLength + 3) / 4 +
         (rep.deviceNameLength + 3) / 4;

-- 
1.8.0.1

Reply via email to