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

2018-02-05 Thread Tapani Pälli



On 05.02.2018 17:26, Emil Velikov wrote:

On 5 February 2018 at 07:02, Tapani Pälli  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 
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

2018-02-05 Thread Emil Velikov
On 5 February 2018 at 07:02, Tapani Pälli  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 
> 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

2018-02-04 Thread Tapani Pälli
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) {
+ _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