Po-Hsien Wang | 00777b2 | 2019-04-24 16:37:09 -0700 | [diff] [blame] | 1 | // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "testBase.h" |
| 6 | #include <unistd.h> |
| 7 | #include <limits> |
| 8 | #include <vulkan/vulkan.hpp> |
| 9 | #include "utils.h" |
| 10 | #include "testUtil.h" |
| 11 | |
| 12 | extern int g_vlayer; |
| 13 | |
| 14 | namespace vkbench { |
| 15 | void testBase::VkInitialization() { |
| 16 | CreateInstance(); |
| 17 | ChoosePhysical_device_(); |
| 18 | CreateLogicalDevice(); |
| 19 | CreateCommandPool(); |
| 20 | } |
| 21 | |
| 22 | VKAPI_ATTR VkBool32 VKAPI_CALL |
| 23 | ValidationCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, |
| 24 | VkDebugUtilsMessageTypeFlagsEXT messageType, |
| 25 | const VkDebugUtilsMessengerCallbackDataEXT* kPcallbackData, |
| 26 | void* pUserData) { |
| 27 | UNUSED(messageType); |
| 28 | UNUSED(pUserData); |
| 29 | if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) { |
| 30 | DEBUG("%s", kPcallbackData->pMessage) |
| 31 | } else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT || |
| 32 | messageSeverity == |
| 33 | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { |
| 34 | LOG("%s", kPcallbackData->pMessage) |
| 35 | } else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { |
| 36 | ERROR("%s", kPcallbackData->pMessage) |
| 37 | } else { |
| 38 | ABORT(1, "%s", kPcallbackData->pMessage) |
| 39 | } |
| 40 | return VK_FALSE; |
| 41 | } |
| 42 | |
| 43 | bool testBase::CreateInstance() { |
| 44 | const std::vector<const char*> kDebugExtension = {"VK_EXT_debug_utils"}; |
| 45 | vk::ApplicationInfo |
| 46 | appInfo("vkbench", 1, "Vulkan.hpp", 1, VK_API_VERSION_1_1); |
| 47 | vk::InstanceCreateInfo createInfo({}, &appInfo); |
| 48 | |
| 49 | if (g_vlayer) { |
| 50 | if (!IsLayersSupported(kValidation_layers_) || |
| 51 | !IsExtensionSupported(kDebugExtension)) { |
| 52 | DEBUG("Validation layer is not supported. Less log will be printed.") |
| 53 | enable_validation_layer_ = false; |
| 54 | } else { |
| 55 | createInfo.setEnabledExtensionCount(kDebugExtension.size()) |
| 56 | .setPpEnabledExtensionNames(kDebugExtension.data()) |
| 57 | .setEnabledLayerCount(kValidation_layers_.size()) |
| 58 | .setPpEnabledLayerNames(kValidation_layers_.data()); |
| 59 | enable_validation_layer_ = true; |
| 60 | } |
| 61 | } |
| 62 | instance_ = vk::createInstance(createInfo); |
| 63 | if (enable_validation_layer_) { |
| 64 | vk::DebugUtilsMessengerCreateInfoEXT debugCreateInfo; |
| 65 | debugCreateInfo |
| 66 | .setMessageSeverity( |
| 67 | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
| 68 | | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) |
| 69 | .setMessageType(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
| 70 | | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation) |
| 71 | .setPfnUserCallback(ValidationCallback); |
| 72 | CreateDebugUtilsMessengerEXT(instance_, |
| 73 | &debugCreateInfo, |
| 74 | nullptr, |
| 75 | &debug_messenger_); |
| 76 | } |
| 77 | return true; |
| 78 | } |
| 79 | |
| 80 | bool testBase::ChoosePhysical_device_() { |
| 81 | if (!instance_) |
| 82 | return false; |
| 83 | std::vector<vk::PhysicalDevice> |
| 84 | physical_devices = instance_.enumeratePhysicalDevices(); |
| 85 | if (physical_devices.size() == 0) { |
| 86 | ERROR("No available Vk physical_device_.") |
| 87 | return false; |
| 88 | } |
| 89 | // Choose the first device we found. |
| 90 | physical_device_ = physical_devices[0]; |
| 91 | gfx_queue_idx_ = ChooseGFXQueueFamilies(physical_device_); |
| 92 | return true; |
| 93 | } |
| 94 | |
| 95 | bool testBase::CreateLogicalDevice() { |
| 96 | float tmp = 1.0f; |
| 97 | vk::DeviceQueueCreateInfo queueCreateInfo({}, gfx_queue_idx_, 1, &tmp); |
| 98 | vk::DeviceCreateInfo deviceCreateInfo({}, 1, &queueCreateInfo); |
| 99 | if (enable_validation_layer_) { |
| 100 | deviceCreateInfo.setEnabledLayerCount(kValidation_layers_.size()); |
| 101 | deviceCreateInfo.setPpEnabledLayerNames(kValidation_layers_.data()); |
| 102 | } |
| 103 | device_ = physical_device_.createDevice(deviceCreateInfo); |
| 104 | gfx_queue_ = device_.getQueue(gfx_queue_idx_, /* Queue Index */ 0); |
| 105 | return true; |
| 106 | } |
| 107 | |
| 108 | bool testBase::CreateCommandPool() { |
| 109 | cmd_pool_ = |
| 110 | device_.createCommandPool({vk::CommandPoolCreateFlags(), gfx_queue_idx_}); |
| 111 | return true; |
| 112 | } |
| 113 | |
| 114 | void testBase::VkDestroy() { |
| 115 | if (!instance_) { |
| 116 | ERROR("Can't destroy any resource without a valid vulkan instance.") |
| 117 | return; |
| 118 | } |
| 119 | if (device_) { |
| 120 | if (cmd_pool_) { |
| 121 | device_.destroy(cmd_pool_, nullptr); |
| 122 | } |
| 123 | device_.destroy(); |
| 124 | } |
| 125 | if (enable_validation_layer_) { |
| 126 | DestroyDebugUtilsMessengerEXT(instance_, debug_messenger_, nullptr); |
| 127 | } |
| 128 | instance_.destroy(); |
| 129 | } |
| 130 | |
| 131 | } // namespace vkbench |