summaryrefslogtreecommitdiff
path: root/games/RetroArch/kms.patch
blob: 28ebb1e15e43d6eab313b2fc988b55dc881b001f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
From 5898f3e5d22b930a1050a59b61e98ecd07dd6977 Mon Sep 17 00:00:00 2001
From: orbea <orbea@fredslev.dk>
Date: Thu, 6 Dec 2018 08:31:01 -0800
Subject: [PATCH] Fix KMS with OpenGL.

All credit for this patch goes to dtsarr.

Fixes https://github.com/libretro/RetroArch/issues/7119
---
 gfx/common/egl_common.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/gfx/common/egl_common.c b/gfx/common/egl_common.c
index f3c579af21..ee7bca84b6 100644
--- a/gfx/common/egl_common.c
+++ b/gfx/common/egl_common.c
@@ -329,8 +329,47 @@ bool egl_init_context(egl_ctx_data_t *egl,
 
    RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor);
 
-   if (!eglChooseConfig(egl->dpy, attrib_ptr, &egl->config, 1, n) || *n != 1)
+   EGLint count = 0;
+   EGLint matched = 0;
+   EGLConfig *configs;
+   int config_index = -1;
+
+   if (!eglGetConfigs(egl->dpy, NULL, 0, &count) || count < 1)
+   {
+      RARCH_ERR("[EGL]: No cofigs to choose from.\n");
+      return false;
+   }
+
+   configs = malloc(count * sizeof *configs);
+   if (!configs) return false;
+
+   if (!eglChooseConfig(egl->dpy, attrib_ptr, configs, count, &matched) || !matched)
+   {
+      RARCH_ERR("[EGL]: No EGL configs with appropriate attributes.\n");
       return false;
+   }
+
+   int i;
+   EGLint id;
+
+   for (i = 0; i < count; ++i)
+   {
+      if (!eglGetConfigAttrib(egl->dpy, configs[i], EGL_NATIVE_VISUAL_ID, &id))
+         continue;
+
+      if (id == GBM_FORMAT_XRGB8888) break;
+   }
+
+   if (id != GBM_FORMAT_XRGB8888)
+   {
+      RARCH_ERR("[EGL]: No EGL configs with format XRGB8888\n");
+      return false;
+   }
+
+   config_index = i;
+   if (config_index != -1) egl->config = configs[config_index];
+
+   free(configs);
 
    egl->major = g_egl_major;
    egl->minor = g_egl_minor;