From 85edfc04b8dde4dd7ba6a2c102a6e5971ee343ce Mon Sep 17 00:00:00 2001 From: Veluri Mithun Date: Wed, 23 Jan 2019 22:45:42 +0530 Subject: [PATCH 1/1] egl: Implementation of egl dri2 drivers for MESA_query_driver Signed-off-by: Veluri Mithun Acked-by: Eric Engestrom Reviewed-by: Emil Velikov --- src/egl/drivers/dri2/egl_dri2.c | 37 +++++++++++++++++++++++++++++++++ src/egl/drivers/dri2/egl_dri2.h | 1 + 2 files changed, 38 insertions(+) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index bce9ecb274f..892e32dd4e3 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -426,6 +426,11 @@ static const struct dri2_extension_match swrast_core_extensions[] = { { NULL, 0, 0 } }; +static const struct dri2_extension_match optional_driver_extensions[] = { + { __DRI_CONFIG_OPTIONS, 1, offsetof(struct dri2_egl_display, configOptions) }, + { NULL, 0, 0 } +}; + static const struct dri2_extension_match optional_core_extensions[] = { { __DRI2_ROBUSTNESS, 1, offsetof(struct dri2_egl_display, robustness) }, { __DRI2_NO_ERROR, 1, offsetof(struct dri2_egl_display, no_error) }, @@ -510,6 +515,8 @@ dri2_load_driver_dri3(_EGLDisplay *disp) } dri2_dpy->driver_extensions = extensions; + dri2_bind_extensions(dri2_dpy, optional_driver_extensions, extensions, true); + return EGL_TRUE; } @@ -529,6 +536,8 @@ dri2_load_driver(_EGLDisplay *disp) } dri2_dpy->driver_extensions = extensions; + dri2_bind_extensions(dri2_dpy, optional_driver_extensions, extensions, true); + return EGL_TRUE; } @@ -548,6 +557,8 @@ dri2_load_driver_swrast(_EGLDisplay *disp) } dri2_dpy->driver_extensions = extensions; + dri2_bind_extensions(dri2_dpy, optional_driver_extensions, extensions, true); + return EGL_TRUE; } @@ -564,6 +575,26 @@ dri2_renderer_query_integer(struct dri2_egl_display *dri2_dpy, int param) return value; } +static const char * +dri2_query_driver_name(_EGLDisplay *disp) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + return dri2_dpy->driver_name; +} + +static char * +dri2_query_driver_config(_EGLDisplay *disp) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + const __DRIconfigOptionsExtension *ext = dri2_dpy->configOptions; + + if (ext->base.version >= 2) + return ext->getXml(dri2_dpy->driver_name); + + return strdup(ext->xml); +} + + void dri2_setup_screen(_EGLDisplay *disp) { @@ -608,6 +639,10 @@ dri2_setup_screen(_EGLDisplay *disp) disp->Extensions.KHR_no_config_context = EGL_TRUE; disp->Extensions.KHR_surfaceless_context = EGL_TRUE; + if (dri2_dpy->configOptions) { + disp->Extensions.MESA_query_driver = EGL_TRUE; + } + /* Report back to EGL the bitmask of priorities supported */ disp->Extensions.IMG_context_priority = dri2_renderer_query_integer(dri2_dpy, @@ -3229,6 +3264,8 @@ _eglInitDriver(_EGLDriver *dri2_drv) dri2_drv->API.DestroyImageKHR = dri2_destroy_image_khr; dri2_drv->API.CreateWaylandBufferFromImageWL = dri2_create_wayland_buffer_from_image; dri2_drv->API.QuerySurface = dri2_query_surface; + dri2_drv->API.QueryDriverName = dri2_query_driver_name; + dri2_drv->API.QueryDriverConfig = dri2_query_driver_config; #ifdef HAVE_LIBDRM dri2_drv->API.CreateDRMImageMESA = dri2_create_drm_image_mesa; dri2_drv->API.ExportDRMImageMESA = dri2_export_drm_image_mesa; diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 4abe1ba1952..726ba16ae61 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -185,6 +185,7 @@ struct dri2_egl_display const __DRI2blobExtension *blob; const __DRI2rendererQueryExtension *rendererQuery; const __DRI2interopExtension *interop; + const __DRIconfigOptionsExtension *configOptions; const __DRImutableRenderBufferDriverExtension *mutable_render_buffer; int fd; -- 2.30.2