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

-Emil


// Tapani
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to