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