4646#ifdef GLES3_ENABLED
4747#include " detect_prime_egl.h"
4848#include " drivers/gles3/rasterizer_gles3.h"
49+ #include " wayland/egl_manager_wayland.h"
50+ #include " wayland/egl_manager_wayland_gles.h"
4951#endif
5052
5153String DisplayServerWayland::_get_app_id_from_context (Context p_context) {
@@ -1208,6 +1210,7 @@ Vector<String> DisplayServerWayland::get_rendering_drivers_func() {
12081210
12091211#ifdef GLES3_ENABLED
12101212 drivers.push_back (" opengl3" );
1213+ drivers.push_back (" opengl3_es" );
12111214#endif
12121215
12131216 return drivers;
@@ -1258,14 +1261,14 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
12581261
12591262#ifdef RD_ENABLED
12601263#ifdef VULKAN_ENABLED
1261- if (p_rendering_driver == " vulkan" ) {
1264+ if (rendering_driver == " vulkan" ) {
12621265 rendering_context = memnew (RenderingContextDriverVulkanWayland);
12631266 }
12641267#endif
12651268
12661269 if (rendering_context) {
12671270 if (rendering_context->initialize () != OK) {
1268- ERR_PRINT (vformat (" Could not initialize %s" , p_rendering_driver ));
1271+ ERR_PRINT (vformat (" Could not initialize %s" , rendering_driver ));
12691272 memdelete (rendering_context);
12701273 rendering_context = nullptr ;
12711274 r_error = ERR_CANT_CREATE;
@@ -1275,7 +1278,14 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
12751278#endif
12761279
12771280#ifdef GLES3_ENABLED
1278- if (p_rendering_driver == " opengl3" ) {
1281+ if (rendering_driver == " opengl3" || rendering_driver == " opengl3_es" ) {
1282+ #ifdef SOWRAP_ENABLED
1283+ if (initialize_wayland_egl (dylibloader_verbose) != 0 ) {
1284+ WARN_PRINT (" Can't load the Wayland EGL library." );
1285+ return ;
1286+ }
1287+ #endif // SOWRAP_ENABLED
1288+
12791289 if (getenv (" DRI_PRIME" ) == nullptr ) {
12801290 int prime_idx = -1 ;
12811291
@@ -1318,23 +1328,38 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
13181328 }
13191329 }
13201330
1321- egl_manager = memnew (EGLManagerWayland);
1331+ if (rendering_driver == " opengl3" ) {
1332+ egl_manager = memnew (EGLManagerWayland);
13221333
1323- #ifdef SOWRAP_ENABLED
1324- if (initialize_wayland_egl (dylibloader_verbose) != 0 ) {
1325- WARN_PRINT (" Can't load the Wayland EGL library." );
1326- return ;
1327- }
1328- #endif // SOWRAP_ENABLED
1334+ if (egl_manager->initialize () != OK || egl_manager->open_display (wayland_thread.get_wl_display ()) != OK) {
1335+ memdelete (egl_manager);
1336+ egl_manager = nullptr ;
13291337
1330- if (egl_manager->initialize () != OK) {
1331- memdelete (egl_manager);
1332- egl_manager = nullptr ;
1333- r_error = ERR_CANT_CREATE;
1334- ERR_FAIL_MSG (" Could not initialize GLES3." );
1338+ bool fallback = GLOBAL_GET (" rendering/gl_compatibility/fallback_to_gles" );
1339+ if (fallback) {
1340+ WARN_PRINT (" Your video card drivers seem not to support the required OpenGL version, switching to OpenGLES." );
1341+ rendering_driver = " opengl3_es" ;
1342+ } else {
1343+ r_error = ERR_UNAVAILABLE;
1344+ ERR_FAIL_MSG (" Could not initialize OpenGL." );
1345+ }
1346+ } else {
1347+ RasterizerGLES3::make_current (true );
1348+ }
13351349 }
13361350
1337- RasterizerGLES3::make_current (true );
1351+ if (rendering_driver == " opengl3_es" ) {
1352+ egl_manager = memnew (EGLManagerWaylandGLES);
1353+
1354+ if (egl_manager->initialize () != OK) {
1355+ memdelete (egl_manager);
1356+ egl_manager = nullptr ;
1357+ r_error = ERR_CANT_CREATE;
1358+ ERR_FAIL_MSG (" Could not initialize GLES3." );
1359+ }
1360+
1361+ RasterizerGLES3::make_current (false );
1362+ }
13381363 }
13391364#endif // GLES3_ENABLED
13401365
0 commit comments