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}