Commit a2f043d8 by Jamie Madill Committed by Commit Bot

dEQP: Implement platform error handling.

Also downgrades several Vulkan UNIMPLEMENTED() to WARN(). Also downgrades a couple D3D-specific errors to warnings. Also downgrades an undefined behaviour integer clear error to warning. Also includes suppressions for failing D3D11 ES 3.1 SSBO tests. Also includes suppressions for failing Android GLES format tests. Also includes suppressions for failing Android Vulkan buffer tests. Bug: angleproject:2552 Bug: angleproject:2567 Bug: angleproject:1951 Bug: angleproject:2405 Change-Id: Ie619085021d42012cd578b669f7ff4252ca41a58 Reviewed-on: https://chromium-review.googlesource.com/1062791 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent 569b9cb9
......@@ -526,11 +526,11 @@ gl::Error Clear11::clearFramebuffer(const gl::Context *context,
formatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
formatInfo.componentType == GL_SIGNED_NORMALIZED))
{
ERR() << "It is undefined behaviour to clear a render buffer which is not "
"normalized fixed point or floating-point to floating point values (color "
"attachment "
<< colorAttachmentIndex << " has internal format " << attachment.getFormat()
<< ").";
WARN() << "It is undefined behaviour to clear a render buffer which is not "
"normalized fixed point or floating-point to floating point values (color "
"attachment "
<< colorAttachmentIndex << " has internal format " << attachment.getFormat()
<< ").";
}
if ((formatInfo.redBits == 0 || !clearParams.colorMaskRed) &&
......
......@@ -116,12 +116,12 @@ gl::Error ContextVk::initialize()
gl::Error ContextVk::flush(const gl::Context *context)
{
// TODO(jmadill): Flush will need to insert a semaphore for the next flush to wait on.
UNIMPLEMENTED();
// TODO(jmadill): Multiple flushes will need to insert semaphores. http://anglebug.com/2504
// dEQP tests rely on having no errors thrown at the end of the test and they always call
// flush at the end of the their tests. Just returning NoError until we implement flush
// allow us to work on enabling many tests in the meantime.
WARN() << "Flush is unimplemented. http://anglebug.com/2504";
return gl::NoError();
}
......
......@@ -255,7 +255,7 @@ void VertexArrayVk::syncDirtyAttrib(const gl::VertexAttribute &attrib,
}
else
{
UNIMPLEMENTED();
WARN() << "Default vertex attributes unimplemented. http://anglebug.com/2444";
}
}
......@@ -319,7 +319,7 @@ void VertexArrayVk::updatePackedInputDescriptions(const RendererVk *rendererVk)
}
else
{
UNIMPLEMENTED();
WARN() << "Default vertex attributes unimplemented. http://anglebug.com/2444";
}
}
......
......@@ -2720,8 +2720,8 @@ bool ValidateDrawBase(Context *context, PrimitiveMode mode, GLsizei count)
{
if (!extensions.webglCompatibility)
{
ERR() << "This ANGLE implementation does not support separate front/back "
"stencil writemasks, reference values, or stencil mask values.";
WARN() << "This ANGLE implementation does not support separate front/back "
"stencil writemasks, reference values, or stencil mask values.";
}
ANGLE_VALIDATION_ERR(context, InvalidOperation(), StencilReferenceMaskOrMismatch);
return false;
......
......@@ -4644,7 +4644,7 @@ bool ValidateBlendFuncSeparate(Context *context,
"Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and "
"GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR not supported by this "
"implementation.";
ERR() << msg;
WARN() << msg;
}
context->handleError(InvalidOperation() << msg);
return false;
......
......@@ -518,7 +518,6 @@ if (build_angle_gles1_conform_tests) {
### dEQP tests
###-----------------------------------------------------
# TODO(jmadill): Other platforms.
if (build_angle_deqp_tests) {
deqp_gypi =
exec_script("//build/gypi_to_gn.py",
......@@ -618,8 +617,10 @@ if (build_angle_deqp_tests) {
angle_root + ":angle_common",
angle_root + ":angle_util",
angle_root + ":libEGL${angle_libs_suffix}",
angle_root + ":libGLESv2${angle_libs_suffix}",
"//third_party/libpng:libpng",
]
defines = [ "ANGLE_EGL_LIBRARY_NAME=\"libEGL${angle_libs_suffix}\"" ]
configs -= deqp_undefine_configs
......
......@@ -20,10 +20,23 @@
#include "common/platform.h"
#include "common/string_utils.h"
#include "gpu_test_expectations_parser.h"
#include "platform/Platform.h"
#include "system_utils.h"
namespace
{
bool gGlobalError = false;
bool gExpectError = false;
void HandlePlatformError(angle::PlatformMethods *platform, const char *errorMessage)
{
if (!gExpectError)
{
FAIL() << errorMessage;
}
gGlobalError = true;
}
std::string DrawElementsToGoogleTestName(const std::string &dEQPName)
{
std::string gTestName = dEQPName.substr(dEQPName.find('.') + 1);
......@@ -332,10 +345,18 @@ class dEQPTest : public testing::TestWithParam<size_t>
const auto &caseInfo = GetCaseList().getCaseInfo(GetParam());
std::cout << caseInfo.mDEQPName << std::endl;
gExpectError = (caseInfo.mExpectation != gpu::GPUTestExpectationsParser::kGpuTestPass);
TestResult result = deqp_libtester_run(caseInfo.mDEQPName.c_str());
bool testPassed = TestPassed(result);
// Check the global error flag for unexpected platform errors.
if (gGlobalError)
{
testPassed = false;
gGlobalError = false;
}
if (caseInfo.mExpectation == gpu::GPUTestExpectationsParser::kGpuTestPass)
{
EXPECT_TRUE(testPassed);
......@@ -397,7 +418,8 @@ void dEQPTest<TestModuleIndex>::SetUpTestCase()
argv.push_back(configArgString.c_str());
// Init the platform.
if (!deqp_libtester_init_platform(static_cast<int>(argv.size()), argv.data()))
if (!deqp_libtester_init_platform(static_cast<int>(argv.size()), argv.data(),
reinterpret_cast<void *>(&HandlePlatformError)))
{
std::cout << "Aborting test due to dEQP initialization error." << std::endl;
exit(1);
......
......@@ -37,7 +37,9 @@ enum class TestResult
// Exported to the tester app.
ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[]);
ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *argv[]);
ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc,
const char *argv[],
void *logErrorFunc);
ANGLE_LIBTESTER_EXPORT void deqp_libtester_shutdown_platform();
ANGLE_LIBTESTER_EXPORT TestResult deqp_libtester_run(const char *caseName);
......
......@@ -12,6 +12,8 @@
#include "common/angleutils.h"
#include "deMath.h"
#include "deUniquePtr.hpp"
#include "platform/Platform.h"
#include "system_utils.h"
#include "tcuApp.hpp"
#include "tcuCommandLine.hpp"
#include "tcuDefs.hpp"
......@@ -19,7 +21,6 @@
#include "tcuRandomOrderExecutor.h"
#include "tcuResource.hpp"
#include "tcuTestLog.hpp"
#include "system_utils.h"
#if (DE_OS == DE_OS_WIN32)
#include <Windows.h>
......@@ -31,7 +32,7 @@
#include <sys/stat.h>
#endif
tcu::Platform *createPlatform();
tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc);
namespace
{
......@@ -118,7 +119,9 @@ std::string GetLogFileName(std::string deqpDataDir)
} // anonymous namespace
ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *argv[])
ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc,
const char *argv[],
void *logErrorFunc)
{
try
{
......@@ -126,7 +129,7 @@ ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *a
// Set stdout to line-buffered mode (will be fully buffered by default if stdout is pipe).
setvbuf(stdout, DE_NULL, _IOLBF, 4 * 1024);
#endif
g_platform = createPlatform();
g_platform = CreateANGLEPlatform(reinterpret_cast<angle::LogErrorFunc>(logErrorFunc));
if (!deSetRoundingMode(DE_ROUNDINGMODE_TO_NEAREST_EVEN))
{
......@@ -160,7 +163,7 @@ ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *a
// Exported to the tester app.
ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[])
{
if (!deqp_libtester_init_platform(argc, argv))
if (!deqp_libtester_init_platform(argc, argv, nullptr))
{
tcu::die("Could not initialize the dEQP platform");
}
......@@ -207,7 +210,7 @@ ANGLE_LIBTESTER_EXPORT void deqp_libtester_shutdown_platform()
ANGLE_LIBTESTER_EXPORT TestResult deqp_libtester_run(const char *caseName)
{
const char *emptyString = "";
if (g_platform == nullptr && !deqp_libtester_init_platform(1, &emptyString))
if (g_platform == nullptr && !deqp_libtester_init_platform(1, &emptyString, nullptr))
{
tcu::die("Failed to initialize platform.");
}
......
......@@ -256,6 +256,11 @@
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_4_short* = SKIP
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.rg_unsigned_byte = FAIL
// Windows Linux and Mac failures
1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.srgb8 = FAIL
1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.srgb8 = FAIL
......@@ -381,3 +386,10 @@
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP
// Failures because of unsupported vertex formats on Android.
2405 VULKAN ANDROID : dEQP-GLES2.functional.buffer.write.* = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_byte3_normalized_vec4_dynamic_draw_quads_1 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_byte3_normalized_vec4_dynamic_draw_quads_256 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_byte3_normalized_vec4_dynamic_draw_quads_1 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_byte3_normalized_vec4_dynamic_draw_quads_256 = FAIL
......@@ -1644,3 +1644,8 @@
2324 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_storage.block_number_limits = FAIL
2324 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.log.shader_storage.block_number_limits = FAIL
2324 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_storage.block_number_limits = FAIL
// These tests are failing because of compile errors with SSBOs in compute shaders.
1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.exceed_shared_memory_size_limit = FAIL
1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.compute.exceed_shared_memory_size_limit = FAIL
1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.compute.exceed_shared_memory_size_limit = FAIL
......@@ -466,3 +466,8 @@
2628 ANDROID : dEQP-GLES3.functional.shaders.indexing.moredynamic.user_defined_fncall_inout_parameter_with_index_with_side_effects_fragment = FAIL
2628 ANDROID : dEQP-GLES3.functional.shaders.indexing.moredynamic.user_defined_fncall_out_parameter_fragment = FAIL
2627 ANDROID : dEQP-GLES3.functional.shaders.loops.short_circuit.* = FAIL
2567 GLES ANDROID : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.rg_unsigned_byte = FAIL
......@@ -30,12 +30,17 @@
static_assert(EGL_DONT_CARE == -1, "Unexpected value for EGL_DONT_CARE");
// We should clean this up at some point by making it a properly exposed enum.
#define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x9999
namespace tcu
{
ANGLEPlatform::ANGLEPlatform()
ANGLEPlatform::ANGLEPlatform(angle::LogErrorFunc logErrorFunc)
{
angle::SetLowPriorityProcess();
mPlatformMethods.logError = logErrorFunc;
#if (DE_OS == DE_OS_WIN32)
{
std::vector<eglw::EGLAttrib> d3d11Attribs = initAttribs(
......@@ -146,13 +151,23 @@ std::vector<eglw::EGLAttrib> ANGLEPlatform::initAttribs(eglw::EGLAttrib type,
attribs.push_back(minorVersion);
}
static_assert(sizeof(eglw::EGLAttrib) == sizeof(angle::PlatformMethods *),
"Unexpected pointer size");
attribs.push_back(EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX);
attribs.push_back(reinterpret_cast<eglw::EGLAttrib>(&mPlatformMethods));
attribs.push_back(EGL_NONE);
return attribs;
}
} // namespace tcu
// Create platform
tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc)
{
return new tcu::ANGLEPlatform(logErrorFunc);
}
tcu::Platform *createPlatform()
{
return new tcu::ANGLEPlatform();
return CreateANGLEPlatform(nullptr);
}
......@@ -29,6 +29,7 @@
# include "egluPlatform.hpp"
#endif
#include "platform/Platform.h"
#include "tcuANGLENativeDisplayFactory.h"
namespace tcu
......@@ -39,7 +40,7 @@ class ANGLEPlatform : public tcu::Platform,
private eglu::Platform
{
public:
ANGLEPlatform();
ANGLEPlatform(angle::LogErrorFunc logErrorFunc);
~ANGLEPlatform();
bool processEvents() override;
......@@ -55,6 +56,7 @@ class ANGLEPlatform : public tcu::Platform,
eglw::EGLAttrib minorVersion = -1);
EventState mEvents;
angle::PlatformMethods mPlatformMethods;
};
} // tcu
......
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