From: Marek Olšák <marek.ol...@amd.com> --- src/egl/drivers/dri2/egl_dri2.c | 32 ++++++++++++++++++ src/egl/drivers/dri2/egl_dri2.h | 1 + src/egl/main/eglapi.c | 72 +++++++++++++++++++++++++++++++++++++++++ src/egl/main/eglapi.h | 9 ++++++ 4 files changed, 114 insertions(+)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 8f50f0c..ef7c6a2 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -44,6 +44,7 @@ #endif #include <GL/gl.h> #include <GL/internal/dri_interface.h> +#include "GL/mesa_glinterop.h" #include <sys/types.h> #include <sys/stat.h> @@ -736,6 +737,8 @@ dri2_create_screen(_EGLDisplay *disp) if (strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) { dri2_dpy->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i]; } + if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0) + dri2_dpy->interop = (__DRI2interopExtension *) extensions[i]; } dri2_setup_screen(disp); @@ -2512,6 +2515,33 @@ dri2_server_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync) return EGL_TRUE; } +static int +dri2_interop_query_device_info(_EGLDisplay *dpy, _EGLContext *ctx, + mesa_glinterop_device_info *out) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); + + if (!dri2_dpy->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return dri2_dpy->interop->query_device_info(dri2_ctx->dri_context, out); +} + +static int +dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx, + mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); + + if (!dri2_dpy->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return dri2_dpy->interop->export_object(dri2_ctx->dri_context, in, out); +} + static void dri2_unload(_EGLDriver *drv) { @@ -2622,6 +2652,8 @@ _eglBuiltInDriverDRI2(const char *args) dri2_drv->base.API.ClientWaitSyncKHR = dri2_client_wait_sync; dri2_drv->base.API.WaitSyncKHR = dri2_server_wait_sync; dri2_drv->base.API.DestroySyncKHR = dri2_destroy_sync; + dri2_drv->base.API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info; + dri2_drv->base.API.GLInteropExportObject = dri2_interop_export_object; dri2_drv->base.Name = "DRI2"; dri2_drv->base.Unload = dri2_unload; diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 52ad92b..d83bc1e 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -174,6 +174,7 @@ struct dri2_egl_display const __DRI2configQueryExtension *config; const __DRI2fenceExtension *fence; const __DRI2rendererQueryExtension *rendererQuery; + const __DRI2interopExtension *interop; int fd; int own_device; diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 32f6823..3ed8c08 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -88,6 +88,7 @@ #include <string.h> #include "c99_compat.h" #include "c11/threads.h" +#include "GL/mesa_glinterop.h" #include "eglcompiler.h" #include "eglglobals.h" @@ -1905,3 +1906,74 @@ eglGetProcAddress(const char *procname) RETURN_EGL_SUCCESS(NULL, ret); } + +static int +_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context, + _EGLDisplay **disp, _EGLDriver **drv, + _EGLContext **ctx) +{ + + *disp = _eglLockDisplay(dpy); + if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) { + if (*disp) + _eglUnlockDisplay(*disp); + return MESA_GLINTEROP_INVALID_DISPLAY; + } + + *drv = (*disp)->Driver; + + *ctx = _eglLookupContext(context, *disp); + if (!*ctx || + ((*ctx)->ClientAPI != EGL_OPENGL_API && + (*ctx)->ClientAPI != EGL_OPENGL_ES_API)) { + _eglUnlockDisplay(*disp); + return MESA_GLINTEROP_INVALID_CONTEXT; + } + + return MESA_GLINTEROP_SUCCESS; +} + +GLAPI int GLAPIENTRY +MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context, + mesa_glinterop_device_info *out) +{ + _EGLDisplay *disp; + _EGLDriver *drv; + _EGLContext *ctx; + int ret; + + ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); + if (ret != MESA_GLINTEROP_SUCCESS) + return ret; + + if (drv->API.GLInteropQueryDeviceInfo) + ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out); + else + ret = MESA_GLINTEROP_UNSUPPORTED; + + _eglUnlockDisplay(disp); + return ret; +} + +GLAPI int GLAPIENTRY +MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context, + mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out) +{ + _EGLDisplay *disp; + _EGLDriver *drv; + _EGLContext *ctx; + int ret; + + ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); + if (ret != MESA_GLINTEROP_SUCCESS) + return ret; + + if (drv->API.GLInteropExportObject) + ret = drv->API.GLInteropExportObject(disp, ctx, in, out); + else + ret = MESA_GLINTEROP_UNSUPPORTED; + + _eglUnlockDisplay(disp); + return ret; +} diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index 3f6d3c2..4df17c0 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -42,6 +42,9 @@ extern "C" { typedef void (*_EGLProc)(void); struct wl_display; +typedef struct _mesa_glinterop_device_info mesa_glinterop_device_info; +typedef struct _mesa_glinterop_export_in mesa_glinterop_export_in; +typedef struct _mesa_glinterop_export_out mesa_glinterop_export_out; /** * The API dispatcher jumps through these functions @@ -188,6 +191,12 @@ struct _egl_api EGLBoolean (*ExportDMABUFImageMESA)(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img, EGLint *fds, EGLint *strides, EGLint *offsets); + + int (*GLInteropQueryDeviceInfo)(_EGLDisplay *dpy, _EGLContext *ctx, + mesa_glinterop_device_info *out); + int (*GLInteropExportObject)(_EGLDisplay *dpy, _EGLContext *ctx, + mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out); }; -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev