Re: [Mesa-dev] [PATCH v3] egl: add support for EGL_ANDROID_blob_cache
On 05.02.2018 17:26, Emil Velikov wrote: On 5 February 2018 at 07:02, Tapani Pälliwrote: v2: cleanup, move callbacks to _egl_display struct (Emil Velikov) adapt to earlier ctx->screen changes v3: remove useless checking, add _eglSetFuncName (Emil Velikov) Signed-off-by: Tapani Pälli Reviewed-by: Jordan Justen (v2) --- src/egl/drivers/dri2/egl_dri2.c | 16 src/egl/drivers/dri2/egl_dri2.h | 1 + src/egl/main/eglapi.c | 42 + src/egl/main/eglapi.h | 4 src/egl/main/egldisplay.h | 4 src/egl/main/eglentrypoint.h| 1 + 6 files changed, 68 insertions(+) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index d5a4f72e86..e9b556ec5f 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,17 @@ 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); + 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 +3249,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..2d2a6bce3f 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,47 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers, RETURN_EGL_EVAL(disp, ret); } +static void EGLAPIENTRY +eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set, +EGLGetBlobFuncANDROID get) +{ + /* This function does not return anything so we cannot +* utilize the helper macros _EGL_FUNC_START or _EGL_CHECK_DISPLAY. +*/ + _EGLDisplay *disp = _eglLockDisplay(dpy); + if (!_eglSetFuncName(__func__, disp, EGL_OBJECT_DISPLAY_KHR, NULL)) { + if (disp) { Nit: fold the two conditionals - if (foo && bar) + _eglUnlockDisplay(disp); + return; + } + } + + _EGLDriver *drv = _eglCheckDisplay(disp, __func__); + if (!drv) + return; + Missing UnlockDisplay - can happen if we pass valid, yet uninitialized dpy. Doh! It seems the macro madness was too much for me, thanks for the review! With the unlock (regardless of the nit) the patch is Reviewed-by: Emil Velikov -Emil // Tapani ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH v3] egl: add support for EGL_ANDROID_blob_cache
On 5 February 2018 at 07:02, Tapani Pälliwrote: > v2: cleanup, move callbacks to _egl_display struct (Emil Velikov) > adapt to earlier ctx->screen changes > > v3: remove useless checking, add _eglSetFuncName (Emil Velikov) > > Signed-off-by: Tapani Pälli > Reviewed-by: Jordan Justen (v2) > --- > src/egl/drivers/dri2/egl_dri2.c | 16 > src/egl/drivers/dri2/egl_dri2.h | 1 + > src/egl/main/eglapi.c | 42 > + > src/egl/main/eglapi.h | 4 > src/egl/main/egldisplay.h | 4 > src/egl/main/eglentrypoint.h| 1 + > 6 files changed, 68 insertions(+) > > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index d5a4f72e86..e9b556ec5f 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,17 @@ 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); > + 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 +3249,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..2d2a6bce3f 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,47 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint > format, EGLint max_modifiers, > RETURN_EGL_EVAL(disp, ret); > } > > +static void EGLAPIENTRY > +eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set, > +EGLGetBlobFuncANDROID get) > +{ > + /* This function does not return anything so we cannot > +* utilize the helper macros _EGL_FUNC_START or _EGL_CHECK_DISPLAY. > +*/ > + _EGLDisplay *disp = _eglLockDisplay(dpy); > + if (!_eglSetFuncName(__func__, disp, EGL_OBJECT_DISPLAY_KHR, NULL)) { > + if (disp) { Nit: fold the two conditionals - if (foo && bar) > + _eglUnlockDisplay(disp); > + return; > + } > + } > + > + _EGLDriver *drv = _eglCheckDisplay(disp, __func__); > + if (!drv) > + return; > + Missing UnlockDisplay - can happen if we pass valid, yet uninitialized dpy. With the unlock (regardless of the nit) the patch is Reviewed-by: Emil Velikov -Emil ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH v3] egl: add support for EGL_ANDROID_blob_cache
v2: cleanup, move callbacks to _egl_display struct (Emil Velikov) adapt to earlier ctx->screen changes v3: remove useless checking, add _eglSetFuncName (Emil Velikov) Signed-off-by: Tapani PälliReviewed-by: Jordan Justen (v2) --- src/egl/drivers/dri2/egl_dri2.c | 16 src/egl/drivers/dri2/egl_dri2.h | 1 + src/egl/main/eglapi.c | 42 + src/egl/main/eglapi.h | 4 src/egl/main/egldisplay.h | 4 src/egl/main/eglentrypoint.h| 1 + 6 files changed, 68 insertions(+) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index d5a4f72e86..e9b556ec5f 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,17 @@ 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); + 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 +3249,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..2d2a6bce3f 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,47 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers, RETURN_EGL_EVAL(disp, ret); } +static void EGLAPIENTRY +eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set, +EGLGetBlobFuncANDROID get) +{ + /* This function does not return anything so we cannot +* utilize the helper macros _EGL_FUNC_START or _EGL_CHECK_DISPLAY. +*/ + _EGLDisplay *disp = _eglLockDisplay(dpy); + if (!_eglSetFuncName(__func__, disp, EGL_OBJECT_DISPLAY_KHR, NULL)) { + if (disp) { + _eglUnlockDisplay(disp); + return; + } + } + + _EGLDriver *drv = _eglCheckDisplay(disp, __func__); + if (!drv) + return; + + if (!set || !get) { + _eglError(EGL_BAD_PARAMETER, +"eglSetBlobCacheFuncsANDROID: NULL handler given"); + _eglUnlockDisplay(disp); + return; + } + + if (disp->BlobCacheSet) { + _eglError(EGL_BAD_PARAMETER, +"eglSetBlobCacheFuncsANDROID: functions already set"); + _eglUnlockDisplay(disp); + return; + } + + disp->BlobCacheSet = set; + disp->BlobCacheGet = get; + + drv->API.SetBlobCacheFuncsANDROID(drv, disp, set, get); + + _eglUnlockDisplay(disp); +} + __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname) { diff --git a/src/egl/main/eglapi.h