blob: 766cd60eb43fd66b5bfed77286743134fdd31259 [file] [log] [blame]
Tony Barbour92400bb2015-03-02 16:38:52 -07001#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002#include "vktestbinding.h"
Tony Barbour92400bb2015-03-02 16:38:52 -07003#include "test_environment.h"
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -06004
5#if defined(NDEBUG) && defined(__GNUC__)
6#define U_ASSERT_ONLY __attribute__((unused))
7#else
8#define U_ASSERT_ONLY
9#endif
Tony Barbour92400bb2015-03-02 16:38:52 -070010
11#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
12
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060013namespace vk_testing {
Tony Barbour92400bb2015-03-02 16:38:52 -070014
15Environment::Environment() :
Chia-I Wuf8693382015-04-16 22:02:10 +080016 default_dev_(0)
Tony Barbour92400bb2015-03-02 16:38:52 -070017{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060018 app_.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080019 app_.pApplicationName = "vk_testing";
20 app_.applicationVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060021 app_.pEngineName = "vk_testing";
Tony Barbour92400bb2015-03-02 16:38:52 -070022 app_.engineVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060023 app_.apiVersion = VK_API_VERSION;
Courtney Goeltzenleuchteraca235e2015-06-23 08:54:19 -060024 app_.pNext = NULL;
Tony Barbour92400bb2015-03-02 16:38:52 -070025}
26
27bool Environment::parse_args(int argc, char **argv)
28{
29 int i;
30
31 for (i = 1; i < argc; i++) {
32#define ARG(name) (strcmp(argv[i], name) == 0)
33#define ARG_P(name) (i < argc - 1 && ARG(name))
34 if (ARG_P("--gpu")) {
35 default_dev_ = atoi(argv[++i]);
36 } else {
37 break;
38 }
39#undef ARG
40#undef ARG_P
41 }
42
43 if (i < argc) {
44 std::cout <<
45 "invalid argument: " << argv[i] << "\n\n" <<
46 "Usage: " << argv[0] << " <options>\n\n" <<
47 "Options:\n"
48 " --gpu <n> Use GPU<n> as the default GPU\n";
49
50 return false;
51 }
52
53 return true;
54}
55
56void Environment::SetUp()
57{
58
59 uint32_t count;
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060060 VkResult U_ASSERT_ONLY err;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -060061 VkInstanceCreateInfo inst_info = {};
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060062 std::vector<VkExtensionProperties> instance_extensions;
63 std::vector<VkExtensionProperties> device_extensions;
64
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -060065 std::vector<const char *> instance_extension_names;
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060066 std::vector<const char *> device_extension_names;
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -060067 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060068
Ian Elliottc11750d2015-10-30 13:24:12 -060069 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
70 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060071
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -060072 VkBool32 extFound;
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060073
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060074 instance_extensions = vk_testing::GetGlobalExtensions();
75
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060076 for (uint32_t i = 0; i < instance_extension_names.size(); i++) {
77 extFound = 0;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060078 for (uint32_t j = 0; j < instance_extensions.size(); j++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080079 if (!strcmp(instance_extension_names[i], instance_extensions[j].extensionName)) {
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -060080 extFound = 1;
81 }
82 }
83 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << instance_extension_names[i] << " which is necessary to pass this test";
84 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060085 inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
Jon Ashburnb317fad2015-04-04 14:52:07 -060086 inst_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080087 inst_info.pApplicationInfo = &app_;
Chia-I Wud50a7d72015-10-26 20:48:51 +080088 inst_info.enabledExtensionNameCount = instance_extension_names.size();
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060089 inst_info.ppEnabledExtensionNames = (instance_extension_names.size()) ? &instance_extension_names[0] : NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080090 inst_info.enabledLayerNameCount = 0;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060091 inst_info.ppEnabledLayerNames = NULL;
Chia-I Wuf7458c52015-10-26 21:10:41 +080092 err = vkCreateInstance(&inst_info, NULL, &inst);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060093 ASSERT_EQ(VK_SUCCESS, err);
Jon Ashburn83a64252015-04-15 11:31:12 -060094 err = vkEnumeratePhysicalDevices(inst, &count, NULL);
95 ASSERT_EQ(VK_SUCCESS, err);
96 ASSERT_LE(count, ARRAY_SIZE(gpus));
97 err = vkEnumeratePhysicalDevices(inst, &count, gpus);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060098 ASSERT_EQ(VK_SUCCESS, err);
Tony Barbour92400bb2015-03-02 16:38:52 -070099 ASSERT_GT(count, default_dev_);
100
Chia-I Wu999f0482015-07-03 10:32:05 +0800101 vk_testing::PhysicalDevice phys_dev(gpus[0]);
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600102 device_extensions = phys_dev.extensions();
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -0600103
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -0600104 for (uint32_t i = 0; i < device_extension_names.size(); i++) {
105 extFound = 0;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600106 for (uint32_t j = 0; j < device_extensions.size(); j++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800107 if (!strcmp(device_extension_names[i], device_extensions[j].extensionName)) {
Courtney Goeltzenleuchter553b9cb2015-06-24 15:03:26 -0600108 extFound = 1;
109 }
110 }
111 ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << device_extension_names[i] << " which is necessary to pass this test";
112 }
113
Tony Barbour92400bb2015-03-02 16:38:52 -0700114 devs_.reserve(count);
115 for (uint32_t i = 0; i < count; i++) {
116 devs_.push_back(new Device(gpus[i]));
117 if (i == default_dev_) {
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -0600118 devs_[i]->init(device_layer_names, device_extension_names);
Tony Barbour92400bb2015-03-02 16:38:52 -0700119 ASSERT_NE(true, devs_[i]->graphics_queues().empty());
120 }
121 }
122}
123
Tony Barbour92400bb2015-03-02 16:38:52 -0700124void Environment::TearDown()
125{
126 // destroy devices first
127 for (std::vector<Device *>::iterator it = devs_.begin(); it != devs_.end(); it++)
128 delete *it;
129 devs_.clear();
130
Courtney Goeltzenleuchter607a0972015-07-06 15:45:16 -0600131 if (inst)
Chia-I Wuf7458c52015-10-26 21:10:41 +0800132 vkDestroyInstance(inst, NULL);
Tony Barbour92400bb2015-03-02 16:38:52 -0700133}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600134} // vk_testing namespace