blob: 5c5ea35317ef6828093f59551614459760214764 [file] [edit]
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// LinuxWindow.cpp: Implementation of OSWindow::New for Linux
#include "util/linux/LinuxWindow.h"
#include "common/linux/window_system.h"
#include "util/OSWindow.h"
#if defined(ANGLE_USE_WAYLAND)
# include "wayland/WaylandWindow.h"
#endif
#if defined(ANGLE_USE_X11)
# include "x11/X11Window.h"
#endif
#if defined(ANGLE_USE_X11) || defined(ANGLE_USE_WAYLAND)
namespace
{
// Maps a preferred window system to its EGL platform, returning 0 when that
// backend is not compiled in or its server cannot be reached.
EGLenum TryWindowSystem(angle::WindowSystem windowSystem)
{
switch (windowSystem)
{
# if defined(ANGLE_USE_X11)
case angle::WindowSystem::X11:
return IsX11WindowAvailable() ? EGL_PLATFORM_X11_EXT : 0;
# endif
# if defined(ANGLE_USE_WAYLAND)
case angle::WindowSystem::Wayland:
return IsWaylandWindowAvailable() ? EGL_PLATFORM_WAYLAND_EXT : 0;
# endif
default:
return 0;
}
}
EGLenum ResolveNativeDisplayPlatformType()
{
# if defined(ANGLE_USE_X11)
constexpr bool kX11Compiled = true;
# else
constexpr bool kX11Compiled = false;
# endif
# if defined(ANGLE_USE_WAYLAND)
constexpr bool kWaylandCompiled = true;
# else
constexpr bool kWaylandCompiled = false;
# endif
// Use the shared policy so this matches libANGLE's implicit selection in
// GetPlatformTypeFromEnvironment(). Probe only the preferred backend and
// return 0 if it is unreachable: that implicit path does not probe, so
// falling back to the other backend here would pair a window with a
// mismatched display for tests that pass no explicit platform type.
return TryWindowSystem(angle::ChoosePreferredWindowSystem(
kX11Compiled, kWaylandCompiled, angle::GetWindowSystemFromEnvironment()));
}
} // namespace
EGLenum GetNativeDisplayPlatformType()
{
// Queried repeatedly (dEQP platform setup, every OSWindow::New()) while the
// answer cannot change during a run, so resolve once: this avoids redundant
// server probes and guarantees every caller sees the same answer.
static const EGLenum kResolved = ResolveNativeDisplayPlatformType();
return kResolved;
}
// static
OSWindow *OSWindow::New(void *nativeDisplay)
{
switch (GetNativeDisplayPlatformType())
{
# if defined(ANGLE_USE_X11)
case EGL_PLATFORM_X11_EXT:
return CreateX11Window();
# endif
# if defined(ANGLE_USE_WAYLAND)
case EGL_PLATFORM_WAYLAND_EXT:
return CreateWaylandWindow(nativeDisplay);
# endif
default:
return nullptr;
}
}
#endif