15db71995Sopenharmony_ci/* 25db71995Sopenharmony_ci * Copyright (c) 2022 The Khronos Group Inc. 35db71995Sopenharmony_ci * Copyright (c) 2022 Valve Corporation 45db71995Sopenharmony_ci * Copyright (c) 2022 LunarG, Inc. 55db71995Sopenharmony_ci * 65db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 75db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to 85db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the 95db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 105db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are 115db71995Sopenharmony_ci * furnished to do so, subject to the following conditions: 125db71995Sopenharmony_ci * 135db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in 145db71995Sopenharmony_ci * all copies or substantial portions of the Materials. 155db71995Sopenharmony_ci * 165db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 175db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 185db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 195db71995Sopenharmony_ci * 205db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 215db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 225db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 235db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS. 245db71995Sopenharmony_ci * 255db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com> 265db71995Sopenharmony_ci * Author: Mark Young <marky@lunarg.com> 275db71995Sopenharmony_ci */ 285db71995Sopenharmony_ci 295db71995Sopenharmony_ci#include "test_environment.h" 305db71995Sopenharmony_ci 315db71995Sopenharmony_ci// 325db71995Sopenharmony_ci// VK_EXT_debug_report specific tests 335db71995Sopenharmony_ci// ========================================= 345db71995Sopenharmony_ci// 355db71995Sopenharmony_ci 365db71995Sopenharmony_ci// Prototype declaration for callback so we can use it in class utility methods 375db71995Sopenharmony_ciVkBool32 VKAPI_CALL test_DebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, 385db71995Sopenharmony_ci size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, 395db71995Sopenharmony_ci void* pUserData); 405db71995Sopenharmony_ci 415db71995Sopenharmony_ciclass DebugReportTest : public ::testing::Test { 425db71995Sopenharmony_ci public: 435db71995Sopenharmony_ci void VerifyExpected(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT object_type, const std::string& message) { 445db71995Sopenharmony_ci if (object_type == expected_object_type && 0 < (flags | expected_flag)) { 455db71995Sopenharmony_ci if (allow_any_message || (std::string::npos != message.find(expected_message))) { 465db71995Sopenharmony_ci message_found = true; 475db71995Sopenharmony_ci } 485db71995Sopenharmony_ci } 495db71995Sopenharmony_ci } 505db71995Sopenharmony_ci 515db71995Sopenharmony_ci protected: 525db71995Sopenharmony_ci virtual void SetUp() { 535db71995Sopenharmony_ci env = std::unique_ptr<FrameworkEnvironment>(new FrameworkEnvironment()); 545db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 3; ++icd) { 555db71995Sopenharmony_ci env->add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_0)); 565db71995Sopenharmony_ci env->get_test_icd(icd).physical_devices.push_back({}); 575db71995Sopenharmony_ci env->get_test_icd(icd).physical_devices.push_back({}); 585db71995Sopenharmony_ci } 595db71995Sopenharmony_ci // Initialize the expected output 605db71995Sopenharmony_ci allow_any_message = false; 615db71995Sopenharmony_ci expected_message = ""; 625db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT; 635db71995Sopenharmony_ci message_found = false; 645db71995Sopenharmony_ci } 655db71995Sopenharmony_ci 665db71995Sopenharmony_ci VkResult CreateReportInstance(VkDebugReportFlagsEXT debug_report_flags, VkInstance* inst, 675db71995Sopenharmony_ci VkApplicationInfo* app_info = nullptr) { 685db71995Sopenharmony_ci std::vector<const char*> enabled_extensions; 695db71995Sopenharmony_ci enabled_extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); 705db71995Sopenharmony_ci 715db71995Sopenharmony_ci // Setup the debug report struct 725db71995Sopenharmony_ci VkDebugReportCallbackCreateInfoEXT debug_report_info{VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT}; 735db71995Sopenharmony_ci debug_report_info.pNext = nullptr; 745db71995Sopenharmony_ci debug_report_info.flags = debug_report_flags; 755db71995Sopenharmony_ci debug_report_info.pfnCallback = reinterpret_cast<PFN_vkDebugReportCallbackEXT>(test_DebugReportCallback); 765db71995Sopenharmony_ci debug_report_info.pUserData = reinterpret_cast<void*>(this); 775db71995Sopenharmony_ci 785db71995Sopenharmony_ci // Pass it into instance create struct 795db71995Sopenharmony_ci VkInstanceCreateInfo create_info{}; 805db71995Sopenharmony_ci create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 815db71995Sopenharmony_ci create_info.pNext = &debug_report_info; 825db71995Sopenharmony_ci create_info.pApplicationInfo = app_info; 835db71995Sopenharmony_ci create_info.enabledExtensionCount = static_cast<uint32_t>(enabled_extensions.size()); 845db71995Sopenharmony_ci create_info.ppEnabledExtensionNames = enabled_extensions.data(); 855db71995Sopenharmony_ci 865db71995Sopenharmony_ci return env->vulkan_functions.vkCreateInstance(&create_info, nullptr, inst); 875db71995Sopenharmony_ci } 885db71995Sopenharmony_ci 895db71995Sopenharmony_ci VkResult CreateReportCallback(VkInstance inst, VkDebugReportFlagsEXT debug_report_flags, VkDebugReportCallbackEXT* callback) { 905db71995Sopenharmony_ci PFN_vkCreateDebugReportCallbackEXT create_debug_report = reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>( 915db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkCreateDebugReportCallbackEXT")); 925db71995Sopenharmony_ci if (nullptr == create_debug_report) { 935db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; 945db71995Sopenharmony_ci } 955db71995Sopenharmony_ci VkDebugReportCallbackCreateInfoEXT debug_report_info{VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT}; 965db71995Sopenharmony_ci debug_report_info.pNext = nullptr; 975db71995Sopenharmony_ci debug_report_info.flags = debug_report_flags; 985db71995Sopenharmony_ci debug_report_info.pfnCallback = reinterpret_cast<PFN_vkDebugReportCallbackEXT>(test_DebugReportCallback); 995db71995Sopenharmony_ci debug_report_info.pUserData = reinterpret_cast<void*>(this); 1005db71995Sopenharmony_ci return create_debug_report(inst, &debug_report_info, nullptr, callback); 1015db71995Sopenharmony_ci } 1025db71995Sopenharmony_ci 1035db71995Sopenharmony_ci VkResult DestroyReportCallback(VkInstance inst, VkDebugReportCallbackEXT callback) { 1045db71995Sopenharmony_ci PFN_vkDestroyDebugReportCallbackEXT destroy_debug_report = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>( 1055db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkDestroyDebugReportCallbackEXT")); 1065db71995Sopenharmony_ci if (nullptr == destroy_debug_report) { 1075db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; 1085db71995Sopenharmony_ci } 1095db71995Sopenharmony_ci destroy_debug_report(inst, callback, nullptr); 1105db71995Sopenharmony_ci return VK_SUCCESS; 1115db71995Sopenharmony_ci } 1125db71995Sopenharmony_ci 1135db71995Sopenharmony_ci virtual void TearDown() { env.reset(); } 1145db71995Sopenharmony_ci 1155db71995Sopenharmony_ci std::unique_ptr<FrameworkEnvironment> env; 1165db71995Sopenharmony_ci bool allow_any_message; 1175db71995Sopenharmony_ci std::string expected_message; 1185db71995Sopenharmony_ci VkDebugReportObjectTypeEXT expected_object_type; 1195db71995Sopenharmony_ci VkDebugReportFlagBitsEXT expected_flag; 1205db71995Sopenharmony_ci bool message_found; 1215db71995Sopenharmony_ci}; 1225db71995Sopenharmony_ci 1235db71995Sopenharmony_ci// This is the actual callback prototyped above. 1245db71995Sopenharmony_ciVkBool32 VKAPI_CALL test_DebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, 1255db71995Sopenharmony_ci [[maybe_unused]] uint64_t object, [[maybe_unused]] size_t location, 1265db71995Sopenharmony_ci [[maybe_unused]] int32_t messageCode, [[maybe_unused]] const char* pLayerPrefix, 1275db71995Sopenharmony_ci const char* pMessage, void* pUserData) { 1285db71995Sopenharmony_ci DebugReportTest* debug_report_test = reinterpret_cast<DebugReportTest*>(pUserData); 1295db71995Sopenharmony_ci debug_report_test->VerifyExpected(flags, objectType, pMessage); 1305db71995Sopenharmony_ci return VK_FALSE; 1315db71995Sopenharmony_ci} 1325db71995Sopenharmony_ci 1335db71995Sopenharmony_ciclass CreateDestroyInstanceReport : public DebugReportTest {}; 1345db71995Sopenharmony_ciclass SeparateReport : public DebugReportTest {}; 1355db71995Sopenharmony_ciclass ManualReport : public DebugReportTest {}; 1365db71995Sopenharmony_ci 1375db71995Sopenharmony_ci// Test creating and destroying instance looking for errors, but none should occur. 1385db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceReport, NoCallback) { 1395db71995Sopenharmony_ci // Make sure we don't find any errors 1405db71995Sopenharmony_ci allow_any_message = true; 1415db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 1425db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_ERROR_BIT_EXT; 1435db71995Sopenharmony_ci 1445db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 1455db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 1465db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 1475db71995Sopenharmony_ci 1485db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 1495db71995Sopenharmony_ci} 1505db71995Sopenharmony_ci 1515db71995Sopenharmony_ci// Test report (error) created in vkCreateInstance with warning in vkCreateInstance 1525db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceReport, WarnInCreateIgnored) { 1535db71995Sopenharmony_ci expected_message = "The API Variant specified"; 1545db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 1555db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_WARNING_BIT_EXT; 1565db71995Sopenharmony_ci 1575db71995Sopenharmony_ci VkApplicationInfo app_info; 1585db71995Sopenharmony_ci app_info.apiVersion = VK_MAKE_API_VERSION(1, 1, 0, 0); 1595db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 1605db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst, &app_info)); 1615db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 1625db71995Sopenharmony_ci 1635db71995Sopenharmony_ci // Message should NOT be found (because we only have errors reported in create) 1645db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 1655db71995Sopenharmony_ci} 1665db71995Sopenharmony_ci 1675db71995Sopenharmony_ci// Test creating and destroying instance looking for errors, but none should occur. 1685db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceReport, WarnInCreate) { 1695db71995Sopenharmony_ci expected_message = "The API Variant specified"; 1705db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 1715db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_WARNING_BIT_EXT; 1725db71995Sopenharmony_ci 1735db71995Sopenharmony_ci VkApplicationInfo app_info; 1745db71995Sopenharmony_ci app_info.apiVersion = VK_MAKE_API_VERSION(1, 1, 0, 0); 1755db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 1765db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_WARNING_BIT_EXT, &inst, &app_info)); 1775db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 1785db71995Sopenharmony_ci 1795db71995Sopenharmony_ci // Message should be found (because we only have errors reported in create) 1805db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 1815db71995Sopenharmony_ci} 1825db71995Sopenharmony_ci 1835db71995Sopenharmony_ci// Test report (error/warning) created in vkCreateInstance with error in vkEnumeratePhysicalDevices. 1845db71995Sopenharmony_ci// This should not be logged because we have only defined the debug report logging for vkCreateInstance 1855db71995Sopenharmony_ci// and vkDestroyInstance. 1865db71995Sopenharmony_ciTEST_F(SeparateReport, ErrorInEnumDevsNoCallback) { 1875db71995Sopenharmony_ci // Look for the invaid count param message 1885db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 1895db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 1905db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_ERROR_BIT_EXT; 1915db71995Sopenharmony_ci 1925db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 1935db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 1945db71995Sopenharmony_ci 1955db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 1965db71995Sopenharmony_ci 1975db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 1985db71995Sopenharmony_ci 1995db71995Sopenharmony_ci // Message should NOT be found (because we don't have a report callback setup outside of the create/destroy instance chain) 2005db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 2015db71995Sopenharmony_ci} 2025db71995Sopenharmony_ci 2035db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with error in vkEnumeratePhysicalDevices. 2045db71995Sopenharmony_ci// This should be logged now. 2055db71995Sopenharmony_ciTEST_F(SeparateReport, ErrorInEnumDevs) { 2065db71995Sopenharmony_ci // Look for the invaid count param message 2075db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 2085db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 2095db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_ERROR_BIT_EXT; 2105db71995Sopenharmony_ci 2115db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 2125db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 2135db71995Sopenharmony_ci 2145db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 2155db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, &callback)); 2165db71995Sopenharmony_ci 2175db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 2185db71995Sopenharmony_ci 2195db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 2205db71995Sopenharmony_ci 2215db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 2225db71995Sopenharmony_ci 2235db71995Sopenharmony_ci // Message should be found 2245db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 2255db71995Sopenharmony_ci} 2265db71995Sopenharmony_ci 2275db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with info in vkEnumeratePhysicalDevices. 2285db71995Sopenharmony_ci// This should not be logged because type is wrong. 2295db71995Sopenharmony_ciTEST_F(SeparateReport, InfoInEnumDevsIgnored) { 2305db71995Sopenharmony_ci expected_message = "Trimming device count from 6 to 5"; 2315db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 2325db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 2335db71995Sopenharmony_ci 2345db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 2355db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 2365db71995Sopenharmony_ci 2375db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 2385db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, &callback)); 2395db71995Sopenharmony_ci 2405db71995Sopenharmony_ci uint32_t max_count = 5; 2415db71995Sopenharmony_ci std::array<VkPhysicalDevice, 5> devices; 2425db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, &max_count, devices.data()), VK_INCOMPLETE); 2435db71995Sopenharmony_ci 2445db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 2455db71995Sopenharmony_ci 2465db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 2475db71995Sopenharmony_ci 2485db71995Sopenharmony_ci // Message should not be found (because it's info) 2495db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 2505db71995Sopenharmony_ci} 2515db71995Sopenharmony_ci 2525db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with info in vkEnumeratePhysicalDevices. 2535db71995Sopenharmony_ci// This should be logged because type is correct. 2545db71995Sopenharmony_ciTEST_F(SeparateReport, InfoInEnumDevs) { 2555db71995Sopenharmony_ci expected_message = "Trimming device count from 6 to 5"; 2565db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 2575db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 2585db71995Sopenharmony_ci 2595db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 2605db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 2615db71995Sopenharmony_ci 2625db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 2635db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, &callback)); 2645db71995Sopenharmony_ci 2655db71995Sopenharmony_ci uint32_t max_count = 5; 2665db71995Sopenharmony_ci std::array<VkPhysicalDevice, 5> devices; 2675db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, &max_count, devices.data()), VK_INCOMPLETE); 2685db71995Sopenharmony_ci 2695db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 2705db71995Sopenharmony_ci 2715db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 2725db71995Sopenharmony_ci 2735db71995Sopenharmony_ci // Message should be found 2745db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 2755db71995Sopenharmony_ci} 2765db71995Sopenharmony_ci 2775db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with a manual info message of the wrong message flag type to be logged. 2785db71995Sopenharmony_ciTEST_F(ManualReport, InfoIgnoredWrongType) { 2795db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 2805db71995Sopenharmony_ci expected_message = my_message; 2815db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 2825db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 2835db71995Sopenharmony_ci 2845db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 2855db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 2865db71995Sopenharmony_ci 2875db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 2885db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, &callback)); 2895db71995Sopenharmony_ci 2905db71995Sopenharmony_ci PFN_vkDebugReportMessageEXT log_debug_report = 2915db71995Sopenharmony_ci reinterpret_cast<PFN_vkDebugReportMessageEXT>(env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkDebugReportMessageEXT")); 2925db71995Sopenharmony_ci ASSERT_NE(nullptr, log_debug_report); 2935db71995Sopenharmony_ci log_debug_report(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, (uint64_t)(inst), 0, 0, 2945db71995Sopenharmony_ci nullptr, my_message); 2955db71995Sopenharmony_ci 2965db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 2975db71995Sopenharmony_ci 2985db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 2995db71995Sopenharmony_ci 3005db71995Sopenharmony_ci // Message should not be found 3015db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 3025db71995Sopenharmony_ci} 3035db71995Sopenharmony_ci 3045db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with a manual info message of the wrong object type to be logged. 3055db71995Sopenharmony_ciTEST_F(ManualReport, InfoIgnoredWrongObject) { 3065db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 3075db71995Sopenharmony_ci expected_message = my_message; 3085db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 3095db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 3105db71995Sopenharmony_ci 3115db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 3125db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 3135db71995Sopenharmony_ci 3145db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 3155db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, &callback)); 3165db71995Sopenharmony_ci 3175db71995Sopenharmony_ci PFN_vkDebugReportMessageEXT log_debug_report = 3185db71995Sopenharmony_ci reinterpret_cast<PFN_vkDebugReportMessageEXT>(env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkDebugReportMessageEXT")); 3195db71995Sopenharmony_ci ASSERT_NE(nullptr, log_debug_report); 3205db71995Sopenharmony_ci log_debug_report(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)(inst), 0, 0, 3215db71995Sopenharmony_ci nullptr, my_message); 3225db71995Sopenharmony_ci 3235db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 3245db71995Sopenharmony_ci 3255db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 3265db71995Sopenharmony_ci 3275db71995Sopenharmony_ci // Message should not be found 3285db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 3295db71995Sopenharmony_ci} 3305db71995Sopenharmony_ci 3315db71995Sopenharmony_ci// Test report created outside of vkCreateInstance with a manual info message to be logged. 3325db71995Sopenharmony_ciTEST_F(ManualReport, InfoMessage) { 3335db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 3345db71995Sopenharmony_ci expected_message = my_message; 3355db71995Sopenharmony_ci expected_object_type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 3365db71995Sopenharmony_ci expected_flag = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 3375db71995Sopenharmony_ci 3385db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 3395db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportInstance(VK_DEBUG_REPORT_ERROR_BIT_EXT, &inst)); 3405db71995Sopenharmony_ci 3415db71995Sopenharmony_ci VkDebugReportCallbackEXT callback; 3425db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateReportCallback(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, &callback)); 3435db71995Sopenharmony_ci 3445db71995Sopenharmony_ci PFN_vkDebugReportMessageEXT log_debug_report = 3455db71995Sopenharmony_ci reinterpret_cast<PFN_vkDebugReportMessageEXT>(env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkDebugReportMessageEXT")); 3465db71995Sopenharmony_ci ASSERT_NE(nullptr, log_debug_report); 3475db71995Sopenharmony_ci log_debug_report(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, (uint64_t)(inst), 0, 0, 3485db71995Sopenharmony_ci nullptr, my_message); 3495db71995Sopenharmony_ci 3505db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyReportCallback(inst, callback)); 3515db71995Sopenharmony_ci 3525db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 3535db71995Sopenharmony_ci 3545db71995Sopenharmony_ci // Message should be found 3555db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 3565db71995Sopenharmony_ci} 3575db71995Sopenharmony_ci 3585db71995Sopenharmony_ci// 3595db71995Sopenharmony_ci// VK_EXT_debug_util specific tests 3605db71995Sopenharmony_ci// ========================================= 3615db71995Sopenharmony_ci// 3625db71995Sopenharmony_ci 3635db71995Sopenharmony_ci// Prototype declaration for callback so we can use it in class utility methods 3645db71995Sopenharmony_ciVkBool32 VKAPI_CALL test_DebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, 3655db71995Sopenharmony_ci VkDebugUtilsMessageTypeFlagsEXT message_types, 3665db71995Sopenharmony_ci const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data); 3675db71995Sopenharmony_ci 3685db71995Sopenharmony_ciclass DebugUtilTest : public ::testing::Test { 3695db71995Sopenharmony_ci public: 3705db71995Sopenharmony_ci void VerifyExpected(VkDebugUtilsMessageTypeFlagsEXT message_flags, VkDebugUtilsMessageSeverityFlagsEXT severity_flags, 3715db71995Sopenharmony_ci const std::string& message, const VkDebugUtilsMessengerCallbackDataEXT* callback_data) { 3725db71995Sopenharmony_ci if ((0 < (severity_flags | expected_severity_flags)) && (0 < (message_flags | expected_message_flags))) { 3735db71995Sopenharmony_ci if (allow_any_message || (std::string::npos != message.find(expected_message))) { 3745db71995Sopenharmony_ci for (uint32_t obj = 0; obj < callback_data->objectCount; ++obj) { 3755db71995Sopenharmony_ci if (callback_data->pObjects[obj].objectType == expected_object_type && 3765db71995Sopenharmony_ci (!check_object_handle || callback_data->pObjects[obj].objectHandle == expected_object_handle)) { 3775db71995Sopenharmony_ci message_found = true; 3785db71995Sopenharmony_ci break; 3795db71995Sopenharmony_ci } 3805db71995Sopenharmony_ci } 3815db71995Sopenharmony_ci } 3825db71995Sopenharmony_ci } 3835db71995Sopenharmony_ci } 3845db71995Sopenharmony_ci 3855db71995Sopenharmony_ci protected: 3865db71995Sopenharmony_ci virtual void SetUp() { 3875db71995Sopenharmony_ci env = std::unique_ptr<FrameworkEnvironment>(new FrameworkEnvironment()); 3885db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 3; ++icd) { 3895db71995Sopenharmony_ci env->add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_0)); 3905db71995Sopenharmony_ci env->get_test_icd(icd).physical_devices.push_back({}); 3915db71995Sopenharmony_ci env->get_test_icd(icd).physical_devices.push_back({}); 3925db71995Sopenharmony_ci } 3935db71995Sopenharmony_ci // Initialize the expected output 3945db71995Sopenharmony_ci allow_any_message = false; 3955db71995Sopenharmony_ci expected_message = ""; 3965db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_UNKNOWN; 3975db71995Sopenharmony_ci check_object_handle = false; 3985db71995Sopenharmony_ci expected_object_handle = 0; 3995db71995Sopenharmony_ci message_found = false; 4005db71995Sopenharmony_ci } 4015db71995Sopenharmony_ci 4025db71995Sopenharmony_ci VkResult CreateUtilsInstance(VkDebugUtilsMessageTypeFlagsEXT types, VkDebugUtilsMessageSeverityFlagsEXT severities, 4035db71995Sopenharmony_ci VkInstance* inst, VkApplicationInfo* app_info = nullptr) { 4045db71995Sopenharmony_ci std::vector<const char*> enabled_extensions; 4055db71995Sopenharmony_ci enabled_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); 4065db71995Sopenharmony_ci 4075db71995Sopenharmony_ci // Setup the debug utils struct 4085db71995Sopenharmony_ci VkDebugUtilsMessengerCreateInfoEXT debug_utils_info{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; 4095db71995Sopenharmony_ci debug_utils_info.pNext = nullptr; 4105db71995Sopenharmony_ci debug_utils_info.messageSeverity = severities; 4115db71995Sopenharmony_ci debug_utils_info.messageType = types; 4125db71995Sopenharmony_ci debug_utils_info.pfnUserCallback = reinterpret_cast<PFN_vkDebugUtilsMessengerCallbackEXT>(test_DebugUtilsCallback); 4135db71995Sopenharmony_ci debug_utils_info.pUserData = reinterpret_cast<void*>(this); 4145db71995Sopenharmony_ci 4155db71995Sopenharmony_ci VkInstanceCreateInfo create_info{}; 4165db71995Sopenharmony_ci create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 4175db71995Sopenharmony_ci create_info.pNext = &debug_utils_info; 4185db71995Sopenharmony_ci create_info.pApplicationInfo = app_info; 4195db71995Sopenharmony_ci create_info.enabledExtensionCount = static_cast<uint32_t>(enabled_extensions.size()); 4205db71995Sopenharmony_ci create_info.ppEnabledExtensionNames = enabled_extensions.data(); 4215db71995Sopenharmony_ci return env->vulkan_functions.vkCreateInstance(&create_info, nullptr, inst); 4225db71995Sopenharmony_ci } 4235db71995Sopenharmony_ci 4245db71995Sopenharmony_ci VkResult CreateUtilsMessenger(VkInstance inst, VkDebugUtilsMessageTypeFlagsEXT types, 4255db71995Sopenharmony_ci VkDebugUtilsMessageSeverityFlagsEXT severities, VkDebugUtilsMessengerEXT* messenger) { 4265db71995Sopenharmony_ci PFN_vkCreateDebugUtilsMessengerEXT create_messenger = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>( 4275db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkCreateDebugUtilsMessengerEXT")); 4285db71995Sopenharmony_ci if (nullptr == create_messenger) { 4295db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; 4305db71995Sopenharmony_ci } 4315db71995Sopenharmony_ci VkDebugUtilsMessengerCreateInfoEXT debug_utils_info{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; 4325db71995Sopenharmony_ci debug_utils_info.pNext = nullptr; 4335db71995Sopenharmony_ci debug_utils_info.messageSeverity = severities; 4345db71995Sopenharmony_ci debug_utils_info.messageType = types; 4355db71995Sopenharmony_ci debug_utils_info.pfnUserCallback = reinterpret_cast<PFN_vkDebugUtilsMessengerCallbackEXT>(test_DebugUtilsCallback); 4365db71995Sopenharmony_ci debug_utils_info.pUserData = reinterpret_cast<void*>(this); 4375db71995Sopenharmony_ci return create_messenger(inst, &debug_utils_info, nullptr, messenger); 4385db71995Sopenharmony_ci } 4395db71995Sopenharmony_ci 4405db71995Sopenharmony_ci VkResult DestroyUtilsMessenger(VkInstance inst, VkDebugUtilsMessengerEXT messenger) { 4415db71995Sopenharmony_ci PFN_vkDestroyDebugUtilsMessengerEXT destroy_messenger = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>( 4425db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkDestroyDebugUtilsMessengerEXT")); 4435db71995Sopenharmony_ci if (nullptr == destroy_messenger) { 4445db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; 4455db71995Sopenharmony_ci } 4465db71995Sopenharmony_ci destroy_messenger(inst, messenger, nullptr); 4475db71995Sopenharmony_ci return VK_SUCCESS; 4485db71995Sopenharmony_ci } 4495db71995Sopenharmony_ci 4505db71995Sopenharmony_ci virtual void TearDown() { env.reset(); } 4515db71995Sopenharmony_ci 4525db71995Sopenharmony_ci std::unique_ptr<FrameworkEnvironment> env; 4535db71995Sopenharmony_ci bool allow_any_message; 4545db71995Sopenharmony_ci std::string expected_message; 4555db71995Sopenharmony_ci VkObjectType expected_object_type; 4565db71995Sopenharmony_ci bool check_object_handle; 4575db71995Sopenharmony_ci uint64_t expected_object_handle; 4585db71995Sopenharmony_ci VkDebugUtilsMessageTypeFlagsEXT expected_message_flags; 4595db71995Sopenharmony_ci VkDebugUtilsMessageSeverityFlagsEXT expected_severity_flags; 4605db71995Sopenharmony_ci bool message_found; 4615db71995Sopenharmony_ci}; 4625db71995Sopenharmony_ci 4635db71995Sopenharmony_ci// This is the actual callback prototyped above. 4645db71995Sopenharmony_ci 4655db71995Sopenharmony_ciVkBool32 VKAPI_CALL test_DebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, 4665db71995Sopenharmony_ci VkDebugUtilsMessageTypeFlagsEXT message_types, 4675db71995Sopenharmony_ci const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) { 4685db71995Sopenharmony_ci DebugUtilTest* debug_util_test = reinterpret_cast<DebugUtilTest*>(user_data); 4695db71995Sopenharmony_ci debug_util_test->VerifyExpected(message_types, message_severity, callback_data->pMessage, callback_data); 4705db71995Sopenharmony_ci return VK_FALSE; 4715db71995Sopenharmony_ci} 4725db71995Sopenharmony_ci 4735db71995Sopenharmony_ciclass CreateDestroyInstanceMessenger : public DebugUtilTest {}; 4745db71995Sopenharmony_ciclass SeparateMessenger : public DebugUtilTest {}; 4755db71995Sopenharmony_ciclass ManualMessage : public DebugUtilTest {}; 4765db71995Sopenharmony_ci 4775db71995Sopenharmony_ci// Test creating and destroying instance looking for errors, but none should occur. 4785db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceMessenger, NoCallback) { 4795db71995Sopenharmony_ci // Make sure we don't find any errors 4805db71995Sopenharmony_ci allow_any_message = true; 4815db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 4825db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 4835db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; 4845db71995Sopenharmony_ci 4855db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 4865db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 4875db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 4885db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 4895db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 4905db71995Sopenharmony_ci 4915db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 4925db71995Sopenharmony_ci} 4935db71995Sopenharmony_ci 4945db71995Sopenharmony_ci// Test debug utils (error) created in vkCreateInstance with warning in vkCreateInstance 4955db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceMessenger, WarnInCreateIgnored) { 4965db71995Sopenharmony_ci expected_message = "The API Variant specified"; 4975db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 4985db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 4995db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; 5005db71995Sopenharmony_ci 5015db71995Sopenharmony_ci VkApplicationInfo app_info; 5025db71995Sopenharmony_ci app_info.apiVersion = VK_MAKE_API_VERSION(1, 1, 0, 0); 5035db71995Sopenharmony_ci 5045db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 5055db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 5065db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst, &app_info)); 5075db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 5085db71995Sopenharmony_ci 5095db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 5105db71995Sopenharmony_ci} 5115db71995Sopenharmony_ci 5125db71995Sopenharmony_ci// Test debug utils (error/warning) created in vkCreateInstance with warning in vkCreateInstance 5135db71995Sopenharmony_ciTEST_F(CreateDestroyInstanceMessenger, WarnInCreate) { 5145db71995Sopenharmony_ci expected_message = "The API Variant specified"; 5155db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 5165db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 5175db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; 5185db71995Sopenharmony_ci 5195db71995Sopenharmony_ci VkApplicationInfo app_info; 5205db71995Sopenharmony_ci app_info.apiVersion = VK_MAKE_API_VERSION(1, 1, 0, 0); 5215db71995Sopenharmony_ci 5225db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 5235db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 5245db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, &inst, &app_info)); 5255db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 5265db71995Sopenharmony_ci 5275db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 5285db71995Sopenharmony_ci} 5295db71995Sopenharmony_ci 5305db71995Sopenharmony_ci// Test debug utils error created in vkCreateInstance with error in vkEnumeratePhysicalDevices. 5315db71995Sopenharmony_ci// This should not be logged because we have only defined the debug utils logging for vkCreateInstance 5325db71995Sopenharmony_ci// and vkDestroyInstance. 5335db71995Sopenharmony_ciTEST_F(SeparateMessenger, ErrorInEnumDevsNoMessenger) { 5345db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 5355db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 5365db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; 5375db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; 5385db71995Sopenharmony_ci 5395db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 5405db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 5415db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 5425db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 5435db71995Sopenharmony_ci 5445db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 5455db71995Sopenharmony_ci 5465db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 5475db71995Sopenharmony_ci 5485db71995Sopenharmony_ci // Message should NOT be found (because we don't have a report callback setup outside of the create/destroy instance chain) 5495db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 5505db71995Sopenharmony_ci} 5515db71995Sopenharmony_ci 5525db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with error in vkEnumeratePhysicalDevices, but, with the wrong 5535db71995Sopenharmony_ci// message type so it still won't be logged. 5545db71995Sopenharmony_ciTEST_F(SeparateMessenger, ErrorInEnumDevsWrongType) { 5555db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 5565db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 5575db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; 5585db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; 5595db71995Sopenharmony_ci 5605db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 5615db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 5625db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 5635db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 5645db71995Sopenharmony_ci 5655db71995Sopenharmony_ci // Create the debug utils messenger to collect performance warnings and errors 5665db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 5675db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 5685db71995Sopenharmony_ci CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, 5695db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, 5705db71995Sopenharmony_ci &messenger)); 5715db71995Sopenharmony_ci 5725db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 5735db71995Sopenharmony_ci 5745db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 5755db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 5765db71995Sopenharmony_ci 5775db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 5785db71995Sopenharmony_ci 5795db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 5805db71995Sopenharmony_ci} 5815db71995Sopenharmony_ci 5825db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with error in vkEnumeratePhysicalDevices, but, with the wrong 5835db71995Sopenharmony_ci// message severity so it still won't be logged. 5845db71995Sopenharmony_ciTEST_F(SeparateMessenger, ErrorInEnumDevsWrongSeverity) { 5855db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 5865db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 5875db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; 5885db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; 5895db71995Sopenharmony_ci 5905db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 5915db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 5925db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 5935db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 5945db71995Sopenharmony_ci 5955db71995Sopenharmony_ci // Create the debug utils messenger to collect only validation warnings 5965db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 5975db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 5985db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, &messenger)); 5995db71995Sopenharmony_ci 6005db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 6015db71995Sopenharmony_ci 6025db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 6035db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 6045db71995Sopenharmony_ci 6055db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 6065db71995Sopenharmony_ci 6075db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 6085db71995Sopenharmony_ci} 6095db71995Sopenharmony_ci 6105db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with error in vkEnumeratePhysicalDevices with the correct type. 6115db71995Sopenharmony_ciTEST_F(SeparateMessenger, ErrorInEnumDevs) { 6125db71995Sopenharmony_ci expected_message = "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter"; 6135db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 6145db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; 6155db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; 6165db71995Sopenharmony_ci 6175db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 6185db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 6195db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 6205db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 6215db71995Sopenharmony_ci 6225db71995Sopenharmony_ci // Create the debug utils messenger to collect validation errors 6235db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 6245db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 6255db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &messenger)); 6265db71995Sopenharmony_ci 6275db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, nullptr, nullptr), VK_ERROR_INITIALIZATION_FAILED); 6285db71995Sopenharmony_ci 6295db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 6305db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 6315db71995Sopenharmony_ci 6325db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 6335db71995Sopenharmony_ci 6345db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 6355db71995Sopenharmony_ci} 6365db71995Sopenharmony_ci 6375db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with info in vkEnumeratePhysicalDevices. 6385db71995Sopenharmony_ci// This should not be logged because type is wrong. 6395db71995Sopenharmony_ciTEST_F(SeparateMessenger, InfoInEnumDevsIgnoredType) { 6405db71995Sopenharmony_ci expected_message = "Trimming device count from 6 to 5"; 6415db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 6425db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 6435db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 6445db71995Sopenharmony_ci 6455db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 6465db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 6475db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 6485db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 6495db71995Sopenharmony_ci 6505db71995Sopenharmony_ci // Create the debug utils messenger to collect validation info 6515db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 6525db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 6535db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, &messenger)); 6545db71995Sopenharmony_ci 6555db71995Sopenharmony_ci uint32_t max_count = 5; 6565db71995Sopenharmony_ci std::array<VkPhysicalDevice, 5> devices; 6575db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, &max_count, devices.data()), VK_INCOMPLETE); 6585db71995Sopenharmony_ci 6595db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 6605db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 6615db71995Sopenharmony_ci 6625db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 6635db71995Sopenharmony_ci 6645db71995Sopenharmony_ci // Message should not be found (because it's info) 6655db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 6665db71995Sopenharmony_ci} 6675db71995Sopenharmony_ci 6685db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with info in vkEnumeratePhysicalDevices. 6695db71995Sopenharmony_ci// This should not be logged because severity is wrong. 6705db71995Sopenharmony_ciTEST_F(SeparateMessenger, InfoInEnumDevsIgnoredSeverity) { 6715db71995Sopenharmony_ci expected_message = "Trimming device count from 6 to 5"; 6725db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 6735db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 6745db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 6755db71995Sopenharmony_ci 6765db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 6775db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 6785db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 6795db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 6805db71995Sopenharmony_ci 6815db71995Sopenharmony_ci // Create the debug utils messenger to collect general errors/warnings 6825db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 6835db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 6845db71995Sopenharmony_ci CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 6855db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, 6865db71995Sopenharmony_ci &messenger)); 6875db71995Sopenharmony_ci 6885db71995Sopenharmony_ci uint32_t max_count = 5; 6895db71995Sopenharmony_ci std::array<VkPhysicalDevice, 5> devices; 6905db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, &max_count, devices.data()), VK_INCOMPLETE); 6915db71995Sopenharmony_ci 6925db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 6935db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 6945db71995Sopenharmony_ci 6955db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 6965db71995Sopenharmony_ci 6975db71995Sopenharmony_ci // Message should not be found (because it's info) 6985db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 6995db71995Sopenharmony_ci} 7005db71995Sopenharmony_ci 7015db71995Sopenharmony_ci// Test debug utils created outside of vkCreateInstance with info in vkEnumeratePhysicalDevices. 7025db71995Sopenharmony_ciTEST_F(SeparateMessenger, InfoInEnumDevs) { 7035db71995Sopenharmony_ci expected_message = "Trimming device count from 6 to 5"; 7045db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 7055db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 7065db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 7075db71995Sopenharmony_ci 7085db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 7095db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 7105db71995Sopenharmony_ci CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 7115db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 7125db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 7135db71995Sopenharmony_ci 7145db71995Sopenharmony_ci // Create the debug utils messenger to collect general errors/warnings 7155db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 7165db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 7175db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, &messenger)); 7185db71995Sopenharmony_ci 7195db71995Sopenharmony_ci uint32_t max_count = 5; 7205db71995Sopenharmony_ci std::array<VkPhysicalDevice, 5> devices; 7215db71995Sopenharmony_ci ASSERT_EQ(env->vulkan_functions.vkEnumeratePhysicalDevices(inst, &max_count, devices.data()), VK_INCOMPLETE); 7225db71995Sopenharmony_ci 7235db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 7245db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 7255db71995Sopenharmony_ci 7265db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 7275db71995Sopenharmony_ci 7285db71995Sopenharmony_ci // Message should be found 7295db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 7305db71995Sopenharmony_ci} 7315db71995Sopenharmony_ci 7325db71995Sopenharmony_ci// Test messenger created outside of vkCreateInstance with a manual info message of the wrong message severity to be logged. 7335db71995Sopenharmony_ciTEST_F(ManualMessage, InfoMessageIgnoredSeverity) { 7345db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 7355db71995Sopenharmony_ci expected_message = my_message; 7365db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 7375db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 7385db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 7395db71995Sopenharmony_ci 7405db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 7415db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 7425db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 7435db71995Sopenharmony_ci 7445db71995Sopenharmony_ci // Create the debug utils messenger to collect general errors/warnings 7455db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 7465db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, 7475db71995Sopenharmony_ci CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 7485db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, 7495db71995Sopenharmony_ci &messenger)); 7505db71995Sopenharmony_ci 7515db71995Sopenharmony_ci // Trigger the message 7525db71995Sopenharmony_ci PFN_vkSubmitDebugUtilsMessageEXT submit_message = reinterpret_cast<PFN_vkSubmitDebugUtilsMessageEXT>( 7535db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkSubmitDebugUtilsMessageEXT")); 7545db71995Sopenharmony_ci ASSERT_NE(nullptr, submit_message); 7555db71995Sopenharmony_ci 7565db71995Sopenharmony_ci VkDebugUtilsObjectNameInfoEXT object{VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT}; 7575db71995Sopenharmony_ci object.objectType = VK_OBJECT_TYPE_INSTANCE; 7585db71995Sopenharmony_ci object.objectHandle = (uint64_t)inst; 7595db71995Sopenharmony_ci VkDebugUtilsMessengerCallbackDataEXT message_data{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT}; 7605db71995Sopenharmony_ci message_data.pMessage = my_message; 7615db71995Sopenharmony_ci message_data.objectCount = 1; 7625db71995Sopenharmony_ci message_data.pObjects = &object; 7635db71995Sopenharmony_ci submit_message(inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, &message_data); 7645db71995Sopenharmony_ci 7655db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 7665db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 7675db71995Sopenharmony_ci 7685db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 7695db71995Sopenharmony_ci 7705db71995Sopenharmony_ci // Message should not be found 7715db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 7725db71995Sopenharmony_ci} 7735db71995Sopenharmony_ci 7745db71995Sopenharmony_ci// Test messenger created outside of vkCreateInstance with a manual info message of the wrong object type to be logged. 7755db71995Sopenharmony_ciTEST_F(ManualMessage, InfoMessageIgnoredObject) { 7765db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 7775db71995Sopenharmony_ci expected_message = my_message; 7785db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 7795db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 7805db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 7815db71995Sopenharmony_ci 7825db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 7835db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 7845db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 7855db71995Sopenharmony_ci 7865db71995Sopenharmony_ci // Create the debug utils messenger to collect general errors/warnings 7875db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 7885db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 7895db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, &messenger)); 7905db71995Sopenharmony_ci 7915db71995Sopenharmony_ci // Trigger the message 7925db71995Sopenharmony_ci PFN_vkSubmitDebugUtilsMessageEXT submit_message = reinterpret_cast<PFN_vkSubmitDebugUtilsMessageEXT>( 7935db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkSubmitDebugUtilsMessageEXT")); 7945db71995Sopenharmony_ci ASSERT_NE(nullptr, submit_message); 7955db71995Sopenharmony_ci 7965db71995Sopenharmony_ci VkDebugUtilsObjectNameInfoEXT object{VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT}; 7975db71995Sopenharmony_ci object.objectType = VK_OBJECT_TYPE_COMMAND_POOL; 7985db71995Sopenharmony_ci object.objectHandle = (uint64_t)inst; 7995db71995Sopenharmony_ci VkDebugUtilsMessengerCallbackDataEXT message_data{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT}; 8005db71995Sopenharmony_ci message_data.pMessage = my_message; 8015db71995Sopenharmony_ci message_data.objectCount = 1; 8025db71995Sopenharmony_ci message_data.pObjects = &object; 8035db71995Sopenharmony_ci submit_message(inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, &message_data); 8045db71995Sopenharmony_ci 8055db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 8065db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 8075db71995Sopenharmony_ci 8085db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 8095db71995Sopenharmony_ci 8105db71995Sopenharmony_ci // Message should not be found 8115db71995Sopenharmony_ci ASSERT_EQ(false, message_found); 8125db71995Sopenharmony_ci} 8135db71995Sopenharmony_ci 8145db71995Sopenharmony_ci// Test messenger created outside of vkCreateInstance with a manual info message. 8155db71995Sopenharmony_ciTEST_F(ManualMessage, InfoMessage) { 8165db71995Sopenharmony_ci const char my_message[] = "This is my special message!"; 8175db71995Sopenharmony_ci expected_message = my_message; 8185db71995Sopenharmony_ci expected_object_type = VK_OBJECT_TYPE_INSTANCE; 8195db71995Sopenharmony_ci expected_message_flags = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; 8205db71995Sopenharmony_ci expected_severity_flags = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT; 8215db71995Sopenharmony_ci 8225db71995Sopenharmony_ci VkInstance inst = VK_NULL_HANDLE; 8235db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsInstance(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 8245db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, &inst)); 8255db71995Sopenharmony_ci 8265db71995Sopenharmony_ci // Create the debug utils messenger to collect general errors/warnings 8275db71995Sopenharmony_ci VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE; 8285db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, CreateUtilsMessenger(inst, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 8295db71995Sopenharmony_ci VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, &messenger)); 8305db71995Sopenharmony_ci 8315db71995Sopenharmony_ci // Trigger the message 8325db71995Sopenharmony_ci PFN_vkSubmitDebugUtilsMessageEXT submit_message = reinterpret_cast<PFN_vkSubmitDebugUtilsMessageEXT>( 8335db71995Sopenharmony_ci env->vulkan_functions.vkGetInstanceProcAddr(inst, "vkSubmitDebugUtilsMessageEXT")); 8345db71995Sopenharmony_ci ASSERT_NE(nullptr, submit_message); 8355db71995Sopenharmony_ci 8365db71995Sopenharmony_ci VkDebugUtilsObjectNameInfoEXT object{VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT}; 8375db71995Sopenharmony_ci object.objectType = VK_OBJECT_TYPE_INSTANCE; 8385db71995Sopenharmony_ci object.objectHandle = (uint64_t)inst; 8395db71995Sopenharmony_ci VkDebugUtilsMessengerCallbackDataEXT message_data{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT}; 8405db71995Sopenharmony_ci message_data.pMessage = my_message; 8415db71995Sopenharmony_ci message_data.objectCount = 1; 8425db71995Sopenharmony_ci message_data.pObjects = &object; 8435db71995Sopenharmony_ci submit_message(inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, &message_data); 8445db71995Sopenharmony_ci 8455db71995Sopenharmony_ci // Now that we should have gotten our message, destroy the messenger 8465db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DestroyUtilsMessenger(inst, messenger)); 8475db71995Sopenharmony_ci 8485db71995Sopenharmony_ci env->vulkan_functions.vkDestroyInstance(inst, nullptr); 8495db71995Sopenharmony_ci 8505db71995Sopenharmony_ci // Message should be found 8515db71995Sopenharmony_ci ASSERT_EQ(true, message_found); 8525db71995Sopenharmony_ci} 8535db71995Sopenharmony_ci 8545db71995Sopenharmony_civoid CheckDeviceFunctions(FrameworkEnvironment& env, bool use_GIPA, bool enable_debug_extensions, 8555db71995Sopenharmony_ci bool hardware_supports_debug_exts) { 8565db71995Sopenharmony_ci InstWrapper inst(env.vulkan_functions); 8575db71995Sopenharmony_ci if (enable_debug_extensions) { 8585db71995Sopenharmony_ci inst.create_info.add_extension("VK_EXT_debug_utils"); 8595db71995Sopenharmony_ci inst.create_info.add_extension("VK_EXT_debug_report"); 8605db71995Sopenharmony_ci } 8615db71995Sopenharmony_ci inst.create_info.setup_WSI(); 8625db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.CheckCreate()); 8635db71995Sopenharmony_ci 8645db71995Sopenharmony_ci auto phys_dev = inst.GetPhysDev(); 8655db71995Sopenharmony_ci 8665db71995Sopenharmony_ci DeviceWrapper dev{inst}; 8675db71995Sopenharmony_ci dev.create_info.add_extension("VK_KHR_swapchain"); 8685db71995Sopenharmony_ci dev.create_info.add_device_queue(DeviceQueueCreateInfo{}.add_priority(0.0f)); 8695db71995Sopenharmony_ci if (enable_debug_extensions) { 8705db71995Sopenharmony_ci dev.create_info.add_extension("VK_EXT_debug_marker"); 8715db71995Sopenharmony_ci } 8725db71995Sopenharmony_ci 8735db71995Sopenharmony_ci if (enable_debug_extensions && !hardware_supports_debug_exts) { 8745db71995Sopenharmony_ci // if the hardware doesn't support VK_EXT_debug_marker and we are trying to enable it, then we should exit since that will 8755db71995Sopenharmony_ci // fail to create a device 8765db71995Sopenharmony_ci 8775db71995Sopenharmony_ci dev.CheckCreate(phys_dev, VK_ERROR_EXTENSION_NOT_PRESENT); 8785db71995Sopenharmony_ci return; 8795db71995Sopenharmony_ci } else { 8805db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(dev.CheckCreate(phys_dev)); 8815db71995Sopenharmony_ci } 8825db71995Sopenharmony_ci DeviceFunctions dev_funcs{env.vulkan_functions, dev}; 8835db71995Sopenharmony_ci 8845db71995Sopenharmony_ci VkSurfaceKHR surface{}; 8855db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, create_surface(inst, surface)); 8865db71995Sopenharmony_ci 8875db71995Sopenharmony_ci VkSwapchainCreateInfoKHR info{}; 8885db71995Sopenharmony_ci info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; 8895db71995Sopenharmony_ci info.surface = surface; 8905db71995Sopenharmony_ci 8915db71995Sopenharmony_ci VkSwapchainKHR swapchain{}; 8925db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, dev_funcs.vkCreateSwapchainKHR(dev.dev, &info, nullptr, &swapchain)); 8935db71995Sopenharmony_ci 8945db71995Sopenharmony_ci auto load_function = [&inst, &dev, use_GIPA](const char* func_name) { 8955db71995Sopenharmony_ci return use_GIPA ? inst.load(func_name) : dev.load(func_name); 8965db71995Sopenharmony_ci }; 8975db71995Sopenharmony_ci 8985db71995Sopenharmony_ci // Debug marker 8995db71995Sopenharmony_ci PFN_vkDebugMarkerSetObjectTagEXT DebugMarkerSetObjectTagEXT = load_function("vkDebugMarkerSetObjectTagEXT"); 9005db71995Sopenharmony_ci PFN_vkDebugMarkerSetObjectNameEXT DebugMarkerSetObjectNameEXT = load_function("vkDebugMarkerSetObjectNameEXT"); 9015db71995Sopenharmony_ci PFN_vkCmdDebugMarkerBeginEXT CmdDebugMarkerBeginEXT = load_function("vkCmdDebugMarkerBeginEXT"); 9025db71995Sopenharmony_ci PFN_vkCmdDebugMarkerEndEXT CmdDebugMarkerEndEXT = load_function("vkCmdDebugMarkerEndEXT"); 9035db71995Sopenharmony_ci PFN_vkCmdDebugMarkerInsertEXT CmdDebugMarkerInsertEXT = load_function("vkCmdDebugMarkerInsertEXT"); 9045db71995Sopenharmony_ci // Debug utils 9055db71995Sopenharmony_ci PFN_vkSetDebugUtilsObjectNameEXT SetDebugUtilsObjectNameEXT = load_function("vkSetDebugUtilsObjectNameEXT"); 9065db71995Sopenharmony_ci PFN_vkSetDebugUtilsObjectTagEXT SetDebugUtilsObjectTagEXT = load_function("vkSetDebugUtilsObjectTagEXT"); 9075db71995Sopenharmony_ci PFN_vkQueueBeginDebugUtilsLabelEXT QueueBeginDebugUtilsLabelEXT = load_function("vkQueueBeginDebugUtilsLabelEXT"); 9085db71995Sopenharmony_ci PFN_vkQueueEndDebugUtilsLabelEXT QueueEndDebugUtilsLabelEXT = load_function("vkQueueEndDebugUtilsLabelEXT"); 9095db71995Sopenharmony_ci PFN_vkQueueInsertDebugUtilsLabelEXT QueueInsertDebugUtilsLabelEXT = load_function("vkQueueInsertDebugUtilsLabelEXT"); 9105db71995Sopenharmony_ci PFN_vkCmdBeginDebugUtilsLabelEXT CmdBeginDebugUtilsLabelEXT = load_function("vkCmdBeginDebugUtilsLabelEXT"); 9115db71995Sopenharmony_ci PFN_vkCmdEndDebugUtilsLabelEXT CmdEndDebugUtilsLabelEXT = load_function("vkCmdEndDebugUtilsLabelEXT"); 9125db71995Sopenharmony_ci PFN_vkCmdInsertDebugUtilsLabelEXT CmdInsertDebugUtilsLabelEXT = load_function("vkCmdInsertDebugUtilsLabelEXT"); 9135db71995Sopenharmony_ci 9145db71995Sopenharmony_ci // Debug marker functions - should always be found when using GIPA but when using GDPA found only when the extension is enabled 9155db71995Sopenharmony_ci if (use_GIPA) { 9165db71995Sopenharmony_ci ASSERT_TRUE(nullptr != DebugMarkerSetObjectTagEXT); 9175db71995Sopenharmony_ci ASSERT_TRUE(nullptr != DebugMarkerSetObjectNameEXT); 9185db71995Sopenharmony_ci ASSERT_TRUE(nullptr != CmdDebugMarkerBeginEXT); 9195db71995Sopenharmony_ci ASSERT_TRUE(nullptr != CmdDebugMarkerEndEXT); 9205db71995Sopenharmony_ci ASSERT_TRUE(nullptr != CmdDebugMarkerInsertEXT); 9215db71995Sopenharmony_ci } else { 9225db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != DebugMarkerSetObjectTagEXT); 9235db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != DebugMarkerSetObjectNameEXT); 9245db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdDebugMarkerBeginEXT); 9255db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdDebugMarkerEndEXT); 9265db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdDebugMarkerInsertEXT); 9275db71995Sopenharmony_ci } 9285db71995Sopenharmony_ci 9295db71995Sopenharmony_ci // Debug utils functions - should only be found if the extension was enabled (because its instance level) 9305db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != SetDebugUtilsObjectNameEXT); 9315db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != SetDebugUtilsObjectTagEXT); 9325db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != QueueBeginDebugUtilsLabelEXT); 9335db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != QueueEndDebugUtilsLabelEXT); 9345db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != QueueInsertDebugUtilsLabelEXT); 9355db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdBeginDebugUtilsLabelEXT); 9365db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdEndDebugUtilsLabelEXT); 9375db71995Sopenharmony_ci ASSERT_EQ(enable_debug_extensions, nullptr != CmdInsertDebugUtilsLabelEXT); 9385db71995Sopenharmony_ci 9395db71995Sopenharmony_ci if (SetDebugUtilsObjectNameEXT) { 9405db71995Sopenharmony_ci VkDebugUtilsObjectNameInfoEXT obj_name_info{}; 9415db71995Sopenharmony_ci obj_name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; 9425db71995Sopenharmony_ci obj_name_info.objectHandle = (uint64_t)swapchain; 9435db71995Sopenharmony_ci obj_name_info.objectType = VK_OBJECT_TYPE_SWAPCHAIN_KHR; 9445db71995Sopenharmony_ci obj_name_info.pObjectName = " Your mom!"; 9455db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(dev.dev, &obj_name_info)); 9465db71995Sopenharmony_ci 9475db71995Sopenharmony_ci obj_name_info.objectHandle = (uint64_t)(uintptr_t)surface; 9485db71995Sopenharmony_ci obj_name_info.objectType = VK_OBJECT_TYPE_SURFACE_KHR; 9495db71995Sopenharmony_ci obj_name_info.pObjectName = " Your moms surface!"; 9505db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(dev.dev, &obj_name_info)); 9515db71995Sopenharmony_ci 9525db71995Sopenharmony_ci obj_name_info.objectHandle = (uint64_t)(uintptr_t)phys_dev; 9535db71995Sopenharmony_ci obj_name_info.objectType = VK_OBJECT_TYPE_PHYSICAL_DEVICE; 9545db71995Sopenharmony_ci obj_name_info.pObjectName = "Physical Device AAAAAAAAA"; 9555db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(dev.dev, &obj_name_info)); 9565db71995Sopenharmony_ci 9575db71995Sopenharmony_ci obj_name_info.objectHandle = (uint64_t)(uintptr_t)inst.inst; 9585db71995Sopenharmony_ci obj_name_info.objectType = VK_OBJECT_TYPE_INSTANCE; 9595db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(dev.dev, &obj_name_info)); 9605db71995Sopenharmony_ci } 9615db71995Sopenharmony_ci if (SetDebugUtilsObjectTagEXT) { 9625db71995Sopenharmony_ci VkDebugUtilsObjectTagInfoEXT utils_object_tag{}; 9635db71995Sopenharmony_ci utils_object_tag.objectHandle = (uint64_t)(uintptr_t)inst.inst; 9645db71995Sopenharmony_ci utils_object_tag.objectType = VK_OBJECT_TYPE_INSTANCE; 9655db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(dev.dev, &utils_object_tag)); 9665db71995Sopenharmony_ci 9675db71995Sopenharmony_ci utils_object_tag.objectHandle = (uint64_t)(uintptr_t)phys_dev; 9685db71995Sopenharmony_ci utils_object_tag.objectType = VK_OBJECT_TYPE_PHYSICAL_DEVICE; 9695db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(dev.dev, &utils_object_tag)); 9705db71995Sopenharmony_ci 9715db71995Sopenharmony_ci utils_object_tag.objectHandle = (uint64_t)surface; 9725db71995Sopenharmony_ci utils_object_tag.objectType = VK_OBJECT_TYPE_SURFACE_KHR; 9735db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(dev.dev, &utils_object_tag)); 9745db71995Sopenharmony_ci } 9755db71995Sopenharmony_ci VkDebugMarkerObjectTagInfoEXT marker_object_tag{}; 9765db71995Sopenharmony_ci VkDebugMarkerObjectNameInfoEXT marker_object_name{}; 9775db71995Sopenharmony_ci if (use_GIPA && !enable_debug_extensions) { 9785db71995Sopenharmony_ci // These functions crash when the extension isn't enabled and the function was acquired with GIPA. 9795db71995Sopenharmony_ci ASSERT_DEATH(DebugMarkerSetObjectTagEXT(dev.dev, &marker_object_tag), ""); 9805db71995Sopenharmony_ci ASSERT_DEATH(DebugMarkerSetObjectNameEXT(dev.dev, &marker_object_name), ""); 9815db71995Sopenharmony_ci } else { 9825db71995Sopenharmony_ci if (DebugMarkerSetObjectTagEXT) { 9835db71995Sopenharmony_ci marker_object_tag.object = (uint64_t)(uintptr_t)swapchain; 9845db71995Sopenharmony_ci marker_object_tag.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT; 9855db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(dev.dev, &marker_object_tag)); 9865db71995Sopenharmony_ci 9875db71995Sopenharmony_ci marker_object_tag.object = (uint64_t)(uintptr_t)phys_dev; 9885db71995Sopenharmony_ci marker_object_tag.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT; 9895db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(dev.dev, &marker_object_tag)); 9905db71995Sopenharmony_ci 9915db71995Sopenharmony_ci marker_object_tag.object = (uint64_t)surface; 9925db71995Sopenharmony_ci marker_object_tag.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT; 9935db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(dev.dev, &marker_object_tag)); 9945db71995Sopenharmony_ci 9955db71995Sopenharmony_ci marker_object_tag.object = (uint64_t)(uintptr_t)inst.inst; 9965db71995Sopenharmony_ci marker_object_tag.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 9975db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(dev.dev, &marker_object_tag)); 9985db71995Sopenharmony_ci } 9995db71995Sopenharmony_ci if (DebugMarkerSetObjectNameEXT) { 10005db71995Sopenharmony_ci marker_object_name.object = (uint64_t)(uintptr_t)swapchain; 10015db71995Sopenharmony_ci marker_object_name.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT; 10025db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(dev.dev, &marker_object_name)); 10035db71995Sopenharmony_ci 10045db71995Sopenharmony_ci marker_object_name.object = (uint64_t)(uintptr_t)phys_dev; 10055db71995Sopenharmony_ci marker_object_name.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT; 10065db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(dev.dev, &marker_object_name)); 10075db71995Sopenharmony_ci 10085db71995Sopenharmony_ci marker_object_name.object = (uint64_t)surface; 10095db71995Sopenharmony_ci marker_object_name.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT; 10105db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(dev.dev, &marker_object_name)); 10115db71995Sopenharmony_ci 10125db71995Sopenharmony_ci marker_object_name.object = (uint64_t)(uintptr_t)inst.inst; 10135db71995Sopenharmony_ci marker_object_name.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 10145db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(dev.dev, &marker_object_name)); 10155db71995Sopenharmony_ci } 10165db71995Sopenharmony_ci } 10175db71995Sopenharmony_ci VkQueue queue{}; 10185db71995Sopenharmony_ci dev.functions->vkGetDeviceQueue(dev.dev, 0, 0, &queue); 10195db71995Sopenharmony_ci VkDebugUtilsLabelEXT utils_label{}; 10205db71995Sopenharmony_ci utils_label.pLabelName = "Testing testing 123"; 10215db71995Sopenharmony_ci if (QueueBeginDebugUtilsLabelEXT) QueueBeginDebugUtilsLabelEXT(queue, &utils_label); 10225db71995Sopenharmony_ci if (QueueEndDebugUtilsLabelEXT) QueueEndDebugUtilsLabelEXT(queue); 10235db71995Sopenharmony_ci if (QueueInsertDebugUtilsLabelEXT) QueueInsertDebugUtilsLabelEXT(queue, &utils_label); 10245db71995Sopenharmony_ci VkCommandBuffer cmd_buf{}; 10255db71995Sopenharmony_ci VkCommandPool cmd_pool; 10265db71995Sopenharmony_ci VkCommandPoolCreateInfo cmd_pool_info{}; 10275db71995Sopenharmony_ci cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; 10285db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, dev_funcs.vkCreateCommandPool(dev.dev, &cmd_pool_info, nullptr, &cmd_pool)); 10295db71995Sopenharmony_ci VkCommandBufferAllocateInfo cmd_buf_alloc_info{}; 10305db71995Sopenharmony_ci cmd_buf_alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; 10315db71995Sopenharmony_ci cmd_buf_alloc_info.commandBufferCount = 1; 10325db71995Sopenharmony_ci cmd_buf_alloc_info.commandPool = cmd_pool; 10335db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, dev_funcs.vkAllocateCommandBuffers(dev.dev, &cmd_buf_alloc_info, &cmd_buf)); 10345db71995Sopenharmony_ci if (CmdBeginDebugUtilsLabelEXT) CmdBeginDebugUtilsLabelEXT(cmd_buf, &utils_label); 10355db71995Sopenharmony_ci if (CmdEndDebugUtilsLabelEXT) CmdEndDebugUtilsLabelEXT(cmd_buf); 10365db71995Sopenharmony_ci if (CmdInsertDebugUtilsLabelEXT) CmdInsertDebugUtilsLabelEXT(cmd_buf, &utils_label); 10375db71995Sopenharmony_ci 10385db71995Sopenharmony_ci dev_funcs.vkDestroySwapchainKHR(dev.dev, swapchain, nullptr); 10395db71995Sopenharmony_ci env.vulkan_functions.vkDestroySurfaceKHR(inst.inst, surface, nullptr); 10405db71995Sopenharmony_ci} 10415db71995Sopenharmony_ci 10425db71995Sopenharmony_ciTEST(GetProcAddr, DebugFuncsWithTerminator) { 10435db71995Sopenharmony_ci FrameworkEnvironment env{}; 10445db71995Sopenharmony_ci auto& driver = 10455db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).setup_WSI().add_physical_device("physical_device_0"); 10465db71995Sopenharmony_ci driver.physical_devices.at(0).add_extensions({"VK_KHR_swapchain"}); 10475db71995Sopenharmony_ci // Hardware doesn't support the debug extensions 10485db71995Sopenharmony_ci 10495db71995Sopenharmony_ci // Use getDeviceProcAddr & vary enabling the debug extensions 10505db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, false)); 10515db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, false)); 10525db71995Sopenharmony_ci 10535db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 10545db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, false)); 10555db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, false)); 10565db71995Sopenharmony_ci 10575db71995Sopenharmony_ci // Now set the hardware to support the extensions and run the situations again 10585db71995Sopenharmony_ci driver.add_instance_extensions({"VK_EXT_debug_utils", "VK_EXT_debug_report"}); 10595db71995Sopenharmony_ci driver.physical_devices.at(0).add_extensions({"VK_EXT_debug_marker"}); 10605db71995Sopenharmony_ci 10615db71995Sopenharmony_ci // Use getDeviceProcAddr & vary enabling the debug extensions 10625db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, true)); 10635db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, true)); 10645db71995Sopenharmony_ci 10655db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 10665db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, true)); 10675db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, true)); 10685db71995Sopenharmony_ci} 10695db71995Sopenharmony_ci 10705db71995Sopenharmony_ciTEST(GetProcAddr, DebugFuncsWithTrampoline) { 10715db71995Sopenharmony_ci FrameworkEnvironment env{}; 10725db71995Sopenharmony_ci auto& driver = 10735db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).setup_WSI().add_physical_device("physical_device_0"); 10745db71995Sopenharmony_ci driver.physical_devices.at(0).add_extensions({"VK_KHR_swapchain"}); 10755db71995Sopenharmony_ci // Hardware doesn't support the debug extensions 10765db71995Sopenharmony_ci 10775db71995Sopenharmony_ci // Use getDeviceProcAddr & vary enabling the debug extensions 10785db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, false)); 10795db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, false)); 10805db71995Sopenharmony_ci 10815db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 10825db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, false)); 10835db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, false)); 10845db71995Sopenharmony_ci 10855db71995Sopenharmony_ci // Now add a layer that supports the extensions and run the situations again 10865db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 10875db71995Sopenharmony_ci .set_name("VK_LAYER_test_layer") 10885db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 10895db71995Sopenharmony_ci .set_disable_environment("DISABLE_ME") 10905db71995Sopenharmony_ci .add_instance_extensions({{VK_EXT_DEBUG_REPORT_EXTENSION_NAME}, 10915db71995Sopenharmony_ci {VK_EXT_DEBUG_UTILS_EXTENSION_NAME}}) 10925db71995Sopenharmony_ci .add_device_extension({VK_EXT_DEBUG_MARKER_EXTENSION_NAME})), 10935db71995Sopenharmony_ci "test_layer.json"); 10945db71995Sopenharmony_ci 10955db71995Sopenharmony_ci // // Use getDeviceProcAddr & vary enabling the debug extensions 10965db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, true)); 10975db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, true)); 10985db71995Sopenharmony_ci 10995db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 11005db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, true)); 11015db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, true)); 11025db71995Sopenharmony_ci} 11035db71995Sopenharmony_ci 11045db71995Sopenharmony_ciTEST(GetProcAddr, DebugFuncsWithDebugExtsForceAdded) { 11055db71995Sopenharmony_ci FrameworkEnvironment env{}; 11065db71995Sopenharmony_ci auto& driver = 11075db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).setup_WSI().add_physical_device("physical_device_0"); 11085db71995Sopenharmony_ci driver.physical_devices.at(0).add_extensions({"VK_KHR_swapchain"}); 11095db71995Sopenharmony_ci // Hardware doesn't support the debug extensions 11105db71995Sopenharmony_ci 11115db71995Sopenharmony_ci // Use getDeviceProcAddr & vary enabling the debug extensions 11125db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, false)); 11135db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, false)); 11145db71995Sopenharmony_ci 11155db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 11165db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, false)); 11175db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, false)); 11185db71995Sopenharmony_ci 11195db71995Sopenharmony_ci // Now add a layer that supports the extensions and run the situations again 11205db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 11215db71995Sopenharmony_ci .set_name("VK_LAYER_test_layer") 11225db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 11235db71995Sopenharmony_ci .set_disable_environment("DISABLE_ME")), 11245db71995Sopenharmony_ci "test_layer.json"); 11255db71995Sopenharmony_ci env.get_test_layer() 11265db71995Sopenharmony_ci .add_injected_instance_extensions({{VK_EXT_DEBUG_REPORT_EXTENSION_NAME}, {VK_EXT_DEBUG_UTILS_EXTENSION_NAME}}) 11275db71995Sopenharmony_ci .add_injected_device_extension({VK_EXT_DEBUG_MARKER_EXTENSION_NAME}); 11285db71995Sopenharmony_ci 11295db71995Sopenharmony_ci // Use getDeviceProcAddr & vary enabling the debug extensions 11305db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, false, true)); 11315db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, false, true, true)); 11325db71995Sopenharmony_ci 11335db71995Sopenharmony_ci // Use getInstanceProcAddr & vary enabling the debug extensions 11345db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, false, true)); 11355db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(CheckDeviceFunctions(env, true, true, true)); 11365db71995Sopenharmony_ci} 11375db71995Sopenharmony_ci 11385db71995Sopenharmony_ciTEST(DebugUtils, WrappingLayer) { 11395db71995Sopenharmony_ci FrameworkEnvironment env{}; 11405db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)) 11415db71995Sopenharmony_ci .set_min_icd_interface_version(5) 11425db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.add_extension(VK_EXT_DEBUG_MARKER_EXTENSION_NAME).finish()) 11435db71995Sopenharmony_ci .add_instance_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); 11445db71995Sopenharmony_ci 11455db71995Sopenharmony_ci const char* wrap_objects_name = "VK_LAYER_LUNARG_wrap_objects"; 11465db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 11475db71995Sopenharmony_ci .set_name(wrap_objects_name) 11485db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS) 11495db71995Sopenharmony_ci .set_disable_environment("DISABLE_ME") 11505db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DEBUG_UTILS_EXTENSION_NAME})), 11515db71995Sopenharmony_ci "wrap_objects_layer.json"); 11525db71995Sopenharmony_ci 11535db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 11545db71995Sopenharmony_ci inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); 11555db71995Sopenharmony_ci inst.create_info.add_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); 11565db71995Sopenharmony_ci inst.create_info.add_layer(wrap_objects_name); 11575db71995Sopenharmony_ci inst.CheckCreate(); 11585db71995Sopenharmony_ci DebugUtilsWrapper log{inst}; 11595db71995Sopenharmony_ci CreateDebugUtilsMessenger(log); 11605db71995Sopenharmony_ci 11615db71995Sopenharmony_ci auto phys_dev = inst.GetPhysDev(); 11625db71995Sopenharmony_ci DeviceWrapper device{inst}; 11635db71995Sopenharmony_ci device.create_info.add_extension(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); 11645db71995Sopenharmony_ci device.CheckCreate(phys_dev); 11655db71995Sopenharmony_ci { 11665db71995Sopenharmony_ci PFN_vkSetDebugUtilsObjectNameEXT SetDebugUtilsObjectNameEXT = inst.load("vkSetDebugUtilsObjectNameEXT"); 11675db71995Sopenharmony_ci 11685db71995Sopenharmony_ci VkDebugUtilsObjectNameInfoEXT info = {}; 11695db71995Sopenharmony_ci info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; 11705db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_DEVICE; 11715db71995Sopenharmony_ci info.objectHandle = (uint64_t)device.dev; 11725db71995Sopenharmony_ci info.pObjectName = "Test Name"; 11735db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(device, &info)); 11745db71995Sopenharmony_ci 11755db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_PHYSICAL_DEVICE; 11765db71995Sopenharmony_ci info.objectHandle = (uint64_t)phys_dev; 11775db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(device, &info)); 11785db71995Sopenharmony_ci 11795db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_INSTANCE; 11805db71995Sopenharmony_ci info.objectHandle = (uint64_t)inst.inst; 11815db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectNameEXT(device, &info)); 11825db71995Sopenharmony_ci } 11835db71995Sopenharmony_ci { 11845db71995Sopenharmony_ci PFN_vkSetDebugUtilsObjectTagEXT SetDebugUtilsObjectTagEXT = inst.load("vkSetDebugUtilsObjectTagEXT"); 11855db71995Sopenharmony_ci 11865db71995Sopenharmony_ci VkDebugUtilsObjectTagInfoEXT info = {}; 11875db71995Sopenharmony_ci info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT; 11885db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_DEVICE; 11895db71995Sopenharmony_ci info.objectHandle = (uint64_t)device.dev; 11905db71995Sopenharmony_ci info.pTag = "Test Name"; 11915db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(device, &info)); 11925db71995Sopenharmony_ci 11935db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_PHYSICAL_DEVICE; 11945db71995Sopenharmony_ci info.objectHandle = (uint64_t)phys_dev; 11955db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(device, &info)); 11965db71995Sopenharmony_ci 11975db71995Sopenharmony_ci info.objectType = VK_OBJECT_TYPE_INSTANCE; 11985db71995Sopenharmony_ci info.objectHandle = (uint64_t)inst.inst; 11995db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, SetDebugUtilsObjectTagEXT(device, &info)); 12005db71995Sopenharmony_ci } 12015db71995Sopenharmony_ci // Debug marker 12025db71995Sopenharmony_ci { 12035db71995Sopenharmony_ci PFN_vkDebugMarkerSetObjectNameEXT DebugMarkerSetObjectNameEXT = inst.load("vkDebugMarkerSetObjectNameEXT"); 12045db71995Sopenharmony_ci 12055db71995Sopenharmony_ci VkDebugMarkerObjectNameInfoEXT info = {}; 12065db71995Sopenharmony_ci info.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; 12075db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT; 12085db71995Sopenharmony_ci info.object = (uint64_t)device.dev; 12095db71995Sopenharmony_ci info.pObjectName = "Test Name"; 12105db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(device, &info)); 12115db71995Sopenharmony_ci 12125db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT; 12135db71995Sopenharmony_ci info.object = (uint64_t)phys_dev; 12145db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(device, &info)); 12155db71995Sopenharmony_ci 12165db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 12175db71995Sopenharmony_ci info.object = (uint64_t)inst.inst; 12185db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectNameEXT(device, &info)); 12195db71995Sopenharmony_ci } 12205db71995Sopenharmony_ci { 12215db71995Sopenharmony_ci PFN_vkDebugMarkerSetObjectTagEXT DebugMarkerSetObjectTagEXT = inst.load("vkDebugMarkerSetObjectTagEXT"); 12225db71995Sopenharmony_ci 12235db71995Sopenharmony_ci VkDebugMarkerObjectTagInfoEXT info = {}; 12245db71995Sopenharmony_ci info.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT; 12255db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT; 12265db71995Sopenharmony_ci info.object = (uint64_t)device.dev; 12275db71995Sopenharmony_ci info.pTag = "Test Name"; 12285db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(device, &info)); 12295db71995Sopenharmony_ci 12305db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT; 12315db71995Sopenharmony_ci info.object = (uint64_t)phys_dev; 12325db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(device, &info)); 12335db71995Sopenharmony_ci 12345db71995Sopenharmony_ci info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; 12355db71995Sopenharmony_ci info.object = (uint64_t)inst.inst; 12365db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, DebugMarkerSetObjectTagEXT(device, &info)); 12375db71995Sopenharmony_ci } 12385db71995Sopenharmony_ci} 1239