Path: blob/main_old/src/tests/egl_tests/EGLDebugTest.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// EGLDebugTest.cpp:6// Tests of EGL_KHR_debug extension78#include <gtest/gtest.h>910#include "test_utils/ANGLETest.h"11#include "test_utils/angle_test_configs.h"12#include "util/EGLWindow.h"1314namespace angle15{16class EGLDebugTest : public ANGLETest17{18protected:19void testTearDown() override { eglDebugMessageControlKHR(nullptr, nullptr); }2021bool hasExtension() const { return IsEGLClientExtensionEnabled("EGL_KHR_debug"); }2223static void EGLAPIENTRY StubCallback(EGLenum error,24const char *command,25EGLint messageType,26EGLLabelKHR threadLabel,27EGLLabelKHR objectLabel,28const char *message)29{}3031static void EGLAPIENTRY CheckBadBindAPIError(EGLenum error,32const char *command,33EGLint messageType,34EGLLabelKHR threadLabel,35EGLLabelKHR objectLabel,36const char *message)37{38EXPECT_STREQ("eglBindAPI", command);39ASSERT_EGLENUM_EQ(EGL_BAD_PARAMETER, error);40EXPECT_STREQ("Thread", static_cast<const char *>(threadLabel));41}4243static EGLDEBUGPROCKHR EGLAttribToDebugCallback(EGLAttrib attrib)44{45return reinterpret_cast<EGLDEBUGPROCKHR>(static_cast<uintptr_t>(attrib));46}4748static EGLAttrib DebugCallbackToEGLAttrib(EGLDEBUGPROCKHR callback)49{50return static_cast<EGLAttrib>(reinterpret_cast<intptr_t>(callback));51}52};5354// Test that the extension is always available (it is implemented in ANGLE's frontend).55TEST_P(EGLDebugTest, ExtensionAlwaysAvailable)56{57ASSERT_TRUE(hasExtension());58}5960// Check that the default message filters and callbacks are correct61TEST_P(EGLDebugTest, DefaultParameters)62{63ANGLE_SKIP_TEST_IF(!hasExtension());6465EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));6667EGLAttrib result = 0;6869EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_ERROR_KHR, &result));70EXPECT_EGL_TRUE(result);7172EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_WARN_KHR, &result));73EXPECT_EGL_FALSE(result);7475EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_INFO_KHR, &result));76EXPECT_EGL_FALSE(result);7778EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_CALLBACK_KHR, &result));79EXPECT_EQ(nullptr, EGLAttribToDebugCallback(result));80}8182// Check that the message control and callback parameters can be set and then queried back83TEST_P(EGLDebugTest, SetMessageControl)84{85ANGLE_SKIP_TEST_IF(!hasExtension());8687EGLAttrib controls[] = {88EGL_DEBUG_MSG_CRITICAL_KHR,89EGL_FALSE,90// EGL_DEBUG_MSG_ERROR_KHR left unset91EGL_DEBUG_MSG_WARN_KHR,92EGL_TRUE,93EGL_DEBUG_MSG_INFO_KHR,94EGL_FALSE,95EGL_NONE,96EGL_NONE,97};9899EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(&StubCallback, controls));100101EGLAttrib result = 0;102103EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_CRITICAL_KHR, &result));104EXPECT_EGL_FALSE(result);105106EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_ERROR_KHR, &result));107EXPECT_EGL_TRUE(result);108109EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_WARN_KHR, &result));110EXPECT_EGL_TRUE(result);111112EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_MSG_INFO_KHR, &result));113EXPECT_EGL_FALSE(result);114115EXPECT_EGL_TRUE(eglQueryDebugKHR(EGL_DEBUG_CALLBACK_KHR, &result));116EXPECT_EQ(DebugCallbackToEGLAttrib(&StubCallback), result);117}118119// Set a thread label and then trigger a callback to verify the callback parameters are correct120TEST_P(EGLDebugTest, CorrectCallbackParameters)121{122ANGLE_SKIP_TEST_IF(!hasExtension());123124EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));125126EXPECT_EQ(EGL_SUCCESS, eglLabelObjectKHR(EGL_NO_DISPLAY, EGL_OBJECT_THREAD_KHR, nullptr,127const_cast<char *>("Thread")));128129// Enable all messages130EGLAttrib controls[] = {131EGL_DEBUG_MSG_CRITICAL_KHR,132EGL_TRUE,133EGL_DEBUG_MSG_ERROR_KHR,134EGL_TRUE,135EGL_DEBUG_MSG_WARN_KHR,136EGL_TRUE,137EGL_DEBUG_MSG_INFO_KHR,138EGL_TRUE,139EGL_NONE,140EGL_NONE,141};142143EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS),144eglDebugMessageControlKHR(&CheckBadBindAPIError, controls));145146// Generate an error and trigger the callback147EXPECT_EGL_FALSE(eglBindAPI(0xBADDBADD));148}149150// Test that labels can be set and that errors are generated if the wrong object type is used151TEST_P(EGLDebugTest, SetLabel)152{153ANGLE_SKIP_TEST_IF(!hasExtension());154155EGLDisplay display = getEGLWindow()->getDisplay();156EGLSurface surface = getEGLWindow()->getSurface();157158EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));159160// Display display and object must be equal when setting a display label161EXPECT_EQ(162static_cast<EGLint>(EGL_SUCCESS),163eglLabelObjectKHR(display, EGL_OBJECT_DISPLAY_KHR, display, const_cast<char *>("Display")));164EXPECT_NE(static_cast<EGLint>(EGL_SUCCESS),165eglLabelObjectKHR(nullptr, EGL_OBJECT_DISPLAY_KHR, getEGLWindow()->getDisplay(),166const_cast<char *>("Display")));167168// Set a surface label169EXPECT_EQ(170static_cast<EGLint>(EGL_SUCCESS),171eglLabelObjectKHR(display, EGL_OBJECT_SURFACE_KHR, surface, const_cast<char *>("Surface")));172EXPECT_EGL_ERROR(EGL_SUCCESS);173174// Provide a surface but use an image label type175EXPECT_EQ(176static_cast<EGLint>(EGL_BAD_PARAMETER),177eglLabelObjectKHR(display, EGL_OBJECT_IMAGE_KHR, surface, const_cast<char *>("Image")));178EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);179}180181GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLDebugTest);182ANGLE_INSTANTIATE_TEST(EGLDebugTest,183ES2_D3D9(),184ES2_D3D11(),185ES3_D3D11(),186ES2_OPENGL(),187ES3_OPENGL(),188ES2_VULKAN());189190} // namespace angle191192193