[Mesa-dev] [PATCH kmscube] Search for a suitable config

Drew DeVault sir at cmpwn.com
Tue Jul 2 23:57:35 UTC 2019


Instead of assuming the first will be suitable. kmscube fails to start
for me without this change.
---
 common.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-------
 common.h |  1 +
 2 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/common.c b/common.c
index f9bd280..45c074d 100644
--- a/common.c
+++ b/common.c
@@ -24,11 +24,47 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "common.h"
 
+static bool egl_get_config(EGLDisplay disp, EGLint *attribs,
+		EGLConfig *out, EGLint visual_id) {
+	EGLint count = 0, matched = 0, ret;
+
+	ret = eglGetConfigs(disp, NULL, 0, &count);
+	if (ret == EGL_FALSE || count == 0) {
+		printf("eglGetConfigs returned no configs\n");
+		return false;
+	}
+
+	EGLConfig configs[count];
+
+	ret = eglChooseConfig(disp, attribs, configs, count, &matched);
+	if (ret == EGL_FALSE) {
+		printf("eglChooseConfig failed\n");
+		return false;
+	}
+
+	for (int i = 0; i < matched; ++i) {
+		EGLint visual;
+		if (!eglGetConfigAttrib(disp, configs[i],
+				EGL_NATIVE_VISUAL_ID, &visual)) {
+			continue;
+		}
+
+		if (!visual_id || visual == visual_id) {
+			*out = configs[i];
+			return true;
+		}
+	}
+
+	printf("no valid egl config found\n");
+	return false;
+}
+
 struct gbm * init_gbm(int drm_fd, int w, int h)
 {
         struct gbm *gbm = calloc(1, sizeof (struct gbm));
@@ -59,7 +95,7 @@ int init_egl(struct egl *egl, const struct gbm *gbm)
 		EGL_NONE
 	};
 
-	static const EGLint config_attribs[] = {
+	static EGLint config_attribs[] = {
 		EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
 		EGL_RED_SIZE, 1,
 		EGL_GREEN_SIZE, 1,
@@ -81,9 +117,10 @@ int init_egl(struct egl *egl, const struct gbm *gbm)
 	get_proc(eglDestroySyncKHR);
 	get_proc(eglWaitSyncKHR);
 	get_proc(eglDupNativeFenceFDANDROID);
+	get_proc(eglCreatePlatformWindowSurfaceEXT);
 
 	if (egl->eglGetPlatformDisplayEXT) {
-		egl->display = egl->eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR,
+		egl->display = egl->eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA,
 				gbm->dev, NULL);
 	} else {
 		egl->display = eglGetDisplay((void *)gbm->dev);
@@ -106,8 +143,9 @@ int init_egl(struct egl *egl, const struct gbm *gbm)
 		return -1;
 	}
 
-	if (!eglChooseConfig(egl->display, config_attribs, &egl->config, 1, &n) || n != 1) {
-		printf("failed to choose config: %d\n", n);
+	if (!egl_get_config(egl->display, config_attribs,
+				&egl->config, GBM_FORMAT_XRGB8888)) {
+		printf("Failed to get EGL config\n");
 		return -1;
 	}
 
@@ -118,10 +156,10 @@ int init_egl(struct egl *egl, const struct gbm *gbm)
 		return -1;
 	}
 
-	egl->surface = eglCreateWindowSurface(egl->display, egl->config,
-			(EGLNativeWindowType)gbm->surface, NULL);
+	egl->surface = egl->eglCreatePlatformWindowSurfaceEXT(
+			egl->display, egl->config, gbm->surface, NULL);
 	if (egl->surface == EGL_NO_SURFACE) {
-		printf("failed to create egl surface\n");
+		printf("failed to create egl surface: %d\n", eglGetError());
 		return -1;
 	}
 
diff --git a/common.h b/common.h
index 1ddf04b..1675f98 100644
--- a/common.h
+++ b/common.h
@@ -69,6 +69,7 @@ struct egl {
 	EGLSurface surface;
 
 	PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
+	PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC eglCreatePlatformWindowSurfaceEXT;
 	PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
 	PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
 	PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
-- 
2.22.0



More information about the mesa-dev mailing list