Commit 4fb29948 by Jamie Madill Committed by Commit Bot

Split up EGLContextCompatibilityTest.

Instead of attempting to run numConfigs^2 test permutations in a single test we now split up each config into its own test. Each permutation also gets a unique name based on the configs it is testing. Because there were so many tests on some back-ends (e.g. D3D11) this CL adds a way to hard limit the number of test permutations by discarding random tests to reach a specified maximum per back-end. Uses the GoogleTest "RegisterTests" API instead of using the GTEST macros. See online GTest docs for more info. This will allow more easily supporting test timeouts when running batches of tests multi-process. As a side effect we no longer need to restrict this test to Release builds or ignore some renderers. Bug: angleproject:4449 Change-Id: Ia7991e2a3906175413b77a876432061da527d03b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2050812 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent a1e5f582
......@@ -9,9 +9,19 @@
void ANGLEProcessTestArgs(int *argc, char *argv[]);
// Register* functions handle setting up special tests that need complex parameterization.
// GoogleTest relies heavily on static initialization to register test functions. This can
// cause all sorts of issues if the right variables aren't initialized in the right order.
// This register function needs to be called explicitly after static initialization and
// before the test launcher starts. This is a safer and generally better way to initialize
// tests. It's also more similar to how the dEQP Test harness works. In the future we should
// likely specialize more register functions more like dEQP instead of relying on static init.
void RegisterContextCompatibilityTests();
int main(int argc, char **argv)
{
angle::TestSuite testSuite(&argc, argv);
ANGLEProcessTestArgs(&argc, argv);
RegisterContextCompatibilityTests();
return testSuite.run();
}
......@@ -271,6 +271,18 @@ GLColor32F ReadColor32F(GLint x, GLint y)
EXPECT_GL_NO_ERROR();
return actual;
}
void LoadEntryPointsWithUtilLoader()
{
#if defined(ANGLE_USE_UTIL_LOADER)
PFNEGLGETPROCADDRESSPROC getProcAddress;
ANGLETestEnvironment::GetEGLLibrary()->getAs("eglGetProcAddress", &getProcAddress);
ASSERT_NE(nullptr, getProcAddress);
LoadEGL(getProcAddress);
LoadGLES(getProcAddress);
#endif // defined(ANGLE_USE_UTIL_LOADER)
}
} // namespace angle
using namespace angle;
......@@ -512,14 +524,7 @@ void ANGLETestBase::ANGLETestSetUp()
if (mCurrentParams->noFixture)
{
#if defined(ANGLE_USE_UTIL_LOADER)
PFNEGLGETPROCADDRESSPROC getProcAddress;
ANGLETestEnvironment::GetEGLLibrary()->getAs("eglGetProcAddress", &getProcAddress);
ASSERT_NE(nullptr, getProcAddress);
LoadEGL(getProcAddress);
LoadGLES(getProcAddress);
#endif // defined(ANGLE_USE_UTIL_LOADER)
LoadEntryPointsWithUtilLoader();
return;
}
......
......@@ -183,6 +183,8 @@ constexpr std::array<GLenum, 6> kCubeFaces = {
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}};
void LoadEntryPointsWithUtilLoader();
} // namespace angle
#define EXPECT_PIXEL_EQ(x, y, r, g, b, a) \
......
......@@ -65,6 +65,31 @@ bool operator!=(const PlatformParameters &a, const PlatformParameters &b)
return a.tie() != b.tie();
}
const char *GetRendererName(EGLint renderer)
{
switch (renderer)
{
case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
return "Default";
case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
return "D3D9";
case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
return "D3D11";
case EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE:
return "Metal";
case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
return "Null";
case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
return "OpenGL";
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
return "OpenGLES";
case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
return "Vulkan";
default:
return "Undefined";
}
}
std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp)
{
stream << "ES" << pp.majorVersion << "_";
......@@ -76,39 +101,8 @@ std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp)
switch (pp.driver)
{
case GLESDriverType::AngleEGL:
{
switch (pp.eglParameters.renderer)
{
case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
stream << "Default";
break;
case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
stream << "D3D9";
break;
case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
stream << "D3D11";
break;
case EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE:
stream << "Metal";
break;
case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
stream << "Null";
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
stream << "OpenGL";
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
stream << "OpenGLES";
break;
case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
stream << "Vulkan";
break;
default:
stream << "Undefined";
break;
}
stream << GetRendererName(pp.eglParameters.renderer);
break;
}
case GLESDriverType::SystemWGL:
stream << "WGL";
break;
......
......@@ -59,6 +59,8 @@ struct PlatformParameters
EGLint minorVersion;
};
const char *GetRendererName(EGLint renderer);
bool operator<(const PlatformParameters &a, const PlatformParameters &b);
bool operator==(const PlatformParameters &a, const PlatformParameters &b);
std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp);
......
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