Commit 3089f92e by Jamie Madill Committed by Commit Bot

Move EGL Display config into EGLPlatformParameters.

This CL moves all of the EGLDisplay configuration into an EGL platform struct. Consolidating display configuration in the struct allows us to move configuration out of the test constructor. Then when we filter test configs we don't need to wait for the individual test setup. Bug: angleproject:3393 Change-Id: I5bd06dcdc9f2867ebc43c1d4984077ada35cafc8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1574674 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent ca49e6dc
...@@ -56,18 +56,19 @@ SampleApplication::SampleApplication(std::string name, ...@@ -56,18 +56,19 @@ SampleApplication::SampleApplication(std::string name,
mEGLWindow(nullptr), mEGLWindow(nullptr),
mOSWindow(nullptr) mOSWindow(nullptr)
{ {
EGLint requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE; mPlatformParams.majorVersion = glesMajorVersion;
mPlatformParams.minorVersion = glesMinorVersion;
mPlatformParams.renderer = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
if (argc > 1 && strncmp(argv[1], kUseAngleArg, strlen(kUseAngleArg)) == 0) if (argc > 1 && strncmp(argv[1], kUseAngleArg, strlen(kUseAngleArg)) == 0)
{ {
requestedRenderer = GetDisplayTypeFromArg(argv[1] + strlen(kUseAngleArg)); mPlatformParams.renderer = GetDisplayTypeFromArg(argv[1] + strlen(kUseAngleArg));
} }
// Load EGL library so we can initialize the display. // Load EGL library so we can initialize the display.
mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion, mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion);
EGLPlatformParameters(requestedRenderer));
mTimer.reset(CreateTimer()); mTimer.reset(CreateTimer());
mOSWindow = OSWindow::New(); mOSWindow = OSWindow::New();
} }
...@@ -136,7 +137,7 @@ int SampleApplication::run() ...@@ -136,7 +137,7 @@ int SampleApplication::run()
configParams.depthBits = 24; configParams.depthBits = 24;
configParams.stencilBits = 8; configParams.stencilBits = 8;
if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), configParams)) if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), mPlatformParams, configParams))
{ {
return -1; return -1;
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include "util/EGLPlatformParameters.h"
#include "util/OSWindow.h" #include "util/OSWindow.h"
#include "util/Timer.h" #include "util/Timer.h"
#include "util/egl_loader_autogen.h" #include "util/egl_loader_autogen.h"
...@@ -64,6 +65,8 @@ class SampleApplication ...@@ -64,6 +65,8 @@ class SampleApplication
EGLWindow *mEGLWindow; EGLWindow *mEGLWindow;
OSWindow *mOSWindow; OSWindow *mOSWindow;
EGLPlatformParameters mPlatformParams;
// Handle to the entry point binding library. // Handle to the entry point binding library.
std::unique_ptr<angle::Library> mEntryPointsLib; std::unique_ptr<angle::Library> mEntryPointsLib;
}; };
......
...@@ -27,7 +27,6 @@ class MultithreadingTest : public ANGLETest ...@@ -27,7 +27,6 @@ class MultithreadingTest : public ANGLETest
setConfigGreenBits(8); setConfigGreenBits(8);
setConfigBlueBits(8); setConfigBlueBits(8);
setConfigAlphaBits(8); setConfigAlphaBits(8);
setContextVirtualization(false);
} }
bool platformSupportsMultithreading() const { return (IsOpenGLES() && IsAndroid()); } bool platformSupportsMultithreading() const { return (IsOpenGLES() && IsAndroid()); }
...@@ -158,9 +157,9 @@ TEST_P(MultithreadingTest, MakeCurrentMultiContext) ...@@ -158,9 +157,9 @@ TEST_P(MultithreadingTest, MakeCurrentMultiContext)
// TODO(geofflang): Test sharing a program between multiple shared contexts on multiple threads // TODO(geofflang): Test sharing a program between multiple shared contexts on multiple threads
ANGLE_INSTANTIATE_TEST(MultithreadingTest, ANGLE_INSTANTIATE_TEST(MultithreadingTest,
ES2_OPENGL(), WithNoVirtualContexts(ES2_OPENGL()),
ES3_OPENGL(), WithNoVirtualContexts(ES3_OPENGL()),
ES2_OPENGLES(), WithNoVirtualContexts(ES2_OPENGLES()),
ES3_OPENGLES()); WithNoVirtualContexts(ES3_OPENGLES()));
} // namespace angle } // namespace angle
...@@ -719,11 +719,11 @@ class ProgramBinariesAcrossPlatforms : public testing::TestWithParam<PlatformsWi ...@@ -719,11 +719,11 @@ class ProgramBinariesAcrossPlatforms : public testing::TestWithParam<PlatformsWi
EGLWindow *createAndInitEGLWindow(angle::PlatformParameters &param) EGLWindow *createAndInitEGLWindow(angle::PlatformParameters &param)
{ {
EGLWindow *eglWindow = EGLWindow *eglWindow = EGLWindow::New(param.majorVersion, param.minorVersion);
EGLWindow::New(param.majorVersion, param.minorVersion, param.eglParameters);
ConfigParameters configParams; ConfigParameters configParams;
bool result = eglWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), configParams); bool result = eglWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), param.eglParameters,
if (result == false) configParams);
if (!result)
{ {
EGLWindow::Delete(&eglWindow); EGLWindow::Delete(&eglWindow);
} }
......
...@@ -362,7 +362,7 @@ ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams ...@@ -362,7 +362,7 @@ ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams
switch (testParams.driver) switch (testParams.driver)
{ {
case angle::GLESDriverType::AngleEGL: case angle::GLESDriverType::AngleEGL:
mGLWindow = createEGLWindow(testParams); mGLWindow = EGLWindow::New(testParams.majorVersion, testParams.minorVersion);
mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
break; break;
case angle::GLESDriverType::SystemEGL: case angle::GLESDriverType::SystemEGL:
...@@ -426,8 +426,6 @@ void ANGLERenderTest::SetUp() ...@@ -426,8 +426,6 @@ void ANGLERenderTest::SetUp()
mPlatformMethods.monotonicallyIncreasingTime = MonotonicallyIncreasingTime; mPlatformMethods.monotonicallyIncreasingTime = MonotonicallyIncreasingTime;
mPlatformMethods.context = this; mPlatformMethods.context = this;
mConfigParams.platformMethods = &mPlatformMethods;
if (!mOSWindow->initialize(mName, mTestParams.windowWidth, mTestParams.windowHeight)) if (!mOSWindow->initialize(mName, mTestParams.windowWidth, mTestParams.windowHeight))
{ {
mSkipTest = true; mSkipTest = true;
...@@ -435,7 +433,11 @@ void ANGLERenderTest::SetUp() ...@@ -435,7 +433,11 @@ void ANGLERenderTest::SetUp()
// FAIL returns. // FAIL returns.
} }
if (!mGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), mConfigParams)) // Override platform method parameter.
EGLPlatformParameters withMethods = mTestParams.eglParameters;
withMethods.platformMethods = &mPlatformMethods;
if (!mGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), withMethods, mConfigParams))
{ {
mSkipTest = true; mSkipTest = true;
FAIL() << "Failed initializing GL Window"; FAIL() << "Failed initializing GL Window";
...@@ -607,10 +609,3 @@ std::vector<TraceEvent> &ANGLERenderTest::getTraceEventBuffer() ...@@ -607,10 +609,3 @@ std::vector<TraceEvent> &ANGLERenderTest::getTraceEventBuffer()
{ {
return mTraceEventBuffer; return mTraceEventBuffer;
} }
// static
EGLWindow *ANGLERenderTest::createEGLWindow(const RenderTestParams &testParams)
{
return EGLWindow::New(testParams.majorVersion, testParams.minorVersion,
testParams.eglParameters);
}
...@@ -157,8 +157,6 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -157,8 +157,6 @@ class ANGLERenderTest : public ANGLEPerfTest
bool areExtensionPrerequisitesFulfilled() const; bool areExtensionPrerequisitesFulfilled() const;
static EGLWindow *createEGLWindow(const RenderTestParams &testParams);
GLWindowBase *mGLWindow; GLWindowBase *mGLWindow;
OSWindow *mOSWindow; OSWindow *mOSWindow;
std::vector<const char *> mExtensionPrerequisites; std::vector<const char *> mExtensionPrerequisites;
......
...@@ -360,11 +360,9 @@ class ANGLETestBase ...@@ -360,11 +360,9 @@ class ANGLETestBase
void setExtensionsEnabled(bool extensionsEnabled); void setExtensionsEnabled(bool extensionsEnabled);
void setRobustAccess(bool enabled); void setRobustAccess(bool enabled);
void setBindGeneratesResource(bool bindGeneratesResource); void setBindGeneratesResource(bool bindGeneratesResource);
void setDebugLayersEnabled(bool enabled);
void setClientArraysEnabled(bool enabled); void setClientArraysEnabled(bool enabled);
void setRobustResourceInit(bool enabled); void setRobustResourceInit(bool enabled);
void setContextProgramCacheEnabled(bool enabled, angle::CacheProgramFunc cacheProgramFunc); void setContextProgramCacheEnabled(bool enabled, angle::CacheProgramFunc cacheProgramFunc);
void setContextVirtualization(bool enabled);
void setContextResetStrategy(EGLenum resetStrategy); void setContextResetStrategy(EGLenum resetStrategy);
void forceNewDisplay(); void forceNewDisplay();
...@@ -387,7 +385,7 @@ class ANGLETestBase ...@@ -387,7 +385,7 @@ class ANGLETestBase
// Allows a test to be more restrictive about platform warnings. // Allows a test to be more restrictive about platform warnings.
void treatPlatformWarningsAsErrors(); void treatPlatformWarningsAsErrors();
OSWindow *getOSWindow() { return mCurrentPlatform->osWindow; } OSWindow *getOSWindow() { return mFixture->osWindow; }
GLuint get2DTexturedQuadProgram(); GLuint get2DTexturedQuadProgram();
...@@ -412,10 +410,10 @@ class ANGLETestBase ...@@ -412,10 +410,10 @@ class ANGLETestBase
bool useInstancedDrawCalls, bool useInstancedDrawCalls,
GLuint numInstances); GLuint numInstances);
struct Platform struct TestFixture
{ {
Platform(); TestFixture();
~Platform(); ~TestFixture();
EGLWindow *eglWindow = nullptr; EGLWindow *eglWindow = nullptr;
WGLWindow *wglWindow = nullptr; WGLWindow *wglWindow = nullptr;
...@@ -446,8 +444,9 @@ class ANGLETestBase ...@@ -446,8 +444,9 @@ class ANGLETestBase
// different config. This OSWindow sharing seemed to lead to driver bugs on some platforms. // different config. This OSWindow sharing seemed to lead to driver bugs on some platforms.
static OSWindow *mOSWindowSingleton; static OSWindow *mOSWindowSingleton;
static std::map<angle::PlatformParameters, Platform> gPlatforms; static std::map<angle::PlatformParameters, TestFixture> gPlatforms;
Platform *mCurrentPlatform; const angle::PlatformParameters *mCurrentParams;
TestFixture *mFixture;
// Workaround for NVIDIA not being able to share a window with OpenGL and Vulkan. // Workaround for NVIDIA not being able to share a window with OpenGL and Vulkan.
static Optional<EGLint> mLastRendererType; static Optional<EGLint> mLastRendererType;
......
...@@ -12,47 +12,51 @@ ...@@ -12,47 +12,51 @@
namespace angle namespace angle
{ {
PlatformParameters::PlatformParameters() : PlatformParameters(2, 0, EGLPlatformParameters()) {} PlatformParameters::PlatformParameters() : PlatformParameters(2, 0, GLESDriverType::AngleEGL) {}
PlatformParameters::PlatformParameters(EGLint majorVersion, PlatformParameters::PlatformParameters(EGLint majorVersion,
EGLint minorVersion, EGLint minorVersion,
const EGLPlatformParameters &eglPlatformParameters) const EGLPlatformParameters &eglPlatformParameters)
: majorVersion(majorVersion), : driver(GLESDriverType::AngleEGL),
minorVersion(minorVersion),
eglParameters(eglPlatformParameters), eglParameters(eglPlatformParameters),
driver(GLESDriverType::AngleEGL) majorVersion(majorVersion),
{} minorVersion(minorVersion)
{
initDefaultParameters();
}
PlatformParameters::PlatformParameters(EGLint majorVersion, PlatformParameters::PlatformParameters(EGLint majorVersion,
EGLint minorVersion, EGLint minorVersion,
GLESDriverType driver) GLESDriverType driver)
: majorVersion(majorVersion), minorVersion(minorVersion), driver(driver) : driver(driver), majorVersion(majorVersion), minorVersion(minorVersion)
{} {
initDefaultParameters();
}
EGLint PlatformParameters::getRenderer() const EGLint PlatformParameters::getRenderer() const
{ {
return eglParameters.renderer; return eglParameters.renderer;
} }
bool operator<(const PlatformParameters &a, const PlatformParameters &b) void PlatformParameters::initDefaultParameters()
{ {
if (a.majorVersion != b.majorVersion) // Default debug layers to enabled in tests.
{ eglParameters.debugLayersEnabled = EGL_TRUE;
return a.majorVersion < b.majorVersion; }
}
if (a.minorVersion != b.minorVersion)
{
return a.minorVersion < b.minorVersion;
}
return a.eglParameters < b.eglParameters; bool operator<(const PlatformParameters &a, const PlatformParameters &b)
{
return a.tie() < b.tie();
} }
bool operator==(const PlatformParameters &a, const PlatformParameters &b) bool operator==(const PlatformParameters &a, const PlatformParameters &b)
{ {
return (a.majorVersion == b.majorVersion) && (a.minorVersion == b.minorVersion) && return a.tie() == b.tie();
(a.eglParameters == b.eglParameters); }
bool operator!=(const PlatformParameters &a, const PlatformParameters &b)
{
return a.tie() != b.tie();
} }
std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp) std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp)
...@@ -160,6 +164,11 @@ std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp) ...@@ -160,6 +164,11 @@ std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp)
break; break;
} }
if (pp.eglParameters.contextVirtualization == EGL_FALSE)
{
stream << "_NO_VIRTUAL";
}
return stream; return stream;
} }
......
...@@ -45,10 +45,14 @@ struct PlatformParameters ...@@ -45,10 +45,14 @@ struct PlatformParameters
EGLint getRenderer() const; EGLint getRenderer() const;
void initDefaultParameters();
auto tie() const { return std::tie(driver, eglParameters, majorVersion, minorVersion); }
GLESDriverType driver;
EGLPlatformParameters eglParameters;
EGLint majorVersion; EGLint majorVersion;
EGLint minorVersion; EGLint minorVersion;
EGLPlatformParameters eglParameters;
GLESDriverType driver;
}; };
bool operator<(const PlatformParameters &a, const PlatformParameters &b); bool operator<(const PlatformParameters &a, const PlatformParameters &b);
...@@ -173,6 +177,13 @@ PlatformParameters ES3_VULKAN_NULL(); ...@@ -173,6 +177,13 @@ PlatformParameters ES3_VULKAN_NULL();
PlatformParameters ES2_WGL(); PlatformParameters ES2_WGL();
PlatformParameters ES3_WGL(); PlatformParameters ES3_WGL();
inline PlatformParameters WithNoVirtualContexts(const PlatformParameters &params)
{
PlatformParameters withNoVirtualContexts = params;
withNoVirtualContexts.eglParameters.contextVirtualization = EGL_FALSE;
return withNoVirtualContexts;
}
} // namespace angle } // namespace angle
#endif // ANGLE_TEST_CONFIGS_H_ #endif // ANGLE_TEST_CONFIGS_H_
...@@ -36,10 +36,10 @@ bool IsANGLEConfigSupported(const PlatformParameters &param, OSWindow *osWindow) ...@@ -36,10 +36,10 @@ bool IsANGLEConfigSupported(const PlatformParameters &param, OSWindow *osWindow)
eglLibrary.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); eglLibrary.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
#endif #endif
EGLWindow *eglWindow = EGLWindow *eglWindow = EGLWindow::New(param.majorVersion, param.minorVersion);
EGLWindow::New(param.majorVersion, param.minorVersion, param.eglParameters);
ConfigParameters configParams; ConfigParameters configParams;
bool result = eglWindow->initializeGL(osWindow, eglLibrary.get(), configParams); bool result =
eglWindow->initializeGL(osWindow, eglLibrary.get(), param.eglParameters, configParams);
eglWindow->destroyGL(); eglWindow->destroyGL();
EGLWindow::Delete(&eglWindow); EGLWindow::Delete(&eglWindow);
return result; return result;
...@@ -52,7 +52,8 @@ bool IsWGLConfigSupported(const PlatformParameters &param, OSWindow *osWindow) ...@@ -52,7 +52,8 @@ bool IsWGLConfigSupported(const PlatformParameters &param, OSWindow *osWindow)
WGLWindow *wglWindow = WGLWindow::New(param.majorVersion, param.minorVersion); WGLWindow *wglWindow = WGLWindow::New(param.majorVersion, param.minorVersion);
ConfigParameters configParams; ConfigParameters configParams;
bool result = wglWindow->initializeGL(osWindow, openglLibrary.get(), configParams); bool result =
wglWindow->initializeGL(osWindow, openglLibrary.get(), param.eglParameters, configParams);
wglWindow->destroyGL(); wglWindow->destroyGL();
WGLWindow::Delete(&wglWindow); WGLWindow::Delete(&wglWindow);
return result; return result;
...@@ -433,6 +434,8 @@ bool IsPlatformAvailable(const PlatformParameters &param) ...@@ -433,6 +434,8 @@ bool IsPlatformAvailable(const PlatformParameters &param)
<< " because it is not available." << std::endl; << " because it is not available." << std::endl;
} }
// Uncomment this to print available platforms.
// std::cout << "Platform: " << param << " (" << paramAvailabilityCache.size() << ")\n";
return result; return result;
} }
} }
......
...@@ -8,32 +8,72 @@ ...@@ -8,32 +8,72 @@
#ifndef UTIL_EGLPLATFORMPARAMETERS_H_ #ifndef UTIL_EGLPLATFORMPARAMETERS_H_
#define UTIL_EGLPLATFORMPARAMETERS_H_ #define UTIL_EGLPLATFORMPARAMETERS_H_
#include <EGL/eglplatform.h> #include "util/util_gl.h"
#include "util/util_export.h" #include <tuple>
struct ANGLE_UTIL_EXPORT EGLPlatformParameters namespace angle
{ {
EGLint renderer; struct PlatformMethods;
EGLint majorVersion; } // namespace angle
EGLint minorVersion;
EGLint deviceType; struct EGLPlatformParameters
EGLint presentPath; {
EGLPlatformParameters() = default;
EGLPlatformParameters();
explicit EGLPlatformParameters(EGLint renderer); explicit EGLPlatformParameters(EGLint renderer) : renderer(renderer) {}
EGLPlatformParameters(EGLint renderer, EGLPlatformParameters(EGLint renderer,
EGLint majorVersion, EGLint majorVersion,
EGLint minorVersion, EGLint minorVersion,
EGLint deviceType); EGLint deviceType)
: renderer(renderer),
majorVersion(majorVersion),
minorVersion(minorVersion),
deviceType(deviceType)
{}
EGLPlatformParameters(EGLint renderer, EGLPlatformParameters(EGLint renderer,
EGLint majorVersion, EGLint majorVersion,
EGLint minorVersion, EGLint minorVersion,
EGLint deviceType, EGLint deviceType,
EGLint presentPath); EGLint presentPath)
: renderer(renderer),
majorVersion(majorVersion),
minorVersion(minorVersion),
deviceType(deviceType),
presentPath(presentPath)
{}
auto tie() const
{
return std::tie(renderer, majorVersion, minorVersion, deviceType, presentPath,
debugLayersEnabled, contextVirtualization, platformMethods);
}
EGLint renderer = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
EGLint majorVersion = EGL_DONT_CARE;
EGLint minorVersion = EGL_DONT_CARE;
EGLint deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
EGLint presentPath = EGL_DONT_CARE;
EGLint debugLayersEnabled = EGL_DONT_CARE;
EGLint contextVirtualization = EGL_DONT_CARE;
angle::PlatformMethods *platformMethods = nullptr;
}; };
ANGLE_UTIL_EXPORT bool operator<(const EGLPlatformParameters &a, const EGLPlatformParameters &b); inline bool operator<(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
ANGLE_UTIL_EXPORT bool operator==(const EGLPlatformParameters &a, const EGLPlatformParameters &b); {
return a.tie() < b.tie();
}
inline bool operator==(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
{
return a.tie() == b.tie();
}
inline bool operator!=(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
{
return a.tie() != b.tie();
}
#endif // UTIL_EGLPLATFORMPARAMETERS_H_ #endif // UTIL_EGLPLATFORMPARAMETERS_H_
...@@ -16,81 +16,9 @@ ...@@ -16,81 +16,9 @@
#include "util/OSWindow.h" #include "util/OSWindow.h"
#include "util/system_utils.h" #include "util/system_utils.h"
EGLPlatformParameters::EGLPlatformParameters()
: renderer(EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE),
majorVersion(EGL_DONT_CARE),
minorVersion(EGL_DONT_CARE),
deviceType(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE),
presentPath(EGL_DONT_CARE)
{}
EGLPlatformParameters::EGLPlatformParameters(EGLint renderer)
: renderer(renderer),
majorVersion(EGL_DONT_CARE),
minorVersion(EGL_DONT_CARE),
deviceType(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE),
presentPath(EGL_DONT_CARE)
{}
EGLPlatformParameters::EGLPlatformParameters(EGLint renderer,
EGLint majorVersion,
EGLint minorVersion,
EGLint deviceType)
: renderer(renderer),
majorVersion(majorVersion),
minorVersion(minorVersion),
deviceType(deviceType),
presentPath(EGL_DONT_CARE)
{}
EGLPlatformParameters::EGLPlatformParameters(EGLint renderer,
EGLint majorVersion,
EGLint minorVersion,
EGLint deviceType,
EGLint presentPath)
: renderer(renderer),
majorVersion(majorVersion),
minorVersion(minorVersion),
deviceType(deviceType),
presentPath(presentPath)
{}
bool operator<(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
{
if (a.renderer != b.renderer)
{
return a.renderer < b.renderer;
}
if (a.majorVersion != b.majorVersion)
{
return a.majorVersion < b.majorVersion;
}
if (a.minorVersion != b.minorVersion)
{
return a.minorVersion < b.minorVersion;
}
if (a.deviceType != b.deviceType)
{
return a.deviceType < b.deviceType;
}
return a.presentPath < b.presentPath;
}
bool operator==(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
{
return (a.renderer == b.renderer) && (a.majorVersion == b.majorVersion) &&
(a.minorVersion == b.minorVersion) && (a.deviceType == b.deviceType) &&
(a.presentPath == b.presentPath);
}
// ConfigParameters implementation. // ConfigParameters implementation.
ConfigParameters::ConfigParameters() ConfigParameters::ConfigParameters()
: platformMethods(nullptr), : redBits(-1),
redBits(-1),
greenBits(-1), greenBits(-1),
blueBits(-1), blueBits(-1),
alphaBits(-1), alphaBits(-1),
...@@ -114,14 +42,6 @@ void ConfigParameters::reset() ...@@ -114,14 +42,6 @@ void ConfigParameters::reset()
*this = ConfigParameters(); *this = ConfigParameters();
} }
// static
bool ConfigParameters::CanShareDisplay(const ConfigParameters &a, const ConfigParameters &b)
{
return a.debugLayersEnabled == b.debugLayersEnabled &&
a.contextVirtualization == b.contextVirtualization &&
a.platformMethods == b.platformMethods;
}
// GLWindowBase implementation. // GLWindowBase implementation.
GLWindowBase::GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion) GLWindowBase::GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion)
: mClientMajorVersion(glesMajorVersion), mClientMinorVersion(glesMinorVersion) : mClientMajorVersion(glesMajorVersion), mClientMinorVersion(glesMinorVersion)
...@@ -130,17 +50,14 @@ GLWindowBase::GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion) ...@@ -130,17 +50,14 @@ GLWindowBase::GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion)
GLWindowBase::~GLWindowBase() = default; GLWindowBase::~GLWindowBase() = default;
// EGLWindow implementation. // EGLWindow implementation.
EGLWindow::EGLWindow(EGLint glesMajorVersion, EGLWindow::EGLWindow(EGLint glesMajorVersion, EGLint glesMinorVersion)
EGLint glesMinorVersion,
const EGLPlatformParameters &platform)
: GLWindowBase(glesMajorVersion, glesMinorVersion), : GLWindowBase(glesMajorVersion, glesMinorVersion),
mConfig(0), mConfig(0),
mDisplay(EGL_NO_DISPLAY), mDisplay(EGL_NO_DISPLAY),
mSurface(EGL_NO_SURFACE), mSurface(EGL_NO_SURFACE),
mContext(EGL_NO_CONTEXT), mContext(EGL_NO_CONTEXT),
mEGLMajorVersion(0), mEGLMajorVersion(0),
mEGLMinorVersion(0), mEGLMinorVersion(0)
mPlatform(platform)
{} {}
EGLWindow::~EGLWindow() EGLWindow::~EGLWindow()
...@@ -175,11 +92,12 @@ EGLContext EGLWindow::getContext() const ...@@ -175,11 +92,12 @@ EGLContext EGLWindow::getContext() const
bool EGLWindow::initializeGL(OSWindow *osWindow, bool EGLWindow::initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params) const EGLPlatformParameters &platformParams,
const ConfigParameters &configParams)
{ {
if (!initializeDisplay(osWindow, glWindowingLibrary, params)) if (!initializeDisplay(osWindow, glWindowingLibrary, platformParams))
return false; return false;
if (!initializeSurface(osWindow, glWindowingLibrary, params)) if (!initializeSurface(osWindow, glWindowingLibrary, configParams))
return false; return false;
if (!initializeContext()) if (!initializeContext())
return false; return false;
...@@ -188,10 +106,8 @@ bool EGLWindow::initializeGL(OSWindow *osWindow, ...@@ -188,10 +106,8 @@ bool EGLWindow::initializeGL(OSWindow *osWindow,
bool EGLWindow::initializeDisplay(OSWindow *osWindow, bool EGLWindow::initializeDisplay(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params) const EGLPlatformParameters &params)
{ {
mConfigParams = params;
#if defined(ANGLE_USE_UTIL_LOADER) #if defined(ANGLE_USE_UTIL_LOADER)
PFNEGLGETPROCADDRESSPROC getProcAddress; PFNEGLGETPROCADDRESSPROC getProcAddress;
glWindowingLibrary->getAs("eglGetProcAddress", &getProcAddress); glWindowingLibrary->getAs("eglGetProcAddress", &getProcAddress);
...@@ -206,19 +122,19 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow, ...@@ -206,19 +122,19 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow,
std::vector<EGLAttrib> displayAttributes; std::vector<EGLAttrib> displayAttributes;
displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE);
displayAttributes.push_back(mPlatform.renderer); displayAttributes.push_back(params.renderer);
displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE);
displayAttributes.push_back(mPlatform.majorVersion); displayAttributes.push_back(params.majorVersion);
displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE);
displayAttributes.push_back(mPlatform.minorVersion); displayAttributes.push_back(params.minorVersion);
if (mPlatform.deviceType != EGL_DONT_CARE) if (params.deviceType != EGL_DONT_CARE)
{ {
displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
displayAttributes.push_back(mPlatform.deviceType); displayAttributes.push_back(params.deviceType);
} }
if (mPlatform.presentPath != EGL_DONT_CARE) if (params.presentPath != EGL_DONT_CARE)
{ {
const char *extensionString = const char *extensionString =
static_cast<const char *>(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS)); static_cast<const char *>(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS));
...@@ -229,30 +145,28 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow, ...@@ -229,30 +145,28 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow,
} }
displayAttributes.push_back(EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE); displayAttributes.push_back(EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE);
displayAttributes.push_back(mPlatform.presentPath); displayAttributes.push_back(params.presentPath);
} }
// Set debug layer settings if requested. // Set debug layer settings if requested.
if (mConfigParams.debugLayersEnabled.valid()) if (params.debugLayersEnabled != EGL_DONT_CARE)
{ {
displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE);
displayAttributes.push_back(mConfigParams.debugLayersEnabled.value() ? EGL_TRUE displayAttributes.push_back(params.debugLayersEnabled);
: EGL_FALSE);
} }
if (mConfigParams.contextVirtualization.valid()) if (params.contextVirtualization != EGL_DONT_CARE)
{ {
displayAttributes.push_back(EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE); displayAttributes.push_back(EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE);
displayAttributes.push_back(mConfigParams.contextVirtualization.value() ? EGL_TRUE displayAttributes.push_back(params.contextVirtualization);
: EGL_FALSE);
} }
if (mConfigParams.platformMethods) if (params.platformMethods)
{ {
static_assert(sizeof(EGLAttrib) == sizeof(mConfigParams.platformMethods), static_assert(sizeof(EGLAttrib) == sizeof(params.platformMethods),
"Unexpected pointer size"); "Unexpected pointer size");
displayAttributes.push_back(EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX); displayAttributes.push_back(EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX);
displayAttributes.push_back(reinterpret_cast<EGLAttrib>(mConfigParams.platformMethods)); displayAttributes.push_back(reinterpret_cast<EGLAttrib>(params.platformMethods));
} }
displayAttributes.push_back(EGL_NONE); displayAttributes.push_back(EGL_NONE);
...@@ -272,6 +186,7 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow, ...@@ -272,6 +186,7 @@ bool EGLWindow::initializeDisplay(OSWindow *osWindow,
return false; return false;
} }
mPlatform = params;
return true; return true;
} }
...@@ -658,11 +573,9 @@ void GLWindowBase::Delete(GLWindowBase **window) ...@@ -658,11 +573,9 @@ void GLWindowBase::Delete(GLWindowBase **window)
} }
// static // static
EGLWindow *EGLWindow::New(EGLint glesMajorVersion, EGLWindow *EGLWindow::New(EGLint glesMajorVersion, EGLint glesMinorVersion)
EGLint glesMinorVersion,
const EGLPlatformParameters &platform)
{ {
return new EGLWindow(glesMajorVersion, glesMinorVersion, platform); return new EGLWindow(glesMajorVersion, glesMinorVersion);
} }
// static // static
......
...@@ -33,13 +33,6 @@ struct ANGLE_UTIL_EXPORT ConfigParameters ...@@ -33,13 +33,6 @@ struct ANGLE_UTIL_EXPORT ConfigParameters
void reset(); void reset();
static bool CanShareDisplay(const ConfigParameters &a, const ConfigParameters &b);
// Display parameters.
Optional<bool> debugLayersEnabled;
Optional<bool> contextVirtualization;
angle::PlatformMethods *platformMethods;
// Surface and Context parameters. // Surface and Context parameters.
int redBits; int redBits;
int greenBits; int greenBits;
...@@ -76,22 +69,21 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable ...@@ -76,22 +69,21 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
virtual bool initializeGL(OSWindow *osWindow, virtual bool initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &config) = 0; const EGLPlatformParameters &platformParams,
virtual bool isGLInitialized() const = 0; const ConfigParameters &configParams) = 0;
virtual void swap() = 0; virtual bool isGLInitialized() const = 0;
virtual void destroyGL() = 0; virtual void swap() = 0;
virtual bool makeCurrent() = 0; virtual void destroyGL() = 0;
virtual bool hasError() const = 0; virtual bool makeCurrent() = 0;
virtual bool setSwapInterval(EGLint swapInterval) = 0; virtual bool hasError() const = 0;
virtual bool setSwapInterval(EGLint swapInterval) = 0;
bool isMultisample() const { return mConfigParams.multisample; } bool isMultisample() const { return mConfigParams.multisample; }
bool isDebugEnabled() const { return mConfigParams.debug; } bool isDebugEnabled() const { return mConfigParams.debug; }
const angle::PlatformMethods *getPlatformMethods() const const angle::PlatformMethods *getPlatformMethods() const { return mPlatform.platformMethods; }
{
return mConfigParams.platformMethods;
}
const EGLPlatformParameters &getPlatform() const { return mPlatform; }
const ConfigParameters &getConfigParams() const { return mConfigParams; } const ConfigParameters &getConfigParams() const { return mConfigParams; }
protected: protected:
...@@ -100,20 +92,18 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable ...@@ -100,20 +92,18 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
EGLint mClientMajorVersion; EGLint mClientMajorVersion;
EGLint mClientMinorVersion; EGLint mClientMinorVersion;
EGLPlatformParameters mPlatform;
ConfigParameters mConfigParams; ConfigParameters mConfigParams;
}; };
class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
{ {
public: public:
static EGLWindow *New(EGLint glesMajorVersion, static EGLWindow *New(EGLint glesMajorVersion, EGLint glesMinorVersion);
EGLint glesMinorVersion,
const EGLPlatformParameters &platform);
static void Delete(EGLWindow **window); static void Delete(EGLWindow **window);
static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config); static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config);
const EGLPlatformParameters &getPlatform() const { return mPlatform; }
EGLConfig getConfig() const; EGLConfig getConfig() const;
EGLDisplay getDisplay() const; EGLDisplay getDisplay() const;
EGLSurface getSurface() const; EGLSurface getSurface() const;
...@@ -122,7 +112,8 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase ...@@ -122,7 +112,8 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
// Internally initializes the Display, Surface and Context. // Internally initializes the Display, Surface and Context.
bool initializeGL(OSWindow *osWindow, bool initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params) override; const EGLPlatformParameters &platformParams,
const ConfigParameters &configParams) override;
bool isGLInitialized() const override; bool isGLInitialized() const override;
void swap() override; void swap() override;
...@@ -134,7 +125,7 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase ...@@ -134,7 +125,7 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
// Only initializes the Display. // Only initializes the Display.
bool initializeDisplay(OSWindow *osWindow, bool initializeDisplay(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params); const EGLPlatformParameters &params);
// Only initializes the Surface. // Only initializes the Surface.
bool initializeSurface(OSWindow *osWindow, bool initializeSurface(OSWindow *osWindow,
...@@ -153,9 +144,7 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase ...@@ -153,9 +144,7 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
bool isDisplayInitialized() const { return mDisplay != EGL_NO_DISPLAY; } bool isDisplayInitialized() const { return mDisplay != EGL_NO_DISPLAY; }
private: private:
EGLWindow(EGLint glesMajorVersion, EGLWindow(EGLint glesMajorVersion, EGLint glesMinorVersion);
EGLint glesMinorVersion,
const EGLPlatformParameters &platform);
~EGLWindow() override; ~EGLWindow() override;
...@@ -166,7 +155,6 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase ...@@ -166,7 +155,6 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
EGLint mEGLMajorVersion; EGLint mEGLMajorVersion;
EGLint mEGLMinorVersion; EGLint mEGLMinorVersion;
EGLPlatformParameters mPlatform;
}; };
ANGLE_UTIL_EXPORT bool CheckExtensionExists(const char *allExtensions, const std::string &extName); ANGLE_UTIL_EXPORT bool CheckExtensionExists(const char *allExtensions, const std::string &extName);
......
...@@ -71,9 +71,9 @@ WGLWindow::~WGLWindow() {} ...@@ -71,9 +71,9 @@ WGLWindow::~WGLWindow() {}
// Internally initializes GL resources. // Internally initializes GL resources.
bool WGLWindow::initializeGL(OSWindow *osWindow, bool WGLWindow::initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params) const EGLPlatformParameters &platformParams,
const ConfigParameters &configParams)
{ {
mConfigParams = params;
glWindowingLibrary->getAs("wglGetProcAddress", &gCurrentWGLGetProcAddress); glWindowingLibrary->getAs("wglGetProcAddress", &gCurrentWGLGetProcAddress);
if (!gCurrentWGLGetProcAddress) if (!gCurrentWGLGetProcAddress)
...@@ -141,7 +141,7 @@ bool WGLWindow::initializeGL(OSWindow *osWindow, ...@@ -141,7 +141,7 @@ bool WGLWindow::initializeGL(OSWindow *osWindow,
return false; return false;
} }
if (mConfigParams.webGLCompatibility.valid() || mConfigParams.robustResourceInit.valid()) if (configParams.webGLCompatibility.valid() || configParams.robustResourceInit.valid())
{ {
std::cerr << "WGLWindow does not support the requested feature set." << std::endl; std::cerr << "WGLWindow does not support the requested feature set." << std::endl;
return false; return false;
...@@ -172,6 +172,9 @@ bool WGLWindow::initializeGL(OSWindow *osWindow, ...@@ -172,6 +172,9 @@ bool WGLWindow::initializeGL(OSWindow *osWindow,
return false; return false;
} }
mPlatform = platformParams;
mConfigParams = configParams;
angle::LoadGLES(GetProcAddressWithFallback); angle::LoadGLES(GetProcAddressWithFallback);
return true; return true;
} }
......
...@@ -30,7 +30,8 @@ class ANGLE_UTIL_EXPORT WGLWindow : public GLWindowBase ...@@ -30,7 +30,8 @@ class ANGLE_UTIL_EXPORT WGLWindow : public GLWindowBase
// Internally initializes GL resources. // Internally initializes GL resources.
bool initializeGL(OSWindow *osWindow, bool initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary, angle::Library *glWindowingLibrary,
const ConfigParameters &params) override; const EGLPlatformParameters &platformParams,
const ConfigParameters &configParams) override;
void destroyGL() override; void destroyGL() override;
bool isGLInitialized() const override; bool isGLInitialized() const override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment