mesa_glinterop: make GL interop version field bidirectional
authorEmil Velikov <emil.velikov@collabora.com>
Thu, 21 Apr 2016 16:29:16 +0000 (17:29 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Tue, 24 May 2016 22:03:00 +0000 (23:03 +0100)
This allows clear and easy communication between the two.

Caller: Requesting information (struct vN)
Callee: I know how to deal with older version (vN-1) only. Here is your
data and the version I support.
Caller: Older version ? Sure I'll cap all access to the fields provided
by the older version (vN-1)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Tested-by: Tom Stellard <thomas.stellard@amd.com>
include/GL/internal/dri_interface.h
include/GL/mesa_glinterop.h
src/egl/drivers/dri2/egl_dri2.c
src/egl/main/eglapi.c
src/egl/main/eglapi.h
src/gallium/state_trackers/dri/dri2.c
src/glx/dri2_priv.h
src/glx/dri3_priv.h
src/glx/dri_common_interop.c
src/glx/glxclient.h
src/glx/glxcmds.c

index 4008658dcef6b4d293bbaaf7e51ac467b4c990ad..f80233b82b61fe7b67a7c96575cf10b40f82e1af 100644 (file)
@@ -414,7 +414,7 @@ struct __DRI2interopExtensionRec {
 
    /** Same as MesaGLInterop*ExportObject. */
    int (*export_object)(__DRIcontext *ctx,
-                        const mesa_glinterop_export_in *in,
+                        mesa_glinterop_export_in *in,
                         mesa_glinterop_export_out *out);
 };
 
index 0a22b9be32173f617465e17e03d5adf235537b6c..b805d63d3e144731853ccfe3336b0561037566df 100644 (file)
@@ -94,6 +94,11 @@ enum {
  */
 typedef struct _mesa_glinterop_device_info {
    /* The caller should set this to the version of the struct they support */
+   /* The callee will overwrite it if it supports a lower version.
+    *
+    * The caller should check the value and access up-to the version supported
+    * by the the callee.
+    */
    /* NOTE: Do not use the MESA_GLINTEROP_DEVICE_INFO_VERSION macro */
    uint32_t version;
 
@@ -117,6 +122,11 @@ typedef struct _mesa_glinterop_device_info {
  */
 typedef struct _mesa_glinterop_export_in {
    /* The caller should set this to the version of the struct they support */
+   /* The callee will overwrite it if it supports a lower version.
+    *
+    * The caller should check the value and access up-to the version supported
+    * by the the callee.
+    */
    /* NOTE: Do not use the MESA_GLINTEROP_EXPORT_IN_VERSION macro */
    uint32_t version;
 
@@ -177,6 +187,11 @@ typedef struct _mesa_glinterop_export_in {
  */
 typedef struct _mesa_glinterop_export_out {
    /* The caller should set this to the version of the struct they support */
+   /* The callee will overwrite it if it supports a lower version.
+    *
+    * The caller should check the value and access up-to the version supported
+    * by the the callee.
+    */
    /* NOTE: Do not use the MESA_GLINTEROP_EXPORT_OUT_VERSION macro */
    uint32_t version;
 
@@ -257,7 +272,7 @@ MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
  */
 int
 MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
-                             const mesa_glinterop_export_in *in,
+                             mesa_glinterop_export_in *in,
                              mesa_glinterop_export_out *out);
 
 
@@ -267,7 +282,7 @@ MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
  */
 int
 MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
-                             const mesa_glinterop_export_in *in,
+                             mesa_glinterop_export_in *in,
                              mesa_glinterop_export_out *out);
 
 
@@ -276,10 +291,10 @@ typedef int (PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC)(Display *dpy, GLXContext co
 typedef int (PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC)(EGLDisplay dpy, EGLContext context,
                                                      mesa_glinterop_device_info *out);
 typedef int (PFNMESAGLINTEROPGLXEXPORTOBJECTPROC)(Display *dpy, GLXContext context,
-                                                  const mesa_glinterop_export_in *in,
+                                                  mesa_glinterop_export_in *in,
                                                   mesa_glinterop_export_out *out);
 typedef int (PFNMESAGLINTEROPEGLEXPORTOBJECTPROC)(EGLDisplay dpy, EGLContext context,
-                                                  const mesa_glinterop_export_in *in,
+                                                  mesa_glinterop_export_in *in,
                                                   mesa_glinterop_export_out *out);
 
 #ifdef __cplusplus
index 6dcfd4930a904899fe2d5d3d336ce6b15fafe020..f954cd53a34d749550819c84c111afc9f258eea8 100644 (file)
@@ -2703,7 +2703,7 @@ dri2_interop_query_device_info(_EGLDisplay *dpy, _EGLContext *ctx,
 
 static int
 dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
index c8d7c23944a5617634c1a9c2933aec4bceb64125..098bed0518a0923d73e13add0ed67c982a830d4a 100644 (file)
@@ -1961,7 +1961,7 @@ MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
 
 int
 MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
-                             const mesa_glinterop_export_in *in,
+                             mesa_glinterop_export_in *in,
                              mesa_glinterop_export_out *out)
 {
    _EGLDisplay *disp;
index 58327fd1015c1583fb36634a65f0515e64c45158..4df17c026d14f391814b15c1c969b81a154a7817 100644 (file)
@@ -195,7 +195,7 @@ struct _egl_api
    int (*GLInteropQueryDeviceInfo)(_EGLDisplay *dpy, _EGLContext *ctx,
                                    mesa_glinterop_device_info *out);
    int (*GLInteropExportObject)(_EGLDisplay *dpy, _EGLContext *ctx,
-                                const mesa_glinterop_export_in *in,
+                                mesa_glinterop_export_in *in,
                                 mesa_glinterop_export_out *out);
 };
 
index 3a2a3cedc5aed2f9ed530405059dfb8e0e1b0f11..0c84bafe14e208abf257edb311a9bab09035f268 100644 (file)
@@ -1480,12 +1480,15 @@ dri2_interop_query_device_info(__DRIcontext *_ctx,
    out->vendor_id = screen->get_param(screen, PIPE_CAP_VENDOR_ID);
    out->device_id = screen->get_param(screen, PIPE_CAP_DEVICE_ID);
 
+   /* Instruct the caller that we support up-to version one of the interface */
+   out->version = 1;
+
    return MESA_GLINTEROP_SUCCESS;
 }
 
 static int
 dri2_interop_export_object(__DRIcontext *_ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out)
 {
    struct st_context_iface *st = dri_context(_ctx)->st;
@@ -1704,6 +1707,10 @@ dri2_interop_export_object(__DRIcontext *_ctx,
    if (res->target == PIPE_BUFFER)
       out->buf_offset += whandle.offset;
 
+   /* Instruct the caller that we support up-to version one of the interface */
+   in->version = 1;
+   out->version = 1;
+
    return MESA_GLINTEROP_SUCCESS;
 }
 
index 8a640728ec7316465d2d10e66aa83faded904d2f..edba31e8fee0ed1b6d8dd5ad618371e9a1f9d657 100644 (file)
@@ -76,7 +76,7 @@ dri2_interop_query_device_info(struct glx_context *ctx,
 
 _X_HIDDEN int
 dri2_interop_export_object(struct glx_context *ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out);
 
 #ifdef __cplusplus
index d4ecdf7a58e203d501cd3b910ad9f3baef1709dd..86ad17c4a5109b1b6b090aa631c0d82047ee31ed 100644 (file)
@@ -139,5 +139,5 @@ dri3_interop_query_device_info(struct glx_context *ctx,
 
 _X_HIDDEN int
 dri3_interop_export_object(struct glx_context *ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out);
index 4733f3caab31d3caeb3e96117108a88f0cb66c34..215aac46765a939fc0a7e359783158a81c011a1f 100644 (file)
@@ -47,7 +47,7 @@ dri2_interop_query_device_info(struct glx_context *ctx,
 
 _X_HIDDEN int
 dri2_interop_export_object(struct glx_context *ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out)
 {
    struct dri2_screen *psc = (struct dri2_screen*)ctx->psc;
@@ -76,7 +76,7 @@ dri3_interop_query_device_info(struct glx_context *ctx,
 
 _X_HIDDEN int
 dri3_interop_export_object(struct glx_context *ctx,
-                           const mesa_glinterop_export_in *in,
+                           mesa_glinterop_export_in *in,
                            mesa_glinterop_export_out *out)
 {
    struct dri3_screen *psc = (struct dri3_screen*)ctx->psc;
index 141e46a31cda51d84cf5f65d879d081e70bcc749..16acd4b9d02e01981442d75c04c198e3378ca7e0 100644 (file)
@@ -234,7 +234,7 @@ struct glx_context_vtable {
    int (*interop_query_device_info)(struct glx_context *ctx,
                                     mesa_glinterop_device_info *out);
    int (*interop_export_object)(struct glx_context *ctx,
-                                const mesa_glinterop_export_in *in,
+                                mesa_glinterop_export_in *in,
                                 mesa_glinterop_export_out *out);
 };
 
index b651953cf9cf97cd44f1bab3f2f70fe39c074819..589a87a038cb38d21d9d11b76f184595ef49bed9 100644 (file)
@@ -2721,7 +2721,7 @@ MesaGLInteropGLXQueryDeviceInfo(Display *dpy, GLXContext context,
 
 int
 MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
-                             const mesa_glinterop_export_in *in,
+                             mesa_glinterop_export_in *in,
                              mesa_glinterop_export_out *out)
 {
    struct glx_context *gc = (struct glx_context*)context;