// // Copyright 2015 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. // // ErrorMessages.cpp : Tests functionality of internal error error messages #include "test_utils/ANGLETest.h" #include "../src/libANGLE/ErrorStrings.h" #include "test_utils/gl_raii.h" namespace { struct Message { GLenum source; GLenum type; GLenum id; GLenum severity; std::string message; const void *userParam; inline bool operator==(Message a) { if (a.source == source && a.type == type && a.id == id && a.message == message) { return true; } else { return false; } } }; static void GL_APIENTRY Callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) { Message m{source, type, id, severity, std::string(message, length), userParam}; std::vector *messages = static_cast *>(const_cast(userParam)); messages->push_back(m); } } // namespace namespace angle { class ErrorMessagesTest : public ANGLETest<> { protected: ErrorMessagesTest() { setWindowWidth(128); setWindowHeight(128); setConfigRedBits(8); setConfigGreenBits(8); setConfigBlueBits(8); setConfigAlphaBits(8); setWebGLCompatibilityEnabled(true); } }; // Verify functionality of WebGL specific errors using KHR_debug TEST_P(ErrorMessagesTest, ErrorMessages) { ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_debug")); glEnable(GL_DEBUG_OUTPUT); std::vector messages; glDebugMessageCallbackKHR(Callback, &messages); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); constexpr GLenum source = GL_DEBUG_SOURCE_API; constexpr GLenum type = GL_DEBUG_TYPE_ERROR; constexpr GLenum severity = GL_DEBUG_SEVERITY_HIGH; constexpr GLuint id1 = 1282; const std::string message1 = gl::err::kWebglBindAttribLocationReservedPrefix; Message expectedMessage; GLint numMessages = 0; glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); EXPECT_EQ(0, numMessages); glBindAttribLocation(0, 0, "_webgl_var"); ASSERT_EQ(1u, messages.size()); expectedMessage.source = source; expectedMessage.id = id1; expectedMessage.type = type; expectedMessage.severity = severity; expectedMessage.message = message1; Message &m = messages.front(); ASSERT_TRUE(m == expectedMessage); } // Use this to select which configurations (e.g. which renderer, which GLES major version) these // tests should be run against. ANGLE_INSTANTIATE_TEST(ErrorMessagesTest, ES2_D3D9(), ES2_D3D11(), ES3_D3D11(), ES2_METAL(), ES2_OPENGL(), ES3_OPENGL(), ES2_OPENGLES(), ES3_OPENGLES(), ES2_VULKAN()); } // namespace angle