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 */
275db71995Sopenharmony_ci
285db71995Sopenharmony_ci#include <thread>
295db71995Sopenharmony_ci#include <chrono>
305db71995Sopenharmony_ci#include <vector>
315db71995Sopenharmony_ci#include <atomic>
325db71995Sopenharmony_ci
335db71995Sopenharmony_ci#include "vulkan/vulkan.h"
345db71995Sopenharmony_ci
355db71995Sopenharmony_cistatic std::atomic_bool is_running;
365db71995Sopenharmony_ci
375db71995Sopenharmony_civoid run_vk_code(int which_func) {
385db71995Sopenharmony_ci    while (!is_running) {
395db71995Sopenharmony_ci        // busy wait so all threads have a chance to spawn
405db71995Sopenharmony_ci    }
415db71995Sopenharmony_ci    while (is_running) {
425db71995Sopenharmony_ci        switch (which_func) {
435db71995Sopenharmony_ci            default:
445db71995Sopenharmony_ci            case 0: {
455db71995Sopenharmony_ci                VkInstance inst;
465db71995Sopenharmony_ci                VkInstanceCreateInfo info{};
475db71995Sopenharmony_ci                vkCreateInstance(&info, nullptr, &inst);
485db71995Sopenharmony_ci                break;
495db71995Sopenharmony_ci            }
505db71995Sopenharmony_ci            case 1: {
515db71995Sopenharmony_ci                uint32_t count = 0;
525db71995Sopenharmony_ci                vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);
535db71995Sopenharmony_ci                std::vector<VkExtensionProperties> props(count, VkExtensionProperties{});
545db71995Sopenharmony_ci                vkEnumerateInstanceExtensionProperties(nullptr, &count, props.data());
555db71995Sopenharmony_ci                break;
565db71995Sopenharmony_ci            }
575db71995Sopenharmony_ci            case 2: {
585db71995Sopenharmony_ci                uint32_t count = 0;
595db71995Sopenharmony_ci                vkEnumerateInstanceLayerProperties(&count, nullptr);
605db71995Sopenharmony_ci                std::vector<VkLayerProperties> layers(count, VkLayerProperties{});
615db71995Sopenharmony_ci                vkEnumerateInstanceLayerProperties(&count, layers.data());
625db71995Sopenharmony_ci
635db71995Sopenharmony_ci                break;
645db71995Sopenharmony_ci            }
655db71995Sopenharmony_ci            case 3: {
665db71995Sopenharmony_ci                uint32_t version = 0;
675db71995Sopenharmony_ci                vkEnumerateInstanceVersion(&version);
685db71995Sopenharmony_ci                break;
695db71995Sopenharmony_ci            }
705db71995Sopenharmony_ci        }
715db71995Sopenharmony_ci    }
725db71995Sopenharmony_ci}
735db71995Sopenharmony_ci
745db71995Sopenharmony_ciint main() {
755db71995Sopenharmony_ci    uint32_t thread_count = 4;
765db71995Sopenharmony_ci    is_running = false;
775db71995Sopenharmony_ci    std::vector<std::thread> threads;
785db71995Sopenharmony_ci    for (uint32_t i = 0; i < thread_count; i++) {
795db71995Sopenharmony_ci        threads.emplace_back(run_vk_code, i % 4);
805db71995Sopenharmony_ci    }
815db71995Sopenharmony_ci    is_running = true;
825db71995Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(10));
835db71995Sopenharmony_ci    is_running = false;
845db71995Sopenharmony_ci    for (auto& t : threads) {
855db71995Sopenharmony_ci        t.join();
865db71995Sopenharmony_ci    }
875db71995Sopenharmony_ci    return 0;
885db71995Sopenharmony_ci}