[Mesa-dev] [PATCH 3/3] egl: Implement EGL_EXT_device_{base, query, enumeration}
Eric Anholt
eric at anholt.net
Wed May 3 19:38:45 UTC 2017
Adam Jackson <ajax at redhat.com> writes:
> From: Jonny Lamb <jonny.lamb at collabora.co.uk>
>
> This is a rebase/squash/rewrite of a series Jonny had sent long ago. The
> major change is implementing this in terms of the drmDevice API. Both
> relevant piglits go from skip to pass on i965.
Just some style notes and one "why are we duplicating this code
badly?". With those fixed, I think it's past time to merge, so you can
put my r-b on.
I anticipate that the second device type implementation will end up
doing some refactoring, but I'm fine with not building the
infrastructure until we need it.
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
> src/egl/Makefile.sources | 2 +
> src/egl/drivers/dri2/egl_dri2.c | 64 +++++++++
> src/egl/main/eglapi.c | 79 ++++++++++++
> src/egl/main/eglapi.h | 4 +
> src/egl/main/egldevice.c | 280 ++++++++++++++++++++++++++++++++++++++++
> src/egl/main/egldevice.h | 74 +++++++++++
> src/egl/main/eglentrypoint.h | 10 ++
> src/egl/main/eglglobals.c | 12 +-
> src/egl/main/eglglobals.h | 2 +
> src/egl/main/egltypedefs.h | 4 +
> 10 files changed, 529 insertions(+), 2 deletions(-)
> create mode 100644 src/egl/main/egldevice.c
> create mode 100644 src/egl/main/egldevice.h
>
> diff --git a/src/egl/Makefile.sources b/src/egl/Makefile.sources
> index e6fd3f114c..bd13bfc06a 100644
> --- a/src/egl/Makefile.sources
> +++ b/src/egl/Makefile.sources
> @@ -11,6 +11,8 @@ LIBEGL_C_FILES := \
> main/eglcurrent.c \
> main/eglcurrent.h \
> main/egldefines.h \
> + main/egldevice.c \
> + main/egldevice.h \
> main/egldisplay.c \
> main/egldisplay.h \
> main/egldriver.c \
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 91456b025d..717ab0f860 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -57,6 +57,7 @@
>
> #include "egl_dri2.h"
> #include "loader/loader.h"
> +#include "egldevice.h"
> #include "util/u_atomic.h"
>
> /* The kernel header drm_fourcc.h defines the DRM formats below. We duplicate
> @@ -2861,6 +2862,67 @@ dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx,
> return dri2_dpy->interop->export_object(dri2_ctx->dri_context, in, out);
> }
>
> +#ifdef HAVE_LIBDRM
> +/* XXX kind of copypasta of drmCompareBusInfo */
> +static int
> +dri2_bus_info_equal(drmDevicePtr a, drmDevicePtr b)
> +{
> + if (a == NULL || b == NULL)
> + return 0;
> +
> + if (a->bustype != b->bustype)
> + return 0;
> +
> + if (a->bustype == DRM_BUS_PCI)
> + return !memcmp(a->businfo.pci, b->businfo.pci, sizeof(drmPciBusInfo));
> +
> + return 0;
> +}
> +#endif
Yeah, this looks like a worse version of drmCompareBusInfo(). Would you
be willing to export it from libdrm, instead? If not, please re-copy it
to get the usb/platform/host1x bits.
> +static EGLBoolean
> +dri2_query_device_from_display(_EGLDisplay *disp, _EGLDeviceInfo *info,
> + EGLAttrib *value)
> +{
> + EGLBoolean ret = EGL_FALSE;
> +#ifdef HAVE_LIBDRM
> + struct dri2_egl_display *dri2_dpy = disp->DriverData;
> + drmDevicePtr dev;
> + int i;
> +
> + if (dri2_dpy->fd == -1) {
> + *value = (EGLAttrib) info; /* a dummy value is fine */
> + return EGL_TRUE;
> + }
> +
> + if (drmGetDevice(dri2_dpy->fd, &dev) < 0)
> + return ret;
> +
> + /* loop over _EGLDisplayInfo to find a match */
> + for (i = 0; i < info->num_drm_devices; i++) {
> + if (dri2_bus_info_equal(dev, info->drm_devices[i])) {
> + *value = (EGLAttrib) info->drm_devices[i];
> + ret = EGL_TRUE;
> + break;
> + }
> + }
> +
> + drmFreeDevice(&dev);
> +#endif
> + return ret;
> +}
> +
> +static const char *
> +dri2_query_device_name(_EGLDisplay *disp)
> +{
> + struct dri2_egl_display *dri2_dpy = disp->DriverData;
> +
> + if (dri2_dpy->fd == -1)
> + return dri2_dpy->driver_name;
> +
> + return loader_get_device_name_for_fd(dri2_dpy->fd);
> +}
> +
> static void
> dri2_unload(_EGLDriver *drv)
> {
> @@ -2985,6 +3047,8 @@ _eglBuiltInDriverDRI2(const char *args)
> dri2_drv->base.API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info;
> dri2_drv->base.API.GLInteropExportObject = dri2_interop_export_object;
> dri2_drv->base.API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
> + dri2_drv->base.API.QueryDeviceFromDisplay = dri2_query_device_from_display;
> + dri2_drv->base.API.QueryDeviceName = dri2_query_device_name;
>
> dri2_drv->base.Name = "DRI2";
> dri2_drv->base.Unload = dri2_unload;
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index fc243a58e8..2f323e9fd4 100644
> --- a/src/egl/main/eglapi.c
> +++ b/src/egl/main/eglapi.c
> @@ -93,6 +93,7 @@
>
> #include "eglglobals.h"
> #include "eglcontext.h"
> +#include "egldevice.h"
> #include "egldisplay.h"
> #include "egltypedefs.h"
> #include "eglcurrent.h"
> @@ -156,6 +157,12 @@
> #define _EGL_CHECK_SYNC(disp, s, ret, drv) \
> _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
>
> +#define _EGL_CHECK_DEVICE(dev, ret, devptr) \
> + do { \
> + devptr = _eglLookupDevice(dev); \
> + if (!devptr) \
> + RETURN_EGL_ERROR(NULL, EGL_BAD_DEVICE_EXT, ret); \
> + } while (0)
>
> struct _egl_entrypoint {
> const char *name;
> @@ -2368,6 +2375,78 @@ _eglFunctionCompare(const void *key, const void *elem)
> return strcmp(procname, entrypoint->name);
> }
>
> +#ifdef HAVE_LIBDRM
This seems like the wrong layer to be caring about libdrm in, and I
don't see any libdrm dependencies in it. Drop the #ifdef?
> +#ifdef EGL_EXT_device_query
We shouldn't need this #ifdef, right? We use our own eglext.h, which
will have it set. Same for other extension #ifdefs.
> +static EGLBoolean EGLAPIENTRY
> +eglQueryDeviceAttribEXT(EGLDeviceEXT device,
> + EGLint attribute,
> + EGLAttrib *value)
> +{
> + _EGLDevice *dev;
> + EGLBoolean ret;
> +
> + _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
> +
> + _EGL_CHECK_DEVICE(device, EGL_FALSE, dev);
> +
> + ret = _eglQueryDeviceAttribEXT(dev, attribute, value);
> +
> + RETURN_EGL_EVAL(NULL, ret);
> +}
> +
> +static const char * EGLAPIENTRY
> +eglQueryDeviceStringEXT(EGLDeviceEXT device,
> + EGLint name)
> +{
> + _EGLDevice *dev;
> + const char *ret;
> +
> + _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, NULL);
> +
> + _EGL_CHECK_DEVICE(device, NULL, dev);
> +
> + ret = _eglQueryDeviceStringEXT(dev, name);
> +
> + RETURN_EGL_EVAL(NULL, ret);
> +}
> +
> +static EGLBoolean EGLAPIENTRY
> +eglQueryDisplayAttribEXT(EGLDisplay dpy,
> + EGLint attribute,
> + EGLAttrib *value)
> +{
> + _EGLDisplay *disp = _eglLockDisplay(dpy);
> + _EGLDriver *drv;
> + EGLBoolean ret;
> +
> + _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
> +
> + _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
> +
> + if (!disp->Initialized)
> + RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
> +
> + ret = _eglQueryDisplayAttribEXT(drv, disp, attribute, value);
> +
> + RETURN_EGL_EVAL(disp, ret);
> +}
> +#endif
> +
> +#ifdef EGL_EXT_device_enumeration
> +static EGLBoolean EGLAPIENTRY
> +eglQueryDevicesEXT(EGLint max_devices,
> + EGLDeviceEXT *devices,
> + EGLint *num_devices)
> +{
> + EGLBoolean ret;
> +
> + ret = _eglQueryDevicesEXT(max_devices, (_EGLDevice **) devices, num_devices);
> +
> + RETURN_EGL_EVAL(NULL, ret);
> +}
> +#endif
> +#endif /* HAVE_LIBDRM */
> +
> __eglMustCastToProperFunctionPointerType EGLAPIENTRY
> eglGetProcAddress(const char *procname)
> {
> diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
> index 710c5d860a..e2f9651441 100644
> --- a/src/egl/main/eglapi.h
> +++ b/src/egl/main/eglapi.h
> @@ -198,6 +198,10 @@ struct _egl_api
> int (*GLInteropExportObject)(_EGLDisplay *dpy, _EGLContext *ctx,
> struct mesa_glinterop_export_in *in,
> struct mesa_glinterop_export_out *out);
> + EGLBoolean (*QueryDeviceFromDisplay)(_EGLDisplay *disp,
> + _EGLDeviceInfo *info,
> + EGLAttrib *value);
Update coding styles: no tabs.
> + const char *(*QueryDeviceName)(_EGLDisplay *disp);
> };
>
> #ifdef __cplusplus
> diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c
> new file mode 100644
> index 0000000000..62c73cb236
> --- /dev/null
> +++ b/src/egl/main/egldevice.c
> @@ -0,0 +1,280 @@
> +/**************************************************************************
> + *
> + * Copyright 2015 Collabora
> + * Copyright 2016 Red Hat, Inc.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + **************************************************************************/
> +
> +#include <assert.h>
> +#include <string.h>
> +
> +#include "eglcurrent.h"
> +#include "egldevice.h"
> +#include "egldriver.h"
> +#include "eglglobals.h"
> +#include "egllog.h"
> +#include "egltypedefs.h"
> +
> +#define MIN(x,y) (((x)<(y))?(x):(y))
> +
> +static EGLBoolean
> +_eglFillDeviceList(_EGLDeviceInfo *info)
> +{
> +#ifdef HAVE_LIBDRM
> + info->num_drm_devices = drmGetDevices(NULL, 0);
> +
> + if (info->num_drm_devices < 0) {
> + info->num_drm_devices = 0;
> + return EGL_FALSE;
> + }
> +
> + info->drm_devices = calloc(info->num_drm_devices, sizeof(drmDevicePtr));
> + if (!info->drm_devices) {
> + info->num_drm_devices = 0;
> + return EGL_FALSE;
> + }
> +
> + if (drmGetDevices(info->drm_devices, info->num_drm_devices) < 0) {
> + free(info->drm_devices);
> + info->num_drm_devices = 0;
> + return EGL_FALSE;
> + }
> +
> + return EGL_TRUE;
> +#else
> + return EGL_FALSE;
> +#endif
> +}
> +
> +static _EGLDeviceInfo *
> +_eglEnsureDeviceInfo(void)
> +{
> + _EGLDeviceInfo *info;
> +
> + mtx_lock(_eglGlobal.Mutex);
> +
> + info = _eglGlobal.DeviceInfo;
> +
> + if (!info) {
> + info = calloc(1, sizeof(_EGLDeviceInfo));
> + if (!info)
> + goto out;
> +
> + /* update this string like in eglglobals.c to add support for a device
> + * extension */
> + info->extensions = "";
> +
> + if (!_eglFillDeviceList(info)) {
> + free(info);
> + info = NULL;
> + }
> + }
> +
> + _eglGlobal.DeviceInfo = info;
> +
> +out:
> + mtx_unlock(_eglGlobal.Mutex);
> +
> + return info;
> +}
> +
> +/**
> + * Lookup an existing device in the device list.
> + * Return NULL if the device pointer doesn't already exist in the device list.
> + */
> +_EGLDevice *
> +_eglLookupDevice(EGLDeviceEXT device)
> +{
> + _EGLDeviceInfo *info;
> + _EGLDevice *dev = NULL;
> +
> + info = _eglEnsureDeviceInfo();
> + if (!info)
> + return NULL;
> +
> + mtx_lock(_eglGlobal.Mutex);
> +
> + /* special case for swrast */
> + if (device == info)
> + dev = device;
> +
> +#ifdef HAVE_LIBDRM
> + for (int i = 0; !dev && i < info->num_drm_devices; i++)
> + if ((void *)info->drm_devices[i] == (void *)device)
> + dev = device;
> +#endif
> +
> + mtx_unlock(_eglGlobal.Mutex);
> +
> + return dev;
> +}
> +
> +/**
> + * Finish device management.
> + */
> +void
> +_eglFiniDeviceInfo(void)
> +{
> + _EGLDeviceInfo *info;
> +
> + /* atexit function is called with global mutex locked */
> +
> + info = _eglGlobal.DeviceInfo;
> +
> + if (!info)
> + return;
> +
> +#ifdef HAVE_LIBDRM
> + drmFreeDevices(info->drm_devices, info->num_drm_devices);
> + free(info->drm_devices);
> +#endif
> +
> + free(info);
> + _eglGlobal.DeviceInfo = NULL;
> +}
> +
> +/**
> + * Get attribute about specific device
> + */
> +EGLBoolean
> +_eglQueryDeviceAttribEXT(_EGLDevice *device,
> + EGLint attribute,
> + EGLAttrib *value)
> +{
> + if (!value)
> + return _eglError(EGL_BAD_PARAMETER, "eglQueryDeviceAttribEXT");
> +
> + switch (attribute) {
> + default:
> + return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryDeviceAttribEXT");
> + }
> +}
> +
> +/**
> + * Get string about a specific device.
> + */
> +const char *
> +_eglQueryDeviceStringEXT(_EGLDevice *device, EGLint name)
> +{
> + _EGLDeviceInfo *info;
> +
> + info =_eglEnsureDeviceInfo();
> + if (!info) {
> + _eglError(EGL_BAD_ALLOC, "eglQueryDeviceStringEXT");
> + return NULL;
> + }
> +
> + switch (name) {
> + case EGL_EXTENSIONS:
> + return info->extensions;
> +
> + default:
> + _eglError(EGL_BAD_PARAMETER, "eglQueryDeviceStringEXT");
> + return NULL;
> + };
> +}
> +
> +static EGLBoolean
> +_eglQueryDeviceFromDisplay(_EGLDeviceInfo *info,
> + _EGLDriver *drv,
> + _EGLDisplay *disp,
> + EGLAttrib *value)
> +{
> + if (drv->API.QueryDeviceFromDisplay)
> + return drv->API.QueryDeviceFromDisplay(disp, info, value);
> +
> + return EGL_FALSE;
> +}
> +
> +EGLBoolean
> +_eglQueryDisplayAttribEXT(_EGLDriver *drv,
> + _EGLDisplay *disp,
> + EGLint attribute,
> + EGLAttrib *value)
> +{
> + _EGLDeviceInfo *info;
> +
> + info = _eglEnsureDeviceInfo();
> + if (!info)
> + return _eglError(EGL_BAD_ALLOC, "eglQueryDisplayAttribEXT");
> +
> + if (!value)
> + return _eglError(EGL_BAD_PARAMETER, "eglQueryDisplayAttribEXT");
> +
> + switch (attribute) {
> + case EGL_DEVICE_EXT:
> + return _eglQueryDeviceFromDisplay(info, drv, disp, value);
> + default:
> + return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryDisplayAttribEXT");
> + }
> +}
> +
> +/**
> + * Enumerate EGL devices.
> + */
> +EGLBoolean
> +_eglQueryDevicesEXT(EGLint max_devices,
> + _EGLDevice **devices,
> + EGLint *num_devices)
> +{
> + _EGLDeviceInfo *info;
> + EGLBoolean ret = EGL_TRUE;
> + int i = 0;
> +
> + /* max_devices can only be bad if devices is non-NULL. num_devices must
> + * always be present. */
style nit: '*/' on new line.
> + if ((devices && max_devices < 1) || !num_devices)
> + return _eglError(EGL_BAD_PARAMETER, "eglQueryDevicesEXT");
> +
> + info = _eglEnsureDeviceInfo();
> + if (!info)
> + return _eglError(EGL_BAD_ALLOC, "eglQueryDevicesEXT");
> +
> + mtx_lock(_eglGlobal.Mutex);
> +
> + /* count devices */
> +#ifdef HAVE_LIBDRM
> + i += info->num_drm_devices;
> +#endif
> +
> + /* bail early if devices is NULL */
> + if (!devices) {
> + *num_devices = i;
> + goto out;
> + }
> +
> + /* create and fill devices array */
> + *num_devices = MIN(i, max_devices);
> +
> + i = 0;
> +#ifdef HAVE_LIBDRM
> + for (; i < *num_devices && i < info->num_drm_devices; i++)
> + devices[i] = (void *)info->drm_devices[i];
> +#endif
> +
> +out:
> + mtx_unlock(_eglGlobal.Mutex);
> +
> + return ret;
> +}
> diff --git a/src/egl/main/egldevice.h b/src/egl/main/egldevice.h
> new file mode 100644
> index 0000000000..7159ef19c0
> --- /dev/null
> +++ b/src/egl/main/egldevice.h
> @@ -0,0 +1,74 @@
> +/**************************************************************************
> + *
> + * Copyright 2015 Collabora
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + **************************************************************************/
> +
> +
> +#ifndef EGLDEVICE_INCLUDED
> +#define EGLDEVICE_INCLUDED
> +
> +#ifdef HAVE_LIBDRM
> +#include <xf86drm.h>
> +#endif
> +#include "egltypedefs.h"
> +
> +typedef struct _egl_device_info {
> + const char *extensions;
> +
> +#ifdef HAVE_LIBDRM
> + drmDevicePtr *drm_devices;
> + int num_drm_devices;
> +#endif
> +} _EGLDeviceInfo;
> +
> +
> +extern void
> +_eglFiniDeviceInfo(void);
> +
> +
> +_EGLDevice *
> +_eglLookupDevice(EGLDeviceEXT device);
> +
> +
> +EGLBoolean
> +_eglQueryDeviceAttribEXT(_EGLDevice *device, EGLint attribute,
> + EGLAttrib *value);
> +
> +
> +const char *
> +_eglQueryDeviceStringEXT(_EGLDevice *device, EGLint name);
> +
> +
> +EGLBoolean
> +_eglQueryDevicesEXT(EGLint max_devices, _EGLDevice **devices,
> + EGLint *num_devices);
> +
> +
> +EGLBoolean
> +_eglQueryDisplayAttribEXT(_EGLDriver *drv, _EGLDisplay *disp,
> + EGLint attribute, EGLAttrib *value);
> +
> +
> +#endif /* EGLDEVICE_INCLUDED */
> diff --git a/src/egl/main/eglentrypoint.h b/src/egl/main/eglentrypoint.h
> index e6318b9311..4b06357e59 100644
> --- a/src/egl/main/eglentrypoint.h
> +++ b/src/egl/main/eglentrypoint.h
> @@ -56,6 +56,16 @@ EGL_ENTRYPOINT(eglPostSubBufferNV)
> EGL_ENTRYPOINT(eglQueryAPI)
> EGL_ENTRYPOINT(eglQueryContext)
> EGL_ENTRYPOINT(eglQueryDebugKHR)
> +#ifdef HAVE_LIBDRM
> +#ifdef EGL_EXT_device_query
> +EGL_ENTRYPOINT(eglQueryDeviceAttribEXT)
> +EGL_ENTRYPOINT(eglQueryDeviceStringEXT)
> +#ifdef EGL_EXT_device_enumeration
> +EGL_ENTRYPOINT(eglQueryDevicesEXT)
> +#endif
> +EGL_ENTRYPOINT(eglQueryDisplayAttribEXT)
> +#endif
> +#endif
Unwrap #ifdefs
> EGL_ENTRYPOINT(eglQueryString)
> EGL_ENTRYPOINT(eglQuerySurface)
> EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
> diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
> index baf96bb1ec..2c18458f49 100644
> --- a/src/egl/main/eglglobals.c
> +++ b/src/egl/main/eglglobals.c
> @@ -35,6 +35,7 @@
> #include "c11/threads.h"
>
> #include "eglglobals.h"
> +#include "egldevice.h"
> #include "egldisplay.h"
> #include "egldriver.h"
>
> @@ -45,15 +46,22 @@ struct _egl_global _eglGlobal =
> {
> &_eglGlobalMutex, /* Mutex */
> NULL, /* DisplayList */
> - 2, /* NumAtExitCalls */
> + NULL, /* DeviceInfo */
> + 3, /* NumAtExitCalls */
> {
> /* default AtExitCalls, called in reverse order */
> _eglUnloadDrivers, /* always called last */
> - _eglFiniDisplay
> + _eglFiniDisplay,
> + _eglFiniDeviceInfo
> },
>
> /* ClientOnlyExtensionString */
> "EGL_EXT_client_extensions"
> +#ifdef HAVE_LIBDRM
> + " EGL_EXT_device_base"
> + " EGL_EXT_device_query"
> + " EGL_EXT_device_enumeration"
> +#endif
Unwrap from HAVE_LIBDRM (I see swrast support elsewhere in this code).
> " EGL_EXT_platform_base"
> " EGL_KHR_client_get_all_proc_addresses"
> " EGL_KHR_debug",
> diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
> index c6ef59d482..7659070854 100644
> --- a/src/egl/main/eglglobals.h
> +++ b/src/egl/main/eglglobals.h
> @@ -54,6 +54,8 @@ struct _egl_global
> /* the list of all displays */
> _EGLDisplay *DisplayList;
>
> + void *DeviceInfo;
> +
> EGLint NumAtExitCalls;
> void (*AtExitCalls[10])(void);
>
> diff --git a/src/egl/main/egltypedefs.h b/src/egl/main/egltypedefs.h
> index 7facdb47f8..8ccb6f5fb5 100644
> --- a/src/egl/main/egltypedefs.h
> +++ b/src/egl/main/egltypedefs.h
> @@ -49,6 +49,10 @@ typedef struct _egl_config _EGLConfig;
>
> typedef struct _egl_context _EGLContext;
>
> +typedef struct _egl_device _EGLDevice; /* note: opaque */
> +
> +typedef struct _egl_device_info _EGLDeviceInfo;
> +
> typedef struct _egl_display _EGLDisplay;
>
> typedef struct _egl_driver _EGLDriver;
> --
> 2.12.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170503/c6feea79/attachment-0001.sig>
More information about the mesa-dev
mailing list