On 31 January 2018 at 07:17, Tapani Pälli <tapani.pa...@intel.com> wrote: > v2: cleanup, move callbacks to _egl_display struct (Emil Velikov) > adapt to earlier ctx->screen changes > > Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> > --- > src/egl/drivers/dri2/egl_dri2.c | 25 +++++++++++++++++++++++++ > src/egl/drivers/dri2/egl_dri2.h | 1 + > src/egl/main/eglapi.c | 30 ++++++++++++++++++++++++++++++ > src/egl/main/eglapi.h | 4 ++++ > src/egl/main/egldisplay.h | 4 ++++ > src/egl/main/eglentrypoint.h | 1 + > 6 files changed, 65 insertions(+) > > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index d5a4f72e86..a54f8a4d96 100644 > --- a/src/egl/drivers/dri2/egl_dri2.c > +++ b/src/egl/drivers/dri2/egl_dri2.c > @@ -458,6 +458,7 @@ static const struct dri2_extension_match > optional_core_extensions[] = { > { __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) }, > { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) }, > { __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, > flush_control) }, > + { __DRI2_BLOB, 1, offsetof(struct dri2_egl_display, blob) }, > { NULL, 0, 0 } > }; > > @@ -727,6 +728,9 @@ dri2_setup_screen(_EGLDisplay *disp) > } > } > > + if (dri2_dpy->blob) > + disp->Extensions.ANDROID_blob_cache = EGL_TRUE; > + > disp->Extensions.KHR_reusable_sync = EGL_TRUE; > > if (dri2_dpy->image) { > @@ -3016,6 +3020,26 @@ dri2_dup_native_fence_fd(_EGLDriver *drv, _EGLDisplay > *dpy, _EGLSync *sync) > return dup(sync->SyncFd); > } > > +static void > +dri2_set_blob_cache_funcs(_EGLDriver *drv, _EGLDisplay *dpy, > + EGLSetBlobFuncANDROID set, > + EGLGetBlobFuncANDROID get) > +{ > + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); > + > + /* No blob support. */ > + if (!dri2_dpy->blob) > + return; > + Should never(tm) happen. As in: the extension won't be advertised and thus applications shouldn't use the func. pointer they get from eglGetProcAddress. If we'd want to catch such abuse it ought to be in eglapi.c.
> + /* No functions to set. */ > + if (!dpy->BlobCacheSet) > + return; > + Not needed - single caller that errors out if the pointer is NULL. > + dri2_dpy->blob->set_cache_funcs(dri2_dpy->dri_screen, > + dpy->BlobCacheSet, > + dpy->BlobCacheGet); > +} > + > static EGLint > dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync, > EGLint flags, EGLTime timeout) > @@ -3234,6 +3258,7 @@ _eglBuiltInDriver(void) > dri2_drv->API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info; > dri2_drv->API.GLInteropExportObject = dri2_interop_export_object; > dri2_drv->API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd; > + dri2_drv->API.SetBlobCacheFuncsANDROID = dri2_set_blob_cache_funcs; > > dri2_drv->Name = "DRI2"; > > diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h > index cc76c73eab..c49156fbb6 100644 > --- a/src/egl/drivers/dri2/egl_dri2.h > +++ b/src/egl/drivers/dri2/egl_dri2.h > @@ -171,6 +171,7 @@ struct dri2_egl_display > const __DRInoErrorExtension *no_error; > const __DRI2configQueryExtension *config; > const __DRI2fenceExtension *fence; > + const __DRI2blobExtension *blob; > const __DRI2rendererQueryExtension *rendererQuery; > const __DRI2interopExtension *interop; > int fd; > diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c > index 5110688f2d..f2ba260060 100644 > --- a/src/egl/main/eglapi.c > +++ b/src/egl/main/eglapi.c > @@ -476,6 +476,7 @@ _eglCreateExtensionsString(_EGLDisplay *dpy) > char *exts = dpy->ExtensionsString; > > /* Please keep these sorted alphabetically. */ > + _EGL_CHECK_EXTENSION(ANDROID_blob_cache); > _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target); > _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer); > _EGL_CHECK_EXTENSION(ANDROID_native_fence_sync); > @@ -2522,6 +2523,35 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint > format, EGLint max_modifiers, > RETURN_EGL_EVAL(disp, ret); > } > > +static void EGLAPIENTRY > +eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set, > + EGLGetBlobFuncANDROID get) > +{ > + _EGLDisplay *disp = _eglLockDisplay(dpy); > + _EGLDriver *drv = _eglCheckDisplay(disp, __func__); > + This is the only EGL API which has no return type. Hence we cannot use the _EGL_FUNC_START/_EGL_CHECK_DISPLAY macros ;-( We'd want the _eglSetFuncName() call (from the former macro) though. I'd add a very small comment + [sort of] inline the macros. -Emil _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev