[Mesa-dev] [PATCH 3/5] egl: implement EGL part of interop interface (v3)
Marek Olšák
maraeo at gmail.com
Wed Mar 9 12:31:11 UTC 2016
From: Marek Olšák <marek.olsak at amd.com>
v2: - use const
v3: - add in/out_size parameters
---
src/egl/drivers/dri2/egl_dri2.c | 37 ++++++++++++++++++++
src/egl/drivers/dri2/egl_dri2.h | 1 +
src/egl/main/eglapi.c | 76 +++++++++++++++++++++++++++++++++++++++++
src/egl/main/eglapi.h | 12 +++++++
4 files changed, 126 insertions(+)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 8f50f0c..3522dfa 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,38 @@ dri2_server_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync)
return EGL_TRUE;
}
+static int
+dri2_interop_query_device_info(_EGLDisplay *dpy, _EGLContext *ctx,
+ unsigned out_size,
+ 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_size, out);
+}
+
+static int
+dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx,
+ unsigned in_size,
+ const mesa_glinterop_export_in *in,
+ unsigned out_size,
+ 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_size, in, out_size, out);
+}
+
static void
dri2_unload(_EGLDriver *drv)
{
@@ -2622,6 +2657,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..e4ec5c0 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,78 @@ 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,
+ unsigned out_size,
+ 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_size, out);
+ else
+ ret = MESA_GLINTEROP_UNSUPPORTED;
+
+ _eglUnlockDisplay(disp);
+ return ret;
+}
+
+GLAPI int GLAPIENTRY
+MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
+ unsigned in_size,
+ const mesa_glinterop_export_in *in,
+ unsigned out_size,
+ 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_size, in,
+ out_size, 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..25d74ef 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,15 @@ struct _egl_api
EGLBoolean (*ExportDMABUFImageMESA)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLImage *img, EGLint *fds,
EGLint *strides, EGLint *offsets);
+
+ int (*GLInteropQueryDeviceInfo)(_EGLDisplay *dpy, _EGLContext *ctx,
+ unsigned out_size,
+ mesa_glinterop_device_info *out);
+ int (*GLInteropExportObject)(_EGLDisplay *dpy, _EGLContext *ctx,
+ unsigned in_size,
+ const mesa_glinterop_export_in *in,
+ unsigned out_size,
+ mesa_glinterop_export_out *out);
};
--
2.5.0
More information about the mesa-dev
mailing list