blob: 6c2834a556f6316b8a28fa68f49ae4d17bb63a04 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "testBase.h"
#include <unistd.h>
#include <limits>
#include <vulkan/vulkan.hpp>
#include "utils.h"
#include "testUtil.h"
extern int g_vlayer;
namespace vkbench {
void testBase::VkInitialization() {
CreateInstance();
ChoosePhysical_device_();
CreateLogicalDevice();
CreateCommandPool();
}
VKAPI_ATTR VkBool32 VKAPI_CALL
ValidationCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT* kPcallbackData,
void* pUserData) {
UNUSED(messageType);
UNUSED(pUserData);
if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) {
DEBUG("%s", kPcallbackData->pMessage)
} else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT ||
messageSeverity ==
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
LOG("%s", kPcallbackData->pMessage)
} else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
ERROR("%s", kPcallbackData->pMessage)
} else {
ABORT(1, "%s", kPcallbackData->pMessage)
}
return VK_FALSE;
}
bool testBase::CreateInstance() {
const std::vector<const char*> kDebugExtension = {"VK_EXT_debug_utils"};
vk::ApplicationInfo
appInfo("vkbench", 1, "Vulkan.hpp", 1, VK_API_VERSION_1_1);
vk::InstanceCreateInfo createInfo({}, &appInfo);
if (g_vlayer) {
if (!IsLayersSupported(kValidation_layers_) ||
!IsExtensionSupported(kDebugExtension)) {
DEBUG("Validation layer is not supported. Less log will be printed.")
enable_validation_layer_ = false;
} else {
createInfo.setEnabledExtensionCount(kDebugExtension.size())
.setPpEnabledExtensionNames(kDebugExtension.data())
.setEnabledLayerCount(kValidation_layers_.size())
.setPpEnabledLayerNames(kValidation_layers_.data());
enable_validation_layer_ = true;
}
}
instance_ = vk::createInstance(createInfo);
if (enable_validation_layer_) {
vk::DebugUtilsMessengerCreateInfoEXT debugCreateInfo;
debugCreateInfo
.setMessageSeverity(
vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning
| vk::DebugUtilsMessageSeverityFlagBitsEXT::eError)
.setMessageType(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
| vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation)
.setPfnUserCallback(ValidationCallback);
CreateDebugUtilsMessengerEXT(instance_,
&debugCreateInfo,
nullptr,
&debug_messenger_);
}
return true;
}
bool testBase::ChoosePhysical_device_() {
if (!instance_)
return false;
std::vector<vk::PhysicalDevice>
physical_devices = instance_.enumeratePhysicalDevices();
if (physical_devices.size() == 0) {
ERROR("No available Vk physical_device_.")
return false;
}
// Choose the first device we found.
physical_device_ = physical_devices[0];
gfx_queue_idx_ = ChooseGFXQueueFamilies(physical_device_);
return true;
}
bool testBase::CreateLogicalDevice() {
float tmp = 1.0f;
vk::DeviceQueueCreateInfo queueCreateInfo({}, gfx_queue_idx_, 1, &tmp);
vk::DeviceCreateInfo deviceCreateInfo({}, 1, &queueCreateInfo);
if (enable_validation_layer_) {
deviceCreateInfo.setEnabledLayerCount(kValidation_layers_.size());
deviceCreateInfo.setPpEnabledLayerNames(kValidation_layers_.data());
}
device_ = physical_device_.createDevice(deviceCreateInfo);
gfx_queue_ = device_.getQueue(gfx_queue_idx_, /* Queue Index */ 0);
return true;
}
bool testBase::CreateCommandPool() {
cmd_pool_ =
device_.createCommandPool({vk::CommandPoolCreateFlags(), gfx_queue_idx_});
return true;
}
void testBase::VkDestroy() {
if (!instance_) {
ERROR("Can't destroy any resource without a valid vulkan instance.")
return;
}
if (device_) {
if (cmd_pool_) {
device_.destroy(cmd_pool_, nullptr);
}
device_.destroy();
}
if (enable_validation_layer_) {
DestroyDebugUtilsMessengerEXT(instance_, debug_messenger_, nullptr);
}
instance_.destroy();
}
} // namespace vkbench