aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/dri3
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/dri3')
-rw-r--r--xorg-server/dri3/dri3.h14
-rw-r--r--xorg-server/dri3/dri3_request.c38
-rw-r--r--xorg-server/dri3/dri3_screen.c16
3 files changed, 51 insertions, 17 deletions
diff --git a/xorg-server/dri3/dri3.h b/xorg-server/dri3/dri3.h
index 7c0c33018..edc7fa267 100644
--- a/xorg-server/dri3/dri3.h
+++ b/xorg-server/dri3/dri3.h
@@ -30,12 +30,17 @@
#include <X11/extensions/dri3proto.h>
#include <randrstr.h>
-#define DRI3_SCREEN_INFO_VERSION 0
+#define DRI3_SCREEN_INFO_VERSION 1
typedef int (*dri3_open_proc)(ScreenPtr screen,
RRProviderPtr provider,
int *fd);
+typedef int (*dri3_open_client_proc)(ClientPtr client,
+ ScreenPtr screen,
+ RRProviderPtr provider,
+ int *fd);
+
typedef PixmapPtr (*dri3_pixmap_from_fd_proc) (ScreenPtr screen,
int fd,
CARD16 width,
@@ -55,11 +60,18 @@ typedef struct dri3_screen_info {
dri3_open_proc open;
dri3_pixmap_from_fd_proc pixmap_from_fd;
dri3_fd_from_pixmap_proc fd_from_pixmap;
+
+ /* Version 1 */
+ dri3_open_client_proc open_client;
+
} dri3_screen_info_rec, *dri3_screen_info_ptr;
extern _X_EXPORT Bool
dri3_screen_init(ScreenPtr screen, dri3_screen_info_ptr info);
+extern _X_EXPORT int
+dri3_send_open_reply(ClientPtr client, int fd);
+
#endif
#endif /* _DRI3_H_ */
diff --git a/xorg-server/dri3/dri3_request.c b/xorg-server/dri3/dri3_request.c
index 31dce83f6..fe45620c9 100644
--- a/xorg-server/dri3/dri3_request.c
+++ b/xorg-server/dri3/dri3_request.c
@@ -55,16 +55,35 @@ proc_dri3_query_version(ClientPtr client)
return Success;
}
-static int
-proc_dri3_open(ClientPtr client)
+int
+dri3_send_open_reply(ClientPtr client, int fd)
{
- REQUEST(xDRI3OpenReq);
xDRI3OpenReply rep = {
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.length = 0,
};
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber);
+ swapl(&rep.length);
+ }
+
+ if (WriteFdToClient(client, fd, TRUE) < 0) {
+ close(fd);
+ return BadAlloc;
+ }
+
+ WriteToClient(client, sizeof (rep), &rep);
+
+ return Success;
+}
+
+static int
+proc_dri3_open(ClientPtr client)
+{
+ REQUEST(xDRI3OpenReq);
RRProviderPtr provider;
DrawablePtr drawable;
ScreenPtr screen;
@@ -92,17 +111,8 @@ proc_dri3_open(ClientPtr client)
if (status != Success)
return status;
- if (client->swapped) {
- swaps(&rep.sequenceNumber);
- swapl(&rep.length);
- }
-
- if (WriteFdToClient(client, fd, TRUE) < 0) {
- close(fd);
- return BadAlloc;
- }
-
- WriteToClient(client, sizeof (rep), &rep);
+ if (client->ignoreCount == 0)
+ return dri3_send_open_reply(client, fd);
return Success;
}
diff --git a/xorg-server/dri3/dri3_screen.c b/xorg-server/dri3/dri3_screen.c
index c88029612..6c0c60cbf 100644
--- a/xorg-server/dri3/dri3_screen.c
+++ b/xorg-server/dri3/dri3_screen.c
@@ -30,6 +30,14 @@
#include <misyncshm.h>
#include <randrstr.h>
+static inline Bool has_open(dri3_screen_info_ptr info) {
+ if (info == NULL)
+ return FALSE;
+
+ return info->open != NULL ||
+ (info->version >= 1 && info->open_client != NULL);
+}
+
int
dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd)
{
@@ -37,10 +45,14 @@ dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd)
dri3_screen_info_ptr info = ds->info;
int rc;
- if (!info || !info->open)
+ if (!has_open(info))
return BadMatch;
- rc = (*info->open) (screen, provider, fd);
+ if (info->version >= 1 && info->open_client != NULL)
+ rc = (*info->open_client) (client, screen, provider, fd);
+ else
+ rc = (*info->open) (screen, provider, fd);
+
if (rc != Success)
return rc;