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>
/** 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);
};
*/
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;
*/
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;
*/
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;
*/
int
MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
- const mesa_glinterop_export_in *in,
+ mesa_glinterop_export_in *in,
mesa_glinterop_export_out *out);
*/
int
MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
- const mesa_glinterop_export_in *in,
+ mesa_glinterop_export_in *in,
mesa_glinterop_export_out *out);
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
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);
int
MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
- const mesa_glinterop_export_in *in,
+ mesa_glinterop_export_in *in,
mesa_glinterop_export_out *out)
{
_EGLDisplay *disp;
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);
};
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;
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;
}
_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
_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);
_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;
_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;
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);
};
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;