From: Emil Velikov Date: Thu, 21 Apr 2016 16:29:16 +0000 (+0100) Subject: mesa_glinterop: make GL interop version field bidirectional X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e384d75b120ce60954c545e8c6edbe98fd01bea7;p=mesa.git mesa_glinterop: make GL interop version field bidirectional 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 Reviewed-by: Marek Olšák Tested-by: Tom Stellard --- diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 4008658dcef..f80233b82b6 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -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); }; diff --git a/include/GL/mesa_glinterop.h b/include/GL/mesa_glinterop.h index 0a22b9be321..b805d63d3e1 100644 --- a/include/GL/mesa_glinterop.h +++ b/include/GL/mesa_glinterop.h @@ -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 diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 6dcfd4930a9..f954cd53a34 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -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); diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index c8d7c23944a..098bed0518a 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -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; diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index 58327fd1015..4df17c026d1 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -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); }; diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 3a2a3cedc5a..0c84bafe14e 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -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; } diff --git a/src/glx/dri2_priv.h b/src/glx/dri2_priv.h index 8a640728ec7..edba31e8fee 100644 --- a/src/glx/dri2_priv.h +++ b/src/glx/dri2_priv.h @@ -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 diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h index d4ecdf7a58e..86ad17c4a51 100644 --- a/src/glx/dri3_priv.h +++ b/src/glx/dri3_priv.h @@ -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); diff --git a/src/glx/dri_common_interop.c b/src/glx/dri_common_interop.c index 4733f3caab3..215aac46765 100644 --- a/src/glx/dri_common_interop.c +++ b/src/glx/dri_common_interop.c @@ -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; diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 141e46a31cd..16acd4b9d02 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -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); }; diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index b651953cf9c..589a87a038c 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -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;