[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