Commit 1f56ed2a by Jamie Madill Committed by Commit Bot

Add WGLWindow and WGL test configs.

WGLWindow lets us use a Windows driver's bindings instead of ANGLE. This only works if the underlying driver supports OpenGL ES compatibility. Also adds the WGL headers, WGL XML, and a specialized WGL loader. Because of a small driver issue with NVIDIA I added a retry for the WGL Window initialization. Bug: angleproject:2995 Change-Id: Ie5148ece470dd03df33015f4919ad1fa79a859ec Reviewed-on: https://chromium-review.googlesource.com/c/1366021 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent 4e712be2
......@@ -807,46 +807,6 @@ source_set("libEGL_egl_loader") {
]
}
if (!is_component_build && is_android && symbol_level != 0) {
action_foreach("compressed_symbols") {
sources = [
"${root_out_dir}/libEGL${angle_libs_suffix}.so",
"${root_out_dir}/libGLESv1_CM${angle_libs_suffix}.so",
"${root_out_dir}/libGLESv2${angle_libs_suffix}.so",
"${root_out_dir}/libfeature_support${angle_libs_suffix}.so",
]
script = rebase_path("${root_build_dir}/android/compress_symbols.py",
root_build_dir)
deps = [
"//third_party/angle:libEGL${angle_libs_suffix}",
"//third_party/angle:libGLESv1_CM${angle_libs_suffix}",
"//third_party/angle:libGLESv2${angle_libs_suffix}",
"//third_party/angle:libfeature_support${angle_libs_suffix}",
]
outputs = [
"$root_out_dir/lib.compressed/{{source_file_part}}",
]
android_nm = "${android_tool_prefix}nm"
args = [
"--objcopy",
rebase_path(android_objcopy, root_build_dir),
"--nm",
rebase_path(android_nm, root_build_dir),
"--sofile",
"{{source}}",
"--unstrippedsofile",
"{{source_dir}}/lib.unstripped/{{source_file_part}}",
"--output",
"{{source_dir}}/lib.compressed/{{source_file_part}}",
]
}
}
shared_library("libEGL${angle_libs_suffix}") {
sources = libegl_sources
......@@ -949,6 +909,10 @@ source_set("angle_util_loader") {
"util/gles_loader_autogen.cpp",
]
if (is_win) {
sources += util_wgl_sources
}
public_deps = [
":angle_util_loader_headers",
]
......@@ -1120,6 +1084,46 @@ shared_library("libfeature_support${angle_libs_suffix}") {
]
}
if (!is_component_build && is_android && symbol_level != 0) {
action_foreach("compressed_symbols") {
sources = [
"${root_out_dir}/libEGL${angle_libs_suffix}.so",
"${root_out_dir}/libGLESv1_CM${angle_libs_suffix}.so",
"${root_out_dir}/libGLESv2${angle_libs_suffix}.so",
"${root_out_dir}/libfeature_support${angle_libs_suffix}.so",
]
script = rebase_path("${root_build_dir}/android/compress_symbols.py",
root_build_dir)
deps = [
"//third_party/angle:libEGL${angle_libs_suffix}",
"//third_party/angle:libGLESv1_CM${angle_libs_suffix}",
"//third_party/angle:libGLESv2${angle_libs_suffix}",
"//third_party/angle:libfeature_support${angle_libs_suffix}",
]
outputs = [
"$root_out_dir/lib.compressed/{{source_file_part}}",
]
android_nm = "${android_tool_prefix}nm"
args = [
"--objcopy",
rebase_path(android_objcopy, root_build_dir),
"--nm",
rebase_path(android_nm, root_build_dir),
"--sofile",
"{{source}}",
"--unstrippedsofile",
"{{source_dir}}/lib.unstripped/{{source_file_part}}",
"--output",
"{{source_dir}}/lib.compressed/{{source_file_part}}",
]
}
}
if (!is_component_build && is_android &&
current_toolchain == default_toolchain) {
# Package ANGLE libraries for pre-installed system image
......
DisableFormat: true
......@@ -18,6 +18,7 @@ if len(sys.argv) == 2 and sys.argv[1] == 'inputs':
'egl.xml',
'egl_angle_ext.xml',
'registry_xml.py',
'wgl.xml',
]
print(",".join(inputs))
......@@ -146,11 +147,38 @@ def gen_egl_loader():
write_header(data_source_name, all_cmds, "egl", util_egl_preamble, path, "UTIL", export=ex)
write_source(data_source_name, all_cmds, "egl", path, export=ex)
def gen_wgl_loader():
supported_wgl_extensions = [
"WGL_ARB_create_context",
"WGL_ARB_extensions_string",
"WGL_EXT_swap_control",
]
source = "wgl.xml"
xml = registry_xml.RegistryXML(source)
for major_version, minor_version in [[1, 0]]:
annotation = "{}_{}".format(major_version, minor_version)
name_prefix = "WGL_VERSION_"
feature_name = "{}{}".format(name_prefix, annotation)
xml.AddCommands(feature_name, annotation)
xml.AddExtensionCommands(supported_wgl_extensions, ['wgl'])
all_cmds = xml.all_cmd_names.get_all_commands()
path = os.path.join("..", "util", "windows")
write_header(source, all_cmds, "wgl", util_wgl_preamble, path, "UTIL_WINDOWS", "_")
write_source(source, all_cmds, "wgl", path, "_")
def main():
gen_libegl_loader()
gen_gl_loader()
gen_egl_loader()
gen_wgl_loader()
libegl_preamble = """#include <EGL/egl.h>
......@@ -171,6 +199,15 @@ util_egl_preamble = """#include "util/util_export.h"
#include <EGL/eglext.h>
"""
util_wgl_preamble = """
#include <WGL/wgl.h>
#include <GLES2/gl2.h>
// We add an underscore before each function name to ensure common names like "ChoosePixelFormat"
// and "SwapBuffers" don't conflict with our function pointers. We can't use a namespace because
// some functions conflict with preprocessor definitions.
"""
template_loader_h = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name}.
//
......
......@@ -6,7 +6,7 @@
"ANGLE format:src/libANGLE/renderer/angle_format_map.json":
"be9f9bdbdf785dda05920146e8c55dbb",
"ANGLE format:src/libANGLE/renderer/gen_angle_format_table.py":
"c215a4284425ea888f95d084a3d52e51",
"01c2f2a74d2575f65f4f61c05e81c26a",
"ANGLE load functions table:src/libANGLE/renderer/gen_load_functions_table.py":
"8afc7eecce2a3ba9f0b4beacb1aa7fe2",
"ANGLE load functions table:src/libANGLE/renderer/load_functions_data.json":
......@@ -34,7 +34,7 @@
"DXGI format:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py":
"8ea01df6cb7f160772d3c85dd5164890",
"DXGI format:src/libANGLE/renderer/gen_angle_format_table.py":
"c215a4284425ea888f95d084a3d52e51",
"01c2f2a74d2575f65f4f61c05e81c26a",
"ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt":
"e5e567406476306ea06984d885be028d",
"ESSL static builtins:src/compiler/translator/builtin_variables.json":
......@@ -74,9 +74,11 @@
"GL/EGL/WGL loader:scripts/egl_angle_ext.xml":
"745534010f31fbe8e1a1fcddce15ed2d",
"GL/EGL/WGL loader:scripts/generate_loader.py":
"d68873f69d0ab0104460808c7b6a34ab",
"39c383a2cb8e7d216b3ce660217bd830",
"GL/EGL/WGL loader:scripts/registry_xml.py":
"fcc6e75568f9c25b70f6692b9080a447",
"GL/EGL/WGL loader:scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4",
"OpenGL dispatch table:scripts/gl.xml":
"b470cb06b06cbbe7adb2c8129ec85708",
"OpenGL dispatch table:src/libANGLE/renderer/gl/generate_gl_dispatch_table.py":
......@@ -97,8 +99,10 @@
"93649f61036c2fa4739988ad71f413df",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
"1743adf55153edf91363fa7b4350d859",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/PushConstantColor.frag":
"d4edeca8fcb5fc02aa5236c8d8b77a4d",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag":
"98d490413d20118e92dd2b160c1dfc6e",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"096ccb0e3c25067ddd0347556a12d7d6",
"Vulkan mandatory format support table:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py":
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -30,6 +30,7 @@ class Library : angle::NonCopyable
public:
virtual ~Library() {}
virtual void *getSymbol(const char *symbolName) = 0;
virtual void *getNative() const = 0;
template <typename FuncT>
void getAs(const char *symbolName, FuncT *funcOut)
......
......@@ -83,6 +83,8 @@ class PosixLibrary : public Library
return dlsym(mModule, symbolName);
}
void *getNative() const override { return mModule; }
private:
void *mModule = nullptr;
};
......
......@@ -132,6 +132,8 @@ class Win32Library : public Library
return reinterpret_cast<void *>(GetProcAddress(mModule, symbolName));
}
void *getNative() const override { return reinterpret_cast<void *>(mModule); }
private:
HMODULE mModule = nullptr;
};
......
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_angle_format_table.py using data from angle_format_data.json
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_angle_format_table.py using data from angle_format_data.json
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_dxgi_format_table.py using data from dxgi_format_data.json.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from egl.xml and egl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from egl.xml and egl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
......@@ -139,6 +139,7 @@ libangle_includes = [
"include/GLSLANG/ShaderLang.h",
"include/GLSLANG/ShaderVars.h",
"include/KHR/khrplatform.h",
"include/WGL/wgl.h",
"include/platform/FeaturesVk.h",
"include/platform/Platform.h",
"include/platform/WorkaroundsD3D.h",
......
......@@ -11,6 +11,7 @@
#include <vector>
#include "test_utils/gl_raii.h"
#include "util/EGLWindow.h"
#include "util/random_utils.h"
using namespace angle;
......@@ -191,7 +192,7 @@ TEST_P(SimpleOperationTest, ClearAndSwap)
// Can't check the pixel result after the swap, and checking the pixel result affects the
// behaviour of the test on the Vulkan back-end, so don't bother checking correctness.
ASSERT_GL_NO_ERROR();
EXPECT_EGL_SUCCESS();
ASSERT_FALSE(getGLWindow()->hasError());
}
// Simple case of setting a scissor, enabled or disabled.
......@@ -1093,6 +1094,7 @@ ANGLE_INSTANTIATE_TEST(SimpleOperationTest,
ES3_OPENGL(),
ES2_OPENGLES(),
ES3_OPENGLES(),
ES2_WGL(),
ES2_VULKAN());
} // namespace
......@@ -21,6 +21,10 @@
#include <json/json.h>
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
# include "util/windows/WGLWindow.h"
#endif // defined(ANGLE_USE_UTIL_LOADER) &&defined(ANGLE_PLATFORM_WINDOWS)
namespace
{
constexpr size_t kInitialTraceEventBufferSize = 50000;
......@@ -288,6 +292,19 @@ double ANGLEPerfTest::normalizedTime(size_t value) const
std::string RenderTestParams::suffix() const
{
switch (driver)
{
case angle::GLESDriverType::AngleEGL:
break;
case angle::GLESDriverType::SystemEGL:
return "_native";
case angle::GLESDriverType::SystemWGL:
return "_wgl";
default:
assert(0);
return "_unk";
}
switch (getRenderer())
{
case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
......@@ -323,7 +340,30 @@ ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams
// Try to ensure we don't trigger allocation during execution.
mTraceEventBuffer.reserve(kInitialTraceEventBufferSize);
mGLWindow = createEGLWindow(testParams);
switch (testParams.driver)
{
case angle::GLESDriverType::AngleEGL:
mGLWindow = createEGLWindow(testParams);
mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
break;
case angle::GLESDriverType::SystemEGL:
std::cerr << "Not implemented." << std::endl;
mSkipTest = true;
break;
case angle::GLESDriverType::SystemWGL:
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
mGLWindow = WGLWindow::New(testParams.majorVersion, testParams.minorVersion);
mEntryPointsLib.reset(angle::OpenSharedLibrary("opengl32"));
#else
std::cout << "WGL driver not available. Skipping test." << std::endl;
mSkipTest = true;
#endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
break;
default:
std::cerr << "Error in switch." << std::endl;
mSkipTest = true;
break;
}
}
ANGLERenderTest::~ANGLERenderTest()
......@@ -339,6 +379,11 @@ void ANGLERenderTest::addExtensionPrerequisite(const char *extensionName)
void ANGLERenderTest::SetUp()
{
if (mSkipTest)
{
return;
}
ANGLEPerfTest::SetUp();
// Set a consistent CPU core affinity and high priority.
......@@ -367,25 +412,18 @@ void ANGLERenderTest::SetUp()
if (!mOSWindow->initialize(mName, mTestParams.windowWidth, mTestParams.windowHeight))
{
mSkipTest = true;
FAIL() << "Failed initializing OSWindow";
return;
// FAIL returns.
}
// Load EGL library so we can initialize the display.
#if defined(ANGLE_USE_UTIL_LOADER)
mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
#endif // defined(ANGLE_USE_UTIL_LOADER)
if (!mGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get()))
{
mSkipTest = true;
FAIL() << "Failed initializing GL Window";
return;
// FAIL returns.
}
#if defined(ANGLE_USE_UTIL_LOADER)
angle::LoadGLES(eglGetProcAddress);
#endif // defined(ANGLE_USE_UTIL_LOADER)
if (!areExtensionPrerequisitesFulfilled())
{
mSkipTest = true;
......@@ -400,9 +438,9 @@ void ANGLERenderTest::SetUp()
if (mTestParams.iterationsPerStep == 0)
{
mSkipTest = true;
FAIL() << "Please initialize 'iterationsPerStep'.";
abortTest();
return;
// FAIL returns.
}
}
......
......@@ -278,6 +278,9 @@ ANGLE_INSTANTIATE_TEST(
DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::Texture),
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::Texture));
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::Texture),
DrawArrays(DrawCallPerfWGLParams(false), StateChange::NoChange),
DrawArrays(DrawCallPerfWGLParams(false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfWGLParams(false), StateChange::Texture));
} // anonymous namespace
......@@ -97,3 +97,11 @@ DrawCallPerfParams DrawCallPerfVulkanParams(bool useNullDevice, bool renderToTex
params.useFBO = renderToTexture;
return params;
}
DrawCallPerfParams DrawCallPerfWGLParams(bool renderToTexture)
{
DrawCallPerfParams params;
params.useFBO = renderToTexture;
params.driver = angle::GLESDriverType::SystemWGL;
return params;
}
\ No newline at end of file
......@@ -32,5 +32,6 @@ DrawCallPerfParams DrawCallPerfD3D9Params(bool useNullDevice, bool renderToTextu
DrawCallPerfParams DrawCallPerfOpenGLOrGLESParams(bool useNullDevice, bool renderToTexture);
DrawCallPerfParams DrawCallPerfValidationOnly();
DrawCallPerfParams DrawCallPerfVulkanParams(bool useNullDevice, bool renderToTexture);
DrawCallPerfParams DrawCallPerfWGLParams(bool renderToTexture);
#endif // TESTS_PERF_TESTS_DRAW_CALL_PERF_PARAMS_H_
......@@ -12,6 +12,10 @@
#include "util/EGLWindow.h"
#include "util/OSWindow.h"
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
# include "util/windows/WGLWindow.h"
#endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
namespace angle
{
......@@ -284,6 +288,7 @@ std::array<angle::Vector3, 4> ANGLETestBase::GetIndexedQuadVertices()
ANGLETestBase::ANGLETestBase(const angle::PlatformParameters &params)
: mEGLWindow(nullptr),
mWGLWindow(nullptr),
mWidth(16),
mHeight(16),
mIgnoreD3D11SDKLayersWarnings(false),
......@@ -293,26 +298,52 @@ ANGLETestBase::ANGLETestBase(const angle::PlatformParameters &params)
m3DTexturedQuadProgram(0),
mDeferContextInit(false)
{
mEGLWindow = EGLWindow::New(params.majorVersion, params.minorVersion, params.eglParameters);
switch (params.driver)
{
case angle::GLESDriverType::AngleEGL:
{
mEGLWindow =
EGLWindow::New(params.majorVersion, params.minorVersion, params.eglParameters);
// Default debug layers to enabled in tests.
mEGLWindow->setDebugLayersEnabled(true);
// Default debug layers to enabled in tests.
mEGLWindow->setDebugLayersEnabled(true);
// Workaround for NVIDIA not being able to share OpenGL and Vulkan contexts.
EGLint renderer = params.getRenderer();
bool needsWindowSwap = mLastRendererType.valid() &&
((renderer != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE) !=
(mLastRendererType.value() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE));
// Workaround for NVIDIA not being able to share OpenGL and Vulkan contexts.
EGLint renderer = params.getRenderer();
bool needsWindowSwap =
mLastRendererType.valid() &&
((renderer != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE) !=
(mLastRendererType.value() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE));
if (needsWindowSwap)
{
DestroyTestWindow();
if (!InitTestWindow())
if (needsWindowSwap)
{
DestroyTestWindow();
if (!InitTestWindow())
{
std::cerr << "Failed to create ANGLE test window.";
}
}
mLastRendererType = renderer;
break;
}
case angle::GLESDriverType::SystemEGL:
{
std::cerr << "Failed to create ANGLE test window.";
std::cerr << "Unsupported driver." << std::endl;
break;
}
case angle::GLESDriverType::SystemWGL:
{
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
mWGLWindow = WGLWindow::New(params.majorVersion, params.minorVersion);
#else
std::cerr << "Unsupported driver." << std::endl;
#endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
break;
}
}
mLastRendererType = renderer;
}
ANGLETestBase::~ANGLETestBase()
......@@ -334,6 +365,10 @@ ANGLETestBase::~ANGLETestBase()
glDeleteProgram(m3DTexturedQuadProgram);
}
EGLWindow::Delete(&mEGLWindow);
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
WGLWindow::Delete(&mWGLWindow);
#endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
}
void ANGLETestBase::ANGLETestSetUp()
......@@ -353,23 +388,51 @@ void ANGLETestBase::ANGLETestSetUp()
needSwap = true;
}
mPlatformMethods.overrideWorkaroundsD3D = angle::TestPlatform_overrideWorkaroundsD3D;
mPlatformMethods.overrideFeaturesVk = angle::TestPlatform_overrideFeaturesVk;
mPlatformMethods.logError = angle::TestPlatform_logError;
mPlatformMethods.logWarning = angle::TestPlatform_logWarning;
mPlatformMethods.logInfo = angle::TestPlatform_logInfo;
mPlatformMethods.context = &mPlatformContext;
mEGLWindow->setPlatformMethods(&mPlatformMethods);
if (!mEGLWindow->initializeDisplayAndSurface(mOSWindow,
ANGLETestEnvironment::GetEntryPointsLib()))
if (mWGLWindow)
{
FAIL() << "egl display or surface init failed.";
}
#if defined(ANGLE_PLATFORM_WINDOWS) && defined(ANGLE_USE_UTIL_LOADER)
if (!mWGLWindow->initializeGL(mOSWindow, ANGLETestEnvironment::GetWGLLibrary()))
{
std::cerr << "WGL init failed.. trying again with new OSWindow." << std::endl;
if (!mDeferContextInit && !mEGLWindow->initializeContext())
// Retry once with a fresh OSWindow. This is necessary to work around a bug in the
// NVIDIA WGL implementation. It seems sometimes the pixel format gets stuck. Using
// a new windows seems to allow us to set the new pixel format correctly.
DestroyTestWindow();
if (!InitTestWindow())
{
FAIL() << "Failed to create ANGLE test window.";
}
if (!mWGLWindow->initializeGL(mOSWindow, ANGLETestEnvironment::GetWGLLibrary()))
{
FAIL() << "WGL init failed.";
}
}
#else
FAIL() << "Unsupported driver.";
#endif // defined(ANGLE_PLATFORM_WINDOWS) && defined(ANGLE_USE_UTIL_LOADER)
}
else
{
FAIL() << "GL Context init failed.";
mPlatformMethods.overrideWorkaroundsD3D = angle::TestPlatform_overrideWorkaroundsD3D;
mPlatformMethods.overrideFeaturesVk = angle::TestPlatform_overrideFeaturesVk;
mPlatformMethods.logError = angle::TestPlatform_logError;
mPlatformMethods.logWarning = angle::TestPlatform_logWarning;
mPlatformMethods.logInfo = angle::TestPlatform_logInfo;
mPlatformMethods.context = &mPlatformContext;
mEGLWindow->setPlatformMethods(&mPlatformMethods);
if (!mEGLWindow->initializeDisplayAndSurface(mOSWindow,
ANGLETestEnvironment::GetEGLLibrary()))
{
FAIL() << "egl display or surface init failed.";
}
if (!mDeferContextInit && !mEGLWindow->initializeContext())
{
FAIL() << "GL Context init failed.";
}
}
if (needSwap)
......@@ -902,7 +965,7 @@ void ANGLETestBase::setWindowHeight(int height)
GLWindowBase *ANGLETestBase::getGLWindow() const
{
return mEGLWindow;
return mWGLWindow ? reinterpret_cast<GLWindowBase *>(mWGLWindow) : mEGLWindow;
}
void ANGLETestBase::setConfigRedBits(int bits)
......@@ -1012,12 +1075,12 @@ void ANGLETestBase::setDeferContextInit(bool enabled)
int ANGLETestBase::getClientMajorVersion() const
{
return mEGLWindow->getClientMajorVersion();
return getGLWindow()->getClientMajorVersion();
}
int ANGLETestBase::getClientMinorVersion() const
{
return mEGLWindow->getClientMinorVersion();
return getGLWindow()->getClientMinorVersion();
}
EGLWindow *ANGLETestBase::getEGLWindow() const
......@@ -1247,7 +1310,8 @@ ANGLETestBase::ScopedIgnorePlatformMessages::~ScopedIgnorePlatformMessages()
OSWindow *ANGLETestBase::mOSWindow = nullptr;
Optional<EGLint> ANGLETestBase::mLastRendererType;
std::unique_ptr<angle::Library> ANGLETestEnvironment::gEntryPointsLib;
std::unique_ptr<angle::Library> ANGLETestEnvironment::gEGLLibrary;
std::unique_ptr<angle::Library> ANGLETestEnvironment::gWGLLibrary;
void ANGLETestEnvironment::SetUp()
{
......@@ -1255,18 +1319,33 @@ void ANGLETestEnvironment::SetUp()
{
FAIL() << "Failed to create ANGLE test window.";
}
}
void ANGLETestEnvironment::TearDown()
{
ANGLETestBase::DestroyTestWindow();
}
angle::Library *ANGLETestEnvironment::GetEGLLibrary()
{
#if defined(ANGLE_USE_UTIL_LOADER)
if (!gEntryPointsLib)
if (!gEGLLibrary)
{
gEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
gEGLLibrary.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME));
}
#endif // defined(ANGLE_USE_UTIL_LOADER)
return gEGLLibrary.get();
}
void ANGLETestEnvironment::TearDown()
angle::Library *ANGLETestEnvironment::GetWGLLibrary()
{
ANGLETestBase::DestroyTestWindow();
#if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
if (!gWGLLibrary)
{
gWGLLibrary.reset(angle::OpenSharedLibrary("opengl32"));
}
#endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
return gWGLLibrary.get();
}
void ANGLEProcessTestArgs(int *argc, char *argv[])
......@@ -1282,7 +1361,7 @@ void EGLTest::SetUp()
{
#if defined(ANGLE_USE_UTIL_LOADER)
PFNEGLGETPROCADDRESSPROC getProcAddress;
ANGLETestEnvironment::GetEntryPointsLib()->getAs("eglGetProcAddress", &getProcAddress);
ANGLETestEnvironment::GetEGLLibrary()->getAs("eglGetProcAddress", &getProcAddress);
ASSERT_NE(nullptr, getProcAddress);
angle::LoadEGL(getProcAddress);
......
......@@ -239,6 +239,7 @@ class ANGLETestBase;
class EGLWindow;
class GLWindowBase;
class OSWindow;
class WGLWindow;
struct TestPlatformContext final : private angle::NonCopyable
{
......@@ -357,6 +358,7 @@ class ANGLETestBase
int getClientMajorVersion() const;
int getClientMinorVersion() const;
GLWindowBase *getGLWindow() const;
EGLWindow *getEGLWindow() const;
int getWindowWidth() const;
int getWindowHeight() const;
......@@ -396,9 +398,8 @@ class ANGLETestBase
bool useInstancedDrawCalls,
GLuint numInstances);
GLWindowBase *getGLWindow() const;
EGLWindow *mEGLWindow;
WGLWindow *mWGLWindow;
int mWidth;
int mHeight;
......@@ -438,11 +439,13 @@ class ANGLETestEnvironment : public testing::Environment
void SetUp() override;
void TearDown() override;
static angle::Library *GetEntryPointsLib() { return gEntryPointsLib.get(); }
static angle::Library *GetEGLLibrary();
static angle::Library *GetWGLLibrary();
private:
// For loading entry points.
static std::unique_ptr<angle::Library> gEntryPointsLib;
static std::unique_ptr<angle::Library> gEGLLibrary;
static std::unique_ptr<angle::Library> gWGLLibrary;
};
// This base fixture loads the EGL entry points.
......
......@@ -16,7 +16,16 @@ PlatformParameters::PlatformParameters() : PlatformParameters(2, 0, EGLPlatformP
PlatformParameters::PlatformParameters(EGLint majorVersion,
EGLint minorVersion,
const EGLPlatformParameters &eglPlatformParameters)
: majorVersion(majorVersion), minorVersion(minorVersion), eglParameters(eglPlatformParameters)
: majorVersion(majorVersion),
minorVersion(minorVersion),
eglParameters(eglPlatformParameters),
driver(GLESDriverType::AngleEGL)
{}
PlatformParameters::PlatformParameters(EGLint majorVersion,
EGLint minorVersion,
GLESDriverType driver)
: majorVersion(majorVersion), minorVersion(minorVersion), driver(driver)
{}
EGLint PlatformParameters::getRenderer() const
......@@ -53,31 +62,47 @@ std::ostream &operator<<(std::ostream &stream, const PlatformParameters &pp)
stream << pp.minorVersion << "_";
}
switch (pp.eglParameters.renderer)
switch (pp.driver)
{
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_NULL_ANGLE:
stream << "NULL";
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_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;
}
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
stream << "OPENGL";
}
case GLESDriverType::SystemWGL:
stream << "WGL";
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
stream << "OPENGLES";
break;
case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
stream << "VULKAN";
case GLESDriverType::SystemEGL:
stream << "GLES";
break;
default:
stream << "UNDEFINED";
stream << "ERROR";
break;
}
......@@ -641,4 +666,13 @@ PlatformParameters ES3_VULKAN_NULL()
return PlatformParameters(3, 0, egl_platform::VULKAN_NULL());
}
PlatformParameters ES2_WGL()
{
return PlatformParameters(2, 0, GLESDriverType::SystemWGL);
}
PlatformParameters ES3_WGL()
{
return PlatformParameters(3, 0, GLESDriverType::SystemWGL);
}
} // namespace angle
......@@ -24,18 +24,31 @@
namespace angle
{
// The GLES driver type determines what shared object we use to load the GLES entry points.
// AngleEGL loads from ANGLE's version of libEGL, libGLESv2, and libGLESv1_CM.
// SystemEGL uses the system copies of libEGL, libGLESv2, and libGLESv1_CM.
// SystemWGL loads Windows GL with the GLES compatiblity extensions. See util/WGLWindow.h.
enum class GLESDriverType
{
AngleEGL,
SystemEGL,
SystemWGL,
};
struct PlatformParameters
{
PlatformParameters();
PlatformParameters(EGLint majorVersion,
EGLint minorVersion,
const EGLPlatformParameters &eglPlatformParameters);
PlatformParameters(EGLint majorVersion, EGLint minorVersion, GLESDriverType driver);
EGLint getRenderer() const;
EGLint majorVersion;
EGLint minorVersion;
EGLPlatformParameters eglParameters;
GLESDriverType driver;
};
bool operator<(const PlatformParameters &a, const PlatformParameters &b);
......@@ -163,6 +176,9 @@ PlatformParameters ES2_VULKAN_NULL();
PlatformParameters ES3_VULKAN();
PlatformParameters ES3_VULKAN_NULL();
PlatformParameters ES2_WGL();
PlatformParameters ES3_WGL();
} // namespace angle
#endif // ANGLE_TEST_CONFIGS_H_
......@@ -18,6 +18,10 @@
#include "util/OSWindow.h"
#include "util/system_utils.h"
#if defined(ANGLE_PLATFORM_WINDOWS)
# include "util/windows/WGLWindow.h"
#endif // defined(ANGLE_PLATFORM_WINDOWS)
namespace angle
{
namespace
......@@ -37,6 +41,27 @@ bool IsANGLEConfigSupported(const PlatformParameters &param, OSWindow *osWindow)
EGLWindow::Delete(&eglWindow);
return result;
}
bool IsWGLConfigSupported(const PlatformParameters &param, OSWindow *osWindow)
{
#if defined(ANGLE_PLATFORM_WINDOWS) && defined(ANGLE_USE_UTIL_LOADER)
std::unique_ptr<angle::Library> openglLibrary(angle::OpenSharedLibrary("opengl32"));
WGLWindow *wglWindow = WGLWindow::New(param.majorVersion, param.minorVersion);
bool result = wglWindow->initializeGL(osWindow, openglLibrary.get());
wglWindow->destroyGL();
WGLWindow::Delete(&wglWindow);
return result;
#else
return false;
#endif // defined(ANGLE_PLATFORM_WINDOWS) && defined(ANGLE_USE_UTIL_LOADER)
}
bool IsNativeConfigSupported(const PlatformParameters &param, OSWindow *osWindow)
{
// Not yet implemented.
return false;
}
} // namespace
bool IsPlatformAvailable(const PlatformParameters &param)
......@@ -96,10 +121,20 @@ bool IsPlatformAvailable(const PlatformParameters &param)
{
OSWindow *osWindow = OSWindow::New();
bool result = osWindow->initialize("CONFIG_TESTER", 1, 1);
if (result)
{
result = IsANGLEConfigSupported(param, osWindow);
switch (param.driver)
{
case GLESDriverType::AngleEGL:
result = IsANGLEConfigSupported(param, osWindow);
break;
case GLESDriverType::SystemEGL:
result = IsNativeConfigSupported(param, osWindow);
break;
case GLESDriverType::SystemWGL:
result = IsWGLConfigSupported(param, osWindow);
break;
}
}
osWindow->destroy();
......
......@@ -550,6 +550,11 @@ void EGLWindow::makeCurrent()
eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
}
bool EGLWindow::hasError() const
{
return eglGetError() != EGL_SUCCESS;
}
// static
bool EGLWindow::ClientExtensionEnabled(const std::string &extName)
{
......
......@@ -60,11 +60,12 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
EGLint getClientMajorVersion() const { return mClientMajorVersion; }
EGLint getClientMinorVersion() const { return mClientMinorVersion; }
virtual bool initializeGL(OSWindow *osWindow, angle::Library *glLibrary) = 0;
virtual bool isGLInitialized() const = 0;
virtual void swap() = 0;
virtual void destroyGL() = 0;
virtual void makeCurrent() = 0;
virtual bool initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary) = 0;
virtual bool isGLInitialized() const = 0;
virtual void swap() = 0;
virtual void destroyGL() = 0;
virtual void makeCurrent() = 0;
virtual bool hasError() const = 0;
protected:
GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion);
......@@ -137,6 +138,7 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
void destroyGL() override;
bool isGLInitialized() const override;
void makeCurrent() override;
bool hasError() const override;
static bool ClientExtensionEnabled(const std::string &extName);
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from egl.xml and egl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from egl.xml and egl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Copyright 2019 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.
//
......
......@@ -37,6 +37,13 @@ util_win32_sources = [
"util/windows/WindowsTimer.h",
]
util_wgl_sources = [
"util/windows/WGLWindow.cpp",
"util/windows/WGLWindow.h",
"util/windows/wgl_loader_autogen.cpp",
"util/windows/wgl_loader_autogen.h",
]
util_winrt_sources = [
"util/windows/winrt/WinRT_system_utils.cpp",
"util/windows/winrt/WinRTPixmap.cpp",
......
//
// Copyright 2018 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.
//
// WGLWindow:
// Implements initializing a WGL rendering context.
//
#include "util/windows/WGLWindow.h"
#include "common/string_utils.h"
#include "util/OSWindow.h"
#include "util/gles_loader_autogen.h"
#include "util/system_utils.h"
#include "util/windows/wgl_loader_autogen.h"
#include <iostream>
namespace
{
PIXELFORMATDESCRIPTOR GetDefaultPixelFormatDescriptor()
{
PIXELFORMATDESCRIPTOR pixelFormatDescriptor = {0};
pixelFormatDescriptor.nSize = sizeof(pixelFormatDescriptor);
pixelFormatDescriptor.nVersion = 1;
pixelFormatDescriptor.dwFlags =
PFD_DRAW_TO_WINDOW | PFD_GENERIC_ACCELERATED | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pixelFormatDescriptor.iPixelType = PFD_TYPE_RGBA;
pixelFormatDescriptor.cColorBits = 24;
pixelFormatDescriptor.cAlphaBits = 8;
pixelFormatDescriptor.cDepthBits = 24;
pixelFormatDescriptor.cStencilBits = 8;
pixelFormatDescriptor.iLayerType = PFD_MAIN_PLANE;
return pixelFormatDescriptor;
}
PFNWGLGETPROCADDRESSPROC gCurrentWGLGetProcAddress = nullptr;
HMODULE gCurrentModule = nullptr;
angle::GenericProc WINAPI GetProcAddressWithFallback(const char *name)
{
angle::GenericProc proc = reinterpret_cast<angle::GenericProc>(gCurrentWGLGetProcAddress(name));
if (proc)
{
return proc;
}
return reinterpret_cast<angle::GenericProc>(GetProcAddress(gCurrentModule, name));
}
bool HasExtension(const std::vector<std::string> &extensions, const char *ext)
{
return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();
}
void DumpLastWindowsError()
{
std::cerr << "Last Windows error code: 0x" << std::hex << GetLastError() << std::endl;
}
} // namespace
WGLWindow::WGLWindow(int glesMajorVersion, int glesMinorVersion)
: GLWindowBase(glesMajorVersion, glesMinorVersion),
mDeviceContext(nullptr),
mWGLContext(nullptr),
mWindow(nullptr)
{}
WGLWindow::~WGLWindow() {}
// Internally initializes GL resources.
bool WGLWindow::initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary)
{
glWindowingLibrary->getAs("wglGetProcAddress", &gCurrentWGLGetProcAddress);
if (!gCurrentWGLGetProcAddress)
{
std::cerr << "Error loading wglGetProcAddress." << std::endl;
return false;
}
gCurrentModule = reinterpret_cast<HMODULE>(glWindowingLibrary->getNative());
angle::LoadWGL(GetProcAddressWithFallback);
mWindow = osWindow->getNativeWindow();
mDeviceContext = GetDC(mWindow);
const PIXELFORMATDESCRIPTOR pixelFormatDescriptor = GetDefaultPixelFormatDescriptor();
int pixelFormat = ChoosePixelFormat(mDeviceContext, &pixelFormatDescriptor);
if (pixelFormat == 0)
{
std::cerr << "Could not find a compatible pixel format." << std::endl;
DumpLastWindowsError();
return false;
}
// According to the Windows docs, it is an error to set a pixel format twice.
int currentPixelFormat = GetPixelFormat(mDeviceContext);
if (currentPixelFormat != pixelFormat)
{
if (SetPixelFormat(mDeviceContext, pixelFormat, &pixelFormatDescriptor) != TRUE)
{
std::cerr << "Failed to set the pixel format." << std::endl;
DumpLastWindowsError();
return false;
}
}
mWGLContext = _wglCreateContext(mDeviceContext);
if (!mWGLContext)
{
std::cerr << "Failed to create a WGL context." << std::endl;
return false;
}
makeCurrent();
// Reload entry points to capture extensions.
angle::LoadWGL(GetProcAddressWithFallback);
if (!_wglGetExtensionsStringARB)
{
std::cerr << "Driver does not expose wglGetExtensionsStringARB." << std::endl;
return false;
}
const char *extensionsString = _wglGetExtensionsStringARB(mDeviceContext);
std::vector<std::string> extensions;
angle::SplitStringAlongWhitespace(extensionsString, &extensions);
if (!HasExtension(extensions, "WGL_EXT_create_context_es2_profile"))
{
std::cerr << "Driver does not expose WGL_EXT_create_context_es2_profile." << std::endl;
return false;
}
if (mWebGLCompatibility.valid() || mRobustResourceInit.valid())
{
std::cerr << "WGLWindow does not support the requested feature set." << std::endl;
return false;
}
// Tear down the context and create another with ES2 compatibility.
_wglDeleteContext(mWGLContext);
// This could be extended to cover ES1 compatiblity.
int kCreateAttribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB,
mClientMajorVersion,
WGL_CONTEXT_MINOR_VERSION_ARB,
mClientMinorVersion,
WGL_CONTEXT_PROFILE_MASK_ARB,
WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
0,
0};
mWGLContext = _wglCreateContextAttribsARB(mDeviceContext, nullptr, kCreateAttribs);
if (!mWGLContext)
{
std::cerr << "Failed to create an ES2 compatible WGL context." << std::endl;
return false;
}
makeCurrent();
if (mSwapInterval != -1)
{
if (_wglSwapIntervalEXT)
{
if (_wglSwapIntervalEXT(mSwapInterval) == FALSE)
{
std::cerr << "Error setting swap interval." << std::endl;
}
}
else
{
std::cerr << "Error setting swap interval." << std::endl;
}
}
angle::LoadGLES(GetProcAddressWithFallback);
return true;
}
void WGLWindow::destroyGL()
{
if (mWGLContext)
{
_wglDeleteContext(mWGLContext);
mWGLContext = nullptr;
}
if (mDeviceContext)
{
ReleaseDC(mWindow, mDeviceContext);
mDeviceContext = nullptr;
}
}
bool WGLWindow::isGLInitialized() const
{
return mWGLContext != nullptr;
}
void WGLWindow::makeCurrent()
{
if (_wglMakeCurrent(mDeviceContext, mWGLContext) == FALSE)
{
std::cerr << "Error during wglMakeCurrent." << std::endl;
}
}
void WGLWindow::swap()
{
if (SwapBuffers(mDeviceContext) == FALSE)
{
std::cerr << "Error during SwapBuffers." << std::endl;
}
}
bool WGLWindow::hasError() const
{
return GetLastError() != S_OK;
}
// static
WGLWindow *WGLWindow::New(int glesMajorVersion, int glesMinorVersion)
{
return new WGLWindow(glesMajorVersion, glesMinorVersion);
}
// static
void WGLWindow::Delete(WGLWindow **window)
{
delete *window;
*window = nullptr;
}
//
// Copyright 2018 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.
//
// WGLWindow:
// Implements initializing a WGL rendering context.
//
#ifndef UTIL_WINDOWS_WGLWINDOW_H_
#define UTIL_WINDOWS_WGLWINDOW_H_
#include "common/angleutils.h"
#include "export.h"
#include "util/EGLWindow.h"
class OSWindow;
namespace angle
{
class Library;
} // namespace angle
class ANGLE_UTIL_EXPORT WGLWindow : public GLWindowBase
{
public:
static WGLWindow *New(int glesMajorVersion, int glesMinorVersion);
static void Delete(WGLWindow **window);
// Internally initializes GL resources.
bool initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary) override;
void destroyGL() override;
bool isGLInitialized() const override;
void makeCurrent() override;
void swap() override;
bool hasError() const override;
private:
WGLWindow(int glesMajorVersion, int glesMinorVersion);
~WGLWindow() override;
// OS resources.
HDC mDeviceContext;
HGLRC mWGLContext;
HWND mWindow;
};
#endif // UTIL_WINDOWS_WGLWINDOW_H_
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from wgl.xml.
//
// Copyright 2019 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.
//
// wgl_loader_autogen.cpp:
// Simple WGL function loader.
#include "wgl_loader_autogen.h"
PFNCHOOSEPIXELFORMATPROC _ChoosePixelFormat;
PFNDESCRIBEPIXELFORMATPROC _DescribePixelFormat;
PFNGETENHMETAFILEPIXELFORMATPROC _GetEnhMetaFilePixelFormat;
PFNGETPIXELFORMATPROC _GetPixelFormat;
PFNSETPIXELFORMATPROC _SetPixelFormat;
PFNSWAPBUFFERSPROC _SwapBuffers;
PFNWGLCOPYCONTEXTPROC _wglCopyContext;
PFNWGLCREATECONTEXTPROC _wglCreateContext;
PFNWGLCREATELAYERCONTEXTPROC _wglCreateLayerContext;
PFNWGLDELETECONTEXTPROC _wglDeleteContext;
PFNWGLDESCRIBELAYERPLANEPROC _wglDescribeLayerPlane;
PFNWGLGETCURRENTCONTEXTPROC _wglGetCurrentContext;
PFNWGLGETCURRENTDCPROC _wglGetCurrentDC;
PFNWGLGETLAYERPALETTEENTRIESPROC _wglGetLayerPaletteEntries;
PFNWGLGETPROCADDRESSPROC _wglGetProcAddress;
PFNWGLMAKECURRENTPROC _wglMakeCurrent;
PFNWGLREALIZELAYERPALETTEPROC _wglRealizeLayerPalette;
PFNWGLSETLAYERPALETTEENTRIESPROC _wglSetLayerPaletteEntries;
PFNWGLSHARELISTSPROC _wglShareLists;
PFNWGLSWAPLAYERBUFFERSPROC _wglSwapLayerBuffers;
PFNWGLUSEFONTBITMAPSPROC _wglUseFontBitmaps;
PFNWGLUSEFONTBITMAPSAPROC _wglUseFontBitmapsA;
PFNWGLUSEFONTBITMAPSWPROC _wglUseFontBitmapsW;
PFNWGLUSEFONTOUTLINESPROC _wglUseFontOutlines;
PFNWGLUSEFONTOUTLINESAPROC _wglUseFontOutlinesA;
PFNWGLUSEFONTOUTLINESWPROC _wglUseFontOutlinesW;
PFNWGLCREATECONTEXTATTRIBSARBPROC _wglCreateContextAttribsARB;
PFNWGLGETEXTENSIONSSTRINGARBPROC _wglGetExtensionsStringARB;
PFNWGLGETSWAPINTERVALEXTPROC _wglGetSwapIntervalEXT;
PFNWGLSWAPINTERVALEXTPROC _wglSwapIntervalEXT;
namespace angle
{
void LoadWGL(LoadProc loadProc)
{
_ChoosePixelFormat = reinterpret_cast<PFNCHOOSEPIXELFORMATPROC>(loadProc("ChoosePixelFormat"));
_DescribePixelFormat =
reinterpret_cast<PFNDESCRIBEPIXELFORMATPROC>(loadProc("DescribePixelFormat"));
_GetEnhMetaFilePixelFormat =
reinterpret_cast<PFNGETENHMETAFILEPIXELFORMATPROC>(loadProc("GetEnhMetaFilePixelFormat"));
_GetPixelFormat = reinterpret_cast<PFNGETPIXELFORMATPROC>(loadProc("GetPixelFormat"));
_SetPixelFormat = reinterpret_cast<PFNSETPIXELFORMATPROC>(loadProc("SetPixelFormat"));
_SwapBuffers = reinterpret_cast<PFNSWAPBUFFERSPROC>(loadProc("SwapBuffers"));
_wglCopyContext = reinterpret_cast<PFNWGLCOPYCONTEXTPROC>(loadProc("wglCopyContext"));
_wglCreateContext = reinterpret_cast<PFNWGLCREATECONTEXTPROC>(loadProc("wglCreateContext"));
_wglCreateLayerContext =
reinterpret_cast<PFNWGLCREATELAYERCONTEXTPROC>(loadProc("wglCreateLayerContext"));
_wglDeleteContext = reinterpret_cast<PFNWGLDELETECONTEXTPROC>(loadProc("wglDeleteContext"));
_wglDescribeLayerPlane =
reinterpret_cast<PFNWGLDESCRIBELAYERPLANEPROC>(loadProc("wglDescribeLayerPlane"));
_wglGetCurrentContext =
reinterpret_cast<PFNWGLGETCURRENTCONTEXTPROC>(loadProc("wglGetCurrentContext"));
_wglGetCurrentDC = reinterpret_cast<PFNWGLGETCURRENTDCPROC>(loadProc("wglGetCurrentDC"));
_wglGetLayerPaletteEntries =
reinterpret_cast<PFNWGLGETLAYERPALETTEENTRIESPROC>(loadProc("wglGetLayerPaletteEntries"));
_wglGetProcAddress = reinterpret_cast<PFNWGLGETPROCADDRESSPROC>(loadProc("wglGetProcAddress"));
_wglMakeCurrent = reinterpret_cast<PFNWGLMAKECURRENTPROC>(loadProc("wglMakeCurrent"));
_wglRealizeLayerPalette =
reinterpret_cast<PFNWGLREALIZELAYERPALETTEPROC>(loadProc("wglRealizeLayerPalette"));
_wglSetLayerPaletteEntries =
reinterpret_cast<PFNWGLSETLAYERPALETTEENTRIESPROC>(loadProc("wglSetLayerPaletteEntries"));
_wglShareLists = reinterpret_cast<PFNWGLSHARELISTSPROC>(loadProc("wglShareLists"));
_wglSwapLayerBuffers =
reinterpret_cast<PFNWGLSWAPLAYERBUFFERSPROC>(loadProc("wglSwapLayerBuffers"));
_wglUseFontBitmaps = reinterpret_cast<PFNWGLUSEFONTBITMAPSPROC>(loadProc("wglUseFontBitmaps"));
_wglUseFontBitmapsA =
reinterpret_cast<PFNWGLUSEFONTBITMAPSAPROC>(loadProc("wglUseFontBitmapsA"));
_wglUseFontBitmapsW =
reinterpret_cast<PFNWGLUSEFONTBITMAPSWPROC>(loadProc("wglUseFontBitmapsW"));
_wglUseFontOutlines =
reinterpret_cast<PFNWGLUSEFONTOUTLINESPROC>(loadProc("wglUseFontOutlines"));
_wglUseFontOutlinesA =
reinterpret_cast<PFNWGLUSEFONTOUTLINESAPROC>(loadProc("wglUseFontOutlinesA"));
_wglUseFontOutlinesW =
reinterpret_cast<PFNWGLUSEFONTOUTLINESWPROC>(loadProc("wglUseFontOutlinesW"));
_wglCreateContextAttribsARB =
reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(loadProc("wglCreateContextAttribsARB"));
_wglGetExtensionsStringARB =
reinterpret_cast<PFNWGLGETEXTENSIONSSTRINGARBPROC>(loadProc("wglGetExtensionsStringARB"));
_wglGetSwapIntervalEXT =
reinterpret_cast<PFNWGLGETSWAPINTERVALEXTPROC>(loadProc("wglGetSwapIntervalEXT"));
_wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(loadProc("wglSwapIntervalEXT"));
}
} // namespace angle
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_loader.py using data from wgl.xml.
//
// Copyright 2019 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.
//
// wgl_loader_autogen.h:
// Simple WGL function loader.
#ifndef UTIL_WINDOWS_WGL_LOADER_AUTOGEN_H_
#define UTIL_WINDOWS_WGL_LOADER_AUTOGEN_H_
#include <GLES2/gl2.h>
#include <WGL/wgl.h>
// We add an underscore before each function name to ensure common names like "ChoosePixelFormat"
// and "SwapBuffers" don't conflict with our function pointers. We can't use a namespace because
// some functions conflict with preprocessor definitions.
extern PFNCHOOSEPIXELFORMATPROC _ChoosePixelFormat;
extern PFNDESCRIBEPIXELFORMATPROC _DescribePixelFormat;
extern PFNGETENHMETAFILEPIXELFORMATPROC _GetEnhMetaFilePixelFormat;
extern PFNGETPIXELFORMATPROC _GetPixelFormat;
extern PFNSETPIXELFORMATPROC _SetPixelFormat;
extern PFNSWAPBUFFERSPROC _SwapBuffers;
extern PFNWGLCOPYCONTEXTPROC _wglCopyContext;
extern PFNWGLCREATECONTEXTPROC _wglCreateContext;
extern PFNWGLCREATELAYERCONTEXTPROC _wglCreateLayerContext;
extern PFNWGLDELETECONTEXTPROC _wglDeleteContext;
extern PFNWGLDESCRIBELAYERPLANEPROC _wglDescribeLayerPlane;
extern PFNWGLGETCURRENTCONTEXTPROC _wglGetCurrentContext;
extern PFNWGLGETCURRENTDCPROC _wglGetCurrentDC;
extern PFNWGLGETLAYERPALETTEENTRIESPROC _wglGetLayerPaletteEntries;
extern PFNWGLGETPROCADDRESSPROC _wglGetProcAddress;
extern PFNWGLMAKECURRENTPROC _wglMakeCurrent;
extern PFNWGLREALIZELAYERPALETTEPROC _wglRealizeLayerPalette;
extern PFNWGLSETLAYERPALETTEENTRIESPROC _wglSetLayerPaletteEntries;
extern PFNWGLSHARELISTSPROC _wglShareLists;
extern PFNWGLSWAPLAYERBUFFERSPROC _wglSwapLayerBuffers;
extern PFNWGLUSEFONTBITMAPSPROC _wglUseFontBitmaps;
extern PFNWGLUSEFONTBITMAPSAPROC _wglUseFontBitmapsA;
extern PFNWGLUSEFONTBITMAPSWPROC _wglUseFontBitmapsW;
extern PFNWGLUSEFONTOUTLINESPROC _wglUseFontOutlines;
extern PFNWGLUSEFONTOUTLINESAPROC _wglUseFontOutlinesA;
extern PFNWGLUSEFONTOUTLINESWPROC _wglUseFontOutlinesW;
extern PFNWGLCREATECONTEXTATTRIBSARBPROC _wglCreateContextAttribsARB;
extern PFNWGLGETEXTENSIONSSTRINGARBPROC _wglGetExtensionsStringARB;
extern PFNWGLGETSWAPINTERVALEXTPROC _wglGetSwapIntervalEXT;
extern PFNWGLSWAPINTERVALEXTPROC _wglSwapIntervalEXT;
namespace angle
{
using GenericProc = void (*)();
using LoadProc = GenericProc(KHRONOS_APIENTRY *)(const char *);
void LoadWGL(LoadProc loadProc);
} // namespace angle
#endif // UTIL_WINDOWS_WGL_LOADER_AUTOGEN_H_
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