diff options
author | Keith Packard <keithp@keithp.com> | 2014-04-04 16:28:43 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-04-08 13:53:58 -0700 |
commit | 6ec04a75deb1695820e337abbefe1929d5928f15 (patch) | |
tree | 0903165f7fd9a33057ca57f4ead137c1d7d2b1c6 | |
parent | 901fbfbbbd71c0d82080957f8ba09eebbc786f2b (diff) |
dri3: Fix dri3_open API change by adding new dri3_open_client
Xwayland will eventually need the current client in dri3_open. Simply
changing that API is not an option though as other drivers that
implement DRI3 will not have a matching function signature and will
crash when called.
Add a new dri3_open_client function pointer and bump
DRI3_SCREEN_INFO_VERSION so that drivers can be aware of the new
function which will be used in preference to the old function when
available.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Eric Anhole <eric@anholt.net>
-rw-r--r-- | dri3/dri3.h | 14 | ||||
-rw-r--r-- | dri3/dri3_screen.c | 16 | ||||
-rw-r--r-- | glamor/glamor_egl.c | 12 |
3 files changed, 31 insertions, 11 deletions
diff --git a/dri3/dri3.h b/dri3/dri3.h index 1c04cbd2d..edc7fa267 100644 --- a/dri3/dri3.h +++ b/dri3/dri3.h @@ -30,13 +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)(ClientPtr client, - ScreenPtr screen, +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, @@ -56,6 +60,10 @@ 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 diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c index bbf1d05a9..6c0c60cbf 100644 --- a/dri3/dri3_screen.c +++ b/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) (client, 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; diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index e2b6a9226..d37de9b95 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -608,10 +608,10 @@ glamor_egl_close_screen(ScreenPtr screen) } static int -glamor_dri3_open(ClientPtr client, - ScreenPtr screen, - RRProviderPtr provider, - int *fdp) +glamor_dri3_open_client(ClientPtr client, + ScreenPtr screen, + RRProviderPtr provider, + int *fdp) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); struct glamor_egl_screen_private *glamor_egl = @@ -658,8 +658,8 @@ glamor_dri3_open(ClientPtr client, } static dri3_screen_info_rec glamor_dri3_info = { - .version = 0, - .open = glamor_dri3_open, + .version = 1, + .open_client = glamor_dri3_open_client, .pixmap_from_fd = glamor_pixmap_from_fd, .fd_from_pixmap = glamor_fd_from_pixmap, }; |