forked from flutter/engine
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix eglChooseConfig for attributes that have exact default values.
The implementation of eglChooseConfig does not match the specification for attributes not provided by the calling function. It is supposed to use the default value and match semantics, per the specification. This is fine for many attributes (where the value in the EGLConfig doesn't matter). Currently, this affects the following attributes: - EGL_COLOR_BUFFER_TYPE - EGL_LEVEL - EGL_RENDERABLE_TYPE - EGL_SURFACE_TYPE - EGL_TRANSPARENT_TYPE - EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE - EGL_COLOR_COMPONENT_TYPE_EXT This change causes 55 of 65 of the dEQP-EGL.functional.choose_config.* tests to start passing. Bug: angleproject:3172 Change-Id: I287af5ba7d296694d9a78ded5d1e3bc4e7043d03 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1506696 Commit-Queue: Ian Elliott <ianelliott@google.com> Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
- Loading branch information
1 parent
3c1f5a6
commit 4e87659
Showing
6 changed files
with
165 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
// | ||
// 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. | ||
// | ||
// EGLChooseConfigTest.cpp: | ||
// Tests of proper default-value semantics for eglChooseConfig | ||
|
||
#include <gtest/gtest.h> | ||
|
||
#include "test_utils/ANGLETest.h" | ||
#include "test_utils/angle_test_configs.h" | ||
#include "util/EGLWindow.h" | ||
|
||
using namespace angle; | ||
|
||
namespace angle | ||
{ | ||
class EGLChooseConfigTest : public ANGLETest | ||
{ | ||
protected: | ||
EGLChooseConfigTest() {} | ||
}; | ||
|
||
// Test that the EGL_COLOR_BUFFER_TYPE is defaulted to EGL_RGB_BUFFER | ||
TEST_P(EGLChooseConfigTest, Defaults) | ||
{ | ||
EGLDisplay display = getEGLWindow()->getDisplay(); | ||
|
||
EGLint nConfigs = 0; | ||
EGLint allConfigCount = 0; | ||
ASSERT_EGL_TRUE(eglGetConfigs(display, nullptr, 0, &nConfigs)); | ||
ASSERT_NE(nConfigs, 0); | ||
|
||
std::vector<EGLConfig> allConfigs(nConfigs); | ||
ASSERT_EGL_TRUE(eglGetConfigs(display, allConfigs.data(), nConfigs, &allConfigCount)); | ||
ASSERT_EQ(nConfigs, allConfigCount); | ||
|
||
// Choose configs that have the default attribute values: | ||
const EGLint defaultConfigAttributes[] = {EGL_NONE}; | ||
EGLint defaultConfigCount; | ||
std::vector<EGLConfig> defaultConfigs(allConfigCount); | ||
ASSERT_EGL_TRUE(eglChooseConfig(display, defaultConfigAttributes, defaultConfigs.data(), | ||
defaultConfigs.size(), &defaultConfigCount)); | ||
ASSERT_EGL_SUCCESS(); | ||
ASSERT_LE(defaultConfigCount, allConfigCount); | ||
|
||
// Check that the default configs all have the default attribute values we care about: | ||
for (EGLConfig config : defaultConfigs) | ||
{ | ||
EGLint colorBufferType, level, renderableType, surfaceType, transparentType; | ||
EGLint colorComponentType; | ||
|
||
eglGetConfigAttrib(display, config, EGL_COLOR_BUFFER_TYPE, &colorBufferType); | ||
ASSERT_EQ(colorBufferType, EGL_RGB_BUFFER); | ||
|
||
eglGetConfigAttrib(display, config, EGL_LEVEL, &level); | ||
ASSERT_EQ(level, 0); | ||
|
||
eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &renderableType); | ||
ASSERT_EQ(renderableType & EGL_OPENGL_ES_BIT, EGL_OPENGL_ES_BIT); | ||
|
||
eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType); | ||
ASSERT_EQ(surfaceType & EGL_WINDOW_BIT, EGL_WINDOW_BIT); | ||
|
||
eglGetConfigAttrib(display, config, EGL_TRANSPARENT_TYPE, &transparentType); | ||
ASSERT_EQ(transparentType, EGL_NONE); | ||
|
||
if (ANGLETest::eglDisplayExtensionEnabled(display, "EGL_EXT_pixel_format_float")) | ||
{ | ||
eglGetConfigAttrib(display, config, EGL_COLOR_COMPONENT_TYPE_EXT, &colorComponentType); | ||
ASSERT_EQ(colorComponentType, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT); | ||
} | ||
} | ||
|
||
// Check that all of the configs that have the default attribute values are are defaultConfigs, | ||
// and all that don't aren't: | ||
for (EGLConfig config : allConfigs) | ||
{ | ||
EGLint colorBufferType, level, renderableType, surfaceType, transparentType; | ||
EGLint colorComponentType = EGL_COLOR_COMPONENT_TYPE_FIXED_EXT; | ||
|
||
eglGetConfigAttrib(display, config, EGL_COLOR_BUFFER_TYPE, &colorBufferType); | ||
eglGetConfigAttrib(display, config, EGL_LEVEL, &level); | ||
eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &renderableType); | ||
eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType); | ||
eglGetConfigAttrib(display, config, EGL_TRANSPARENT_TYPE, &transparentType); | ||
if (ANGLETest::eglDisplayExtensionEnabled(display, "EGL_EXT_pixel_format_float")) | ||
{ | ||
eglGetConfigAttrib(display, config, EGL_COLOR_COMPONENT_TYPE_EXT, &colorComponentType); | ||
} | ||
|
||
bool isADefault = | ||
((colorBufferType == EGL_RGB_BUFFER) && (level == 0) && | ||
((renderableType & EGL_OPENGL_ES_BIT) == EGL_OPENGL_ES_BIT) && | ||
((surfaceType & EGL_WINDOW_BIT) == EGL_WINDOW_BIT) && (transparentType == EGL_NONE) && | ||
(colorComponentType == EGL_COLOR_COMPONENT_TYPE_FIXED_EXT)); | ||
EGLint thisConfigID; | ||
eglGetConfigAttrib(display, config, EGL_CONFIG_ID, &thisConfigID); | ||
bool foundInDefaultConfigs = false; | ||
// Attempt to find this config ID in defaultConfigs: | ||
for (EGLConfig defaultConfig : defaultConfigs) | ||
{ | ||
EGLint defaultConfigID; | ||
eglGetConfigAttrib(display, defaultConfig, EGL_CONFIG_ID, &defaultConfigID); | ||
if (defaultConfigID == thisConfigID) | ||
{ | ||
foundInDefaultConfigs = true; | ||
} | ||
} | ||
ASSERT_EQ(isADefault, foundInDefaultConfigs); | ||
} | ||
} | ||
|
||
} // namespace angle | ||
|
||
ANGLE_INSTANTIATE_TEST(EGLChooseConfigTest, | ||
ES2_D3D11(), | ||
ES2_D3D9(), | ||
ES2_OPENGL(), | ||
ES2_OPENGLES(), | ||
ES2_VULKAN()); |