1 /* 2 * Copyright (c) 2015-2016 The Khronos Group Inc. 3 * Copyright (c) 2015-2016 Valve Corporation 4 * Copyright (c) 2015-2016 LunarG, Inc. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * Author: Chia-I Wu <olvaffe (at) gmail.com> 19 * Author: Chris Forbes <chrisf (at) ijw.co.nz> 20 * Author: Courtney Goeltzenleuchter <courtney (at) LunarG.com> 21 * Author: Mark Lobodzinski <mark (at) lunarg.com> 22 * Author: Mike Stroyan <mike (at) LunarG.com> 23 * Author: Tobin Ehlis <tobine (at) google.com> 24 * Author: Tony Barbour <tony (at) LunarG.com> 25 */ 26 27 #include "test_common.h" 28 #include "vktestbinding.h" 29 #include "test_environment.h" 30 31 #if defined(NDEBUG) && defined(__GNUC__) 32 #define U_ASSERT_ONLY __attribute__((unused)) 33 #else 34 #define U_ASSERT_ONLY 35 #endif 36 37 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 38 39 namespace vk_testing { 40 41 Environment::Environment() : default_dev_(0) { 42 app_.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; 43 app_.pApplicationName = "vk_testing"; 44 app_.applicationVersion = 1; 45 app_.pEngineName = "vk_testing"; 46 app_.engineVersion = 1; 47 app_.apiVersion = VK_API_VERSION_1_0; 48 app_.pNext = NULL; 49 } 50 51 bool Environment::parse_args(int argc, char **argv) { 52 int i; 53 54 for (i = 1; i < argc; i++) { 55 #define ARG(name) (strcmp(argv[i], name) == 0) 56 #define ARG_P(name) (i < argc - 1 && ARG(name)) 57 if (ARG_P("--gpu")) { 58 default_dev_ = atoi(argv[++i]); 59 } else { 60 break; 61 } 62 #undef ARG 63 #undef ARG_P 64 } 65 66 if (i < argc) { 67 std::cout << "invalid argument: " << argv[i] << "\n\n" 68 << "Usage: " << argv[0] << " <options>\n\n" 69 << "Options:\n" 70 " --gpu <n> Use GPU<n> as the default GPU\n"; 71 72 return false; 73 } 74 75 return true; 76 } 77 78 void Environment::SetUp() { 79 80 uint32_t count; 81 VkResult U_ASSERT_ONLY err; 82 VkInstanceCreateInfo inst_info = {}; 83 std::vector<VkExtensionProperties> instance_extensions; 84 std::vector<VkExtensionProperties> device_extensions; 85 86 std::vector<const char *> instance_extension_names; 87 std::vector<const char *> device_extension_names; 88 89 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME); 90 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); 91 #ifdef _WIN32 92 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 93 #endif 94 #ifdef VK_USE_PLATFORM_XCB_KHR 95 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); 96 #endif 97 98 VkBool32 extFound; 99 100 instance_extensions = vk_testing::GetGlobalExtensions(); 101 102 for (uint32_t i = 0; i < instance_extension_names.size(); i++) { 103 extFound = 0; 104 for (uint32_t j = 0; j < instance_extensions.size(); j++) { 105 if (!strcmp(instance_extension_names[i], instance_extensions[j].extensionName)) { 106 extFound = 1; 107 } 108 } 109 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << instance_extension_names[i] 110 << " which is necessary to pass this test"; 111 } 112 inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 113 inst_info.pNext = NULL; 114 inst_info.pApplicationInfo = &app_; 115 inst_info.enabledExtensionCount = instance_extension_names.size(); 116 inst_info.ppEnabledExtensionNames = (instance_extension_names.size()) ? &instance_extension_names[0] : NULL; 117 inst_info.enabledLayerCount = 0; 118 inst_info.ppEnabledLayerNames = NULL; 119 err = vkCreateInstance(&inst_info, NULL, &inst); 120 ASSERT_EQ(VK_SUCCESS, err); 121 err = vkEnumeratePhysicalDevices(inst, &count, NULL); 122 ASSERT_EQ(VK_SUCCESS, err); 123 ASSERT_LE(count, ARRAY_SIZE(gpus)); 124 err = vkEnumeratePhysicalDevices(inst, &count, gpus); 125 ASSERT_EQ(VK_SUCCESS, err); 126 ASSERT_GT(count, default_dev_); 127 128 vk_testing::PhysicalDevice phys_dev(gpus[0]); 129 device_extensions = phys_dev.extensions(); 130 131 for (uint32_t i = 0; i < device_extension_names.size(); i++) { 132 extFound = 0; 133 for (uint32_t j = 0; j < device_extensions.size(); j++) { 134 if (!strcmp(device_extension_names[i], device_extensions[j].extensionName)) { 135 extFound = 1; 136 } 137 } 138 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << device_extension_names[i] 139 << " which is necessary to pass this test"; 140 } 141 142 devs_.reserve(count); 143 for (uint32_t i = 0; i < count; i++) { 144 devs_.push_back(new Device(gpus[i])); 145 if (i == default_dev_) { 146 devs_[i]->init(device_extension_names); 147 ASSERT_NE(true, devs_[i]->graphics_queues().empty()); 148 } 149 } 150 } 151 152 void Environment::TearDown() { 153 // destroy devices first 154 for (std::vector<Device *>::iterator it = devs_.begin(); it != devs_.end(); it++) 155 delete *it; 156 devs_.clear(); 157 158 if (inst) 159 vkDestroyInstance(inst, NULL); 160 } 161 } // vk_testing namespace 162