[Mesa-dev] [PATCH kmscube 1/2] helper to check for egl entrypoints

Rob Clark robdclark at gmail.com
Thu May 4 13:39:15 UTC 2017


Remove some boilerplate and check more specifically for all the entry-
points that different modules need.

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
Ok, I guess it isn't likely for a driver to expose eglCreateImageKHR
but not eglDeleteImageKHR.. but otoh kmscube is useful for bringing
up drivers.

 common.h      | 11 +++++++++++
 cube-tex.c    |  6 +++---
 cube-video.c  |  4 +---
 drm-atomic.c  |  8 +++++---
 gst-decoder.c |  4 ++++
 5 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/common.h b/common.h
index 0acf4c0..11ec26e 100644
--- a/common.h
+++ b/common.h
@@ -85,6 +85,17 @@ struct egl {
 	void (*draw)(unsigned i);
 };
 
+static inline int __egl_check(void *ptr, const char *name)
+{
+	if (!ptr) {
+		printf("no %s\n", name);
+		return -1;
+	}
+	return 0;
+}
+
+#define egl_check(egl, name) __egl_check((egl)->name, #name)
+
 int init_egl(struct egl *egl, const struct gbm *gbm);
 int create_program(const char *vs_src, const char *fs_src);
 int link_program(unsigned program);
diff --git a/cube-tex.c b/cube-tex.c
index 9316ffb..9e38ae8 100644
--- a/cube-tex.c
+++ b/cube-tex.c
@@ -507,10 +507,10 @@ const struct egl * init_cube_tex(const struct gbm *gbm, enum mode mode)
 	if (ret)
 		return NULL;
 
-	if (!gl.egl.eglCreateImageKHR) {
-		printf("no eglCreateImageKHR\n");
+	if (egl_check(&gl.egl, eglCreateImageKHR) ||
+	    egl_check(&gl.egl, glEGLImageTargetTexture2DOES) ||
+	    egl_check(&gl.egl, eglDestroyImageKHR))
 		return NULL;
-	}
 
 	gl.aspect = (GLfloat)(gbm->height) / (GLfloat)(gbm->width);
 	gl.mode = mode;
diff --git a/cube-video.c b/cube-video.c
index 6ce20da..095544d 100644
--- a/cube-video.c
+++ b/cube-video.c
@@ -300,10 +300,8 @@ const struct egl * init_cube_video(const struct gbm *gbm, const char *filenames)
 	if (ret)
 		return NULL;
 
-	if (!gl.egl.eglCreateImageKHR) {
-		printf("no eglCreateImageKHR\n");
+	if (egl_check(&gl.egl, glEGLImageTargetTexture2DOES))
 		return NULL;
-	}
 
 	fnames = strdup(filenames);
 	while ((s = strstr(fnames, ","))) {
diff --git a/drm-atomic.c b/drm-atomic.c
index 65caacd..dd91bbb 100644
--- a/drm-atomic.c
+++ b/drm-atomic.c
@@ -180,10 +180,12 @@ static int atomic_run(const struct gbm *gbm, const struct egl *egl)
 	uint32_t i = 0;
 	int ret;
 
-	if (!egl->eglDupNativeFenceFDANDROID) {
-		printf("no eglDupNativeFenceFDANDROID\n");
+	if (egl_check(egl, eglDupNativeFenceFDANDROID) ||
+	    egl_check(egl, eglCreateSyncKHR) ||
+	    egl_check(egl, eglDestroySyncKHR) ||
+	    egl_check(egl, eglWaitSyncKHR) ||
+	    egl_check(egl, eglClientWaitSyncKHR))
 		return -1;
-	}
 
 	eglSwapBuffers(egl->display, egl->surface);
 	bo = gbm_surface_lock_front_buffer(gbm->surface);
diff --git a/gst-decoder.c b/gst-decoder.c
index deffad5..2d6d581 100644
--- a/gst-decoder.c
+++ b/gst-decoder.c
@@ -260,6 +260,10 @@ video_init(const struct egl *egl, const struct gbm *gbm, const char *filename)
 	GstPad *pad;
 	GstBus *bus;
 
+	if (egl_check(egl, eglCreateImageKHR) ||
+	    egl_check(egl, eglDestroyImageKHR))
+		return NULL;
+
 	dec = calloc(1, sizeof(*dec));
 	dec->loop = g_main_loop_new(NULL, FALSE);
 	dec->gbm = gbm;
-- 
2.9.3



More information about the mesa-dev mailing list