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

2019-07-04 Thread Emil Velikov
On Wed, 3 Jul 2019 at 08:16, Drew DeVault  wrote:
>
> Instead of assuming the first will be suitable. kmscube fails to start
> for me without this change.

Yes please. Picking the first one is rarely the correct thing to do.
Especially when we have platform specific attributes which are exempt
from the sorting rules.

> ---
>  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 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>
>  #include "common.h"
>
> +static bool egl_get_config(EGLDisplay disp, EGLint *attribs,
Nit: "const EGLint *attribs" and keep the const notation in the parent function.

> +   EGLConfig *out, EGLint visual_id) {
Nit: { on the next line

> +   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];
> +
VLAs are convenient, although they lead to messy binary, are not
supported on some platforms etc.
How about:

EGLConfig configs[128];
assert(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[] = {
Nit: Keep the const.

> 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);
Move this and associated changes to a separate commit, preserving the
fallback to eglCreateWindowSurface().

>
> if (egl->eglGetPlatformDisplayEXT) {
> -   egl->display = 
> egl->eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR,
> +   egl->display = 
> egl->eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA,
Out of curiosity: Both constants are numerically the same. Why the change?

> 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_XRGB)) {
Let's use gbm.format instead of open-coding it.

Thanks
Emil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

2019-07-03 Thread Daniel Stone
Hi Drew,

On Wed, 3 Jul 2019 at 08:16, Drew DeVault  wrote:
> Instead of assuming the first will be suitable. kmscube fails to start
> for me without this change.

There are a couple of unrelated changes combined in here, but I think
the core one is good.

eglChooseConfig has some really useful properties, where it strictly
specifies a sort order, does not include EGL_NATIVE_VISUAL_ID in that
sort order, and silently accepts attributes which are not relevant for
the sort. Your change which takes all possible configs and then
queries them to make sure that the native visual ID is actually
correct is the right thing to do.

Cheers,
Daniel
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

2019-07-03 Thread Drew DeVault
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 
 #include 
 #include 
+#include 
 #include 
 #include 
 
 #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_XRGB)) {
+   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

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