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