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