[Mesa-dev] [PATCH 3/5] egl: implement EGL part of interop interface (v2)

Aaron Watry awatry at gmail.com
Wed Apr 20 14:56:28 UTC 2016


Hi Marek,

This patch ended up breaking make check for me (src/egl/egl-symbols-check).

Also, while bisecting, it occurred to me that you pushed v2 of the series,
while you had previously sent a v3 to the mesa-dev list. Was pushing v2
intentional?

--Aaron

On Tue, Mar 8, 2016 at 4:52 PM, Marek Olšák <maraeo at gmail.com> wrote:

> From: Marek Olšák <marek.olsak at amd.com>
>
> v2: - use const
> ---
>  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..6e23b71 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,
> +                           const 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..e229334 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,
> +                             const 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..58327fd 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,
> +                                const mesa_glinterop_export_in *in,
> +                                mesa_glinterop_export_out *out);
>  };
>
>
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160420/7a4f1f0d/attachment.html>


More information about the mesa-dev mailing list