blob: c973f55ff260975c5a59b488caf6ae7b7daf3880 [file] [log] [blame]
#include "test_common.h"
#include "vktestbinding.h"
#include "test_environment.h"
#include "vk_wsi_lunarg.h"
#if defined(NDEBUG) && defined(__GNUC__)
#define U_ASSERT_ONLY __attribute__((unused))
#else
#define U_ASSERT_ONLY
#endif
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
namespace vk_testing {
Environment::Environment() :
default_dev_(0)
{
app_.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_.pAppName = "vk_testing";
app_.appVersion = 1;
app_.pEngineName = "vk_testing";
app_.engineVersion = 1;
app_.apiVersion = VK_API_VERSION;
app_.pNext = NULL;
}
bool Environment::parse_args(int argc, char **argv)
{
int i;
for (i = 1; i < argc; i++) {
#define ARG(name) (strcmp(argv[i], name) == 0)
#define ARG_P(name) (i < argc - 1 && ARG(name))
if (ARG_P("--gpu")) {
default_dev_ = atoi(argv[++i]);
} else {
break;
}
#undef ARG
#undef ARG_P
}
if (i < argc) {
std::cout <<
"invalid argument: " << argv[i] << "\n\n" <<
"Usage: " << argv[0] << " <options>\n\n" <<
"Options:\n"
" --gpu <n> Use GPU<n> as the default GPU\n";
return false;
}
return true;
}
void Environment::SetUp()
{
uint32_t count;
VkResult U_ASSERT_ONLY err;
VkInstanceCreateInfo inst_info = {};
std::vector<VkExtensionProperties> instance_extensions;
std::vector<VkExtensionProperties> device_extensions;
std::vector<const char*> instance_extension_names;
std::vector<const char *> device_extension_names;
instance_extension_names.push_back(VK_WSI_LUNARG_EXTENSION_NAME);
device_extension_names.push_back(VK_WSI_LUNARG_EXTENSION_NAME);
uint32_t extCount = 0;
err = vkGetGlobalExtensionCount(&extCount);
assert(!err);
VkExtensionProperties extProp;
bool32_t extFound;
for (uint32_t i = 0; i < instance_extension_names.size(); i++) {
extFound = 0;
for (uint32_t j = 0; j < extCount; j++) {
err = vkGetGlobalExtensionProperties(j, &extProp);
assert(!err);
if (!strcmp(instance_extension_names[i], extProp.name)) {
instance_extensions.push_back(extProp);
extFound = 1;
}
}
ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << instance_extension_names[i] << " which is necessary to pass this test";
}
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pNext = NULL;
inst_info.pAppInfo = &app_;
inst_info.pAllocCb = NULL;
inst_info.extensionCount = instance_extensions.size();
inst_info.pEnabledExtensions = (instance_extensions.size()) ? &instance_extensions[0] : NULL;
err = vkCreateInstance(&inst_info, &inst);
ASSERT_EQ(VK_SUCCESS, err);
err = vkEnumeratePhysicalDevices(inst, &count, NULL);
ASSERT_EQ(VK_SUCCESS, err);
ASSERT_LE(count, ARRAY_SIZE(gpus));
err = vkEnumeratePhysicalDevices(inst, &count, gpus);
ASSERT_EQ(VK_SUCCESS, err);
ASSERT_GT(count, default_dev_);
err = vkGetPhysicalDeviceExtensionCount(gpus[0], &extCount);
assert(!err);
for (uint32_t i = 0; i < device_extension_names.size(); i++) {
extFound = 0;
for (uint32_t j = 0; j < extCount; j++) {
err = vkGetPhysicalDeviceExtensionProperties(gpus[0], j, &extProp);
assert(!err);
if (!strcmp(device_extension_names[i], extProp.name)) {
device_extensions.push_back(extProp);
extFound = 1;
}
}
ASSERT_EQ(extFound, 1) << "ERROR: Cannot find extension named " << device_extension_names[i] << " which is necessary to pass this test";
}
devs_.reserve(count);
for (uint32_t i = 0; i < count; i++) {
devs_.push_back(new Device(gpus[i]));
if (i == default_dev_) {
devs_[i]->init(device_extensions);
ASSERT_NE(true, devs_[i]->graphics_queues().empty());
}
}
}
void Environment::TearDown()
{
// destroy devices first
for (std::vector<Device *>::iterator it = devs_.begin(); it != devs_.end(); it++)
delete *it;
devs_.clear();
vkDestroyInstance(inst);
}
} // vk_testing namespace