summaryrefslogtreecommitdiffstats
path: root/platform/linuxbsd/wayland
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linuxbsd/wayland')
-rw-r--r--platform/linuxbsd/wayland/detect_prime_egl.cpp28
-rw-r--r--platform/linuxbsd/wayland/detect_prime_egl.h28
-rw-r--r--platform/linuxbsd/wayland/display_server_wayland.cpp6
3 files changed, 44 insertions, 18 deletions
diff --git a/platform/linuxbsd/wayland/detect_prime_egl.cpp b/platform/linuxbsd/wayland/detect_prime_egl.cpp
index 4c97a80039..e24c03c869 100644
--- a/platform/linuxbsd/wayland/detect_prime_egl.cpp
+++ b/platform/linuxbsd/wayland/detect_prime_egl.cpp
@@ -38,15 +38,6 @@
#include <stdlib.h>
-#ifdef GLAD_ENABLED
-#include "thirdparty/glad/glad/egl.h"
-#include "thirdparty/glad/glad/gl.h"
-#else
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GL/glcorearb.h>
-#endif // GLAD_ENABLED
-
#include <cstring>
#include <sys/types.h>
@@ -57,7 +48,7 @@
#undef glGetString
// Runs inside a child. Exiting will not quit the engine.
-void DetectPrimeEGL::create_context() {
+void DetectPrimeEGL::create_context(EGLenum p_platform_enum) {
#if defined(GLAD_ENABLED)
if (!gladLoaderLoadEGL(nullptr)) {
print_verbose("Unable to load EGL, GPU detection skipped.");
@@ -65,7 +56,18 @@ void DetectPrimeEGL::create_context() {
}
#endif
- EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ EGLDisplay egl_display = EGL_NO_DISPLAY;
+
+ if (GLAD_EGL_VERSION_1_5) {
+ egl_display = eglGetPlatformDisplay(p_platform_enum, nullptr, nullptr);
+ } else if (GLAD_EGL_EXT_platform_base) {
+#ifdef EGL_EXT_platform_base
+ egl_display = eglGetPlatformDisplayEXT(p_platform_enum, nullptr, nullptr);
+#endif
+ } else {
+ egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ }
+
EGLConfig egl_config;
EGLContext egl_context = EGL_NO_CONTEXT;
@@ -110,7 +112,7 @@ void DetectPrimeEGL::create_context() {
eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context);
}
-int DetectPrimeEGL::detect_prime() {
+int DetectPrimeEGL::detect_prime(EGLenum p_platform_enum) {
pid_t p;
int priorities[4] = {};
String vendors[4];
@@ -168,7 +170,7 @@ int DetectPrimeEGL::detect_prime() {
setenv("DRI_PRIME", itos(i).utf8().ptr(), 1);
- create_context();
+ create_context(p_platform_enum);
PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)eglGetProcAddress("glGetString");
const char *vendor = (const char *)glGetString(GL_VENDOR);
diff --git a/platform/linuxbsd/wayland/detect_prime_egl.h b/platform/linuxbsd/wayland/detect_prime_egl.h
index 26351b0dce..3391e020d8 100644
--- a/platform/linuxbsd/wayland/detect_prime_egl.h
+++ b/platform/linuxbsd/wayland/detect_prime_egl.h
@@ -34,6 +34,30 @@
#ifdef GLES3_ENABLED
#ifdef EGL_ENABLED
+#ifdef GLAD_ENABLED
+#include "thirdparty/glad/glad/egl.h"
+#include "thirdparty/glad/glad/gl.h"
+#else
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GL/glcorearb.h>
+
+#define GLAD_EGL_VERSION_1_5 1
+
+#ifdef EGL_EXT_platform_base
+#define GLAD_EGL_EXT_platform_base 1
+#endif
+
+#define KHRONOS_STATIC 1
+extern "C" EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
+#undef KHRONOS_STATIC
+
+#endif // GLAD_ENABLED
+
+#ifndef EGL_EXT_platform_base
+#define GLAD_EGL_EXT_platform_base 0
+#endif
+
class DetectPrimeEGL {
private:
struct Vendor {
@@ -53,10 +77,10 @@ private:
{ nullptr, 0 }
};
- static void create_context();
+ static void create_context(EGLenum p_platform_enum);
public:
- static int detect_prime();
+ static int detect_prime(EGLenum p_platform_enum);
};
#endif // GLES3_ENABLED
diff --git a/platform/linuxbsd/wayland/display_server_wayland.cpp b/platform/linuxbsd/wayland/display_server_wayland.cpp
index cad843561f..3fad8c2987 100644
--- a/platform/linuxbsd/wayland/display_server_wayland.cpp
+++ b/platform/linuxbsd/wayland/display_server_wayland.cpp
@@ -1384,7 +1384,7 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
if (prime_idx == -1) {
print_verbose("Detecting GPUs, set DRI_PRIME in the environment to override GPU detection logic.");
- prime_idx = DetectPrimeEGL::detect_prime();
+ prime_idx = DetectPrimeEGL::detect_prime(EGL_PLATFORM_WAYLAND_KHR);
}
if (prime_idx) {
@@ -1397,7 +1397,7 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
if (rendering_driver == "opengl3") {
egl_manager = memnew(EGLManagerWayland);
- if (egl_manager->initialize() != OK || egl_manager->open_display(wayland_thread.get_wl_display()) != OK) {
+ if (egl_manager->initialize(wayland_thread.get_wl_display()) != OK || egl_manager->open_display(wayland_thread.get_wl_display()) != OK) {
memdelete(egl_manager);
egl_manager = nullptr;
@@ -1417,7 +1417,7 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
if (rendering_driver == "opengl3_es") {
egl_manager = memnew(EGLManagerWaylandGLES);
- if (egl_manager->initialize() != OK) {
+ if (egl_manager->initialize(wayland_thread.get_wl_display()) != OK) {
memdelete(egl_manager);
egl_manager = nullptr;
r_error = ERR_CANT_CREATE;