blob: 6c2834a556f6316b8a28fa68f49ae4d17bb63a04 [file] [log] [blame]
Po-Hsien Wang00777b22019-04-24 16:37:09 -07001// 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
12extern int g_vlayer;
13
14namespace vkbench {
15void testBase::VkInitialization() {
16 CreateInstance();
17 ChoosePhysical_device_();
18 CreateLogicalDevice();
19 CreateCommandPool();
20}
21
22VKAPI_ATTR VkBool32 VKAPI_CALL
23ValidationCallback(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
43bool 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
80bool 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
95bool 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
108bool testBase::CreateCommandPool() {
109 cmd_pool_ =
110 device_.createCommandPool({vk::CommandPoolCreateFlags(), gfx_queue_idx_});
111 return true;
112}
113
114void 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