[Mesa-dev] [PATCH v3] egl: add support for EGL_ANDROID_blob_cache

Tapani Pälli tapani.palli at intel.com
Mon Feb 5 15:59:30 UTC 2018



On 05.02.2018 17:26, Emil Velikov wrote:
> On 5 February 2018 at 07:02, Tapani Pälli <tapani.palli at intel.com> wrote:
>> 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 <tapani.palli at intel.com>
>> Reviewed-by: Jordan Justen <jordan.l.justen at intel.com> (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.velikov at collabora.com>
> 
> -Emil
> 

// Tapani


More information about the mesa-dev mailing list