blob: 51eed70dd7f286a9247625ac7fb2397dbd2d605f [file] [log] [blame]
Mike Schuchardtee5abb82022-03-15 15:36:46 -07001/* Copyright (c) 2020-2022 The Khronos Group Inc.
2 * Copyright (c) 2020-2022 Valve Corporation
3 * Copyright (c) 2020-2022 LunarG, Inc.
Petr Kraus18b7d1f2020-03-31 21:12:30 +02004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18// Instanceless tests
19// Tests of validation of vkCreateInstance and vkDestroyInstance via the pNext debug callback.
20//
21// This set of test should ideally be as complete as possible. Most of the VUs are Implicit (i.e. automatically generated), but any
22// of the parameters could expose a bug or inadequacy in the Loader or the debug extension.
23//
24// Note: testing pCreateInfo pointer, the sType of a debug struct, the debug callback pointer, the ppEnabledLayerNames pointer, and
25// the ppEnabledExtensionNames would require extenally enabled debug layers, so this is currently not performed.
26//
Petr Kraus18b7d1f2020-03-31 21:12:30 +020027// TODO: VkDebugReportCallbackCreateInfoEXT::flags and VkDebugUtilsMessengerCreateInfoEXT various Flags could theoretically be
28// tested if the debug extensions are made robust enough
29
30#include <memory>
31#include <vector>
32
33#include "cast_utils.h"
34#include "layer_validation_tests.h"
35
36static VkInstance dummy_instance;
37
38TEST_F(VkLayerTest, InstanceExtensionDependencies) {
39 TEST_DESCRIPTION("Test enabling instance extension without dependencies met.");
40
41 if (!InstanceExtensionSupported(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
42 printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
43 return;
44 }
45 ASSERT_TRUE(InstanceExtensionSupported(VK_KHR_SURFACE_EXTENSION_NAME)); // Driver should always provide dependencies
46
47 Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateInstance-ppEnabledExtensionNames-01388");
48 instance_extensions_.push_back(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
49 const auto ici = GetInstanceCreateInfo();
50 vk::CreateInstance(&ici, nullptr, &dummy_instance);
51 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +020052}
53
Petr Kraus18b7d1f2020-03-31 21:12:30 +020054TEST_F(VkLayerTest, InstanceBadStype) {
55 TEST_DESCRIPTION("Test creating instance with bad sType.");
56
57 auto ici = GetInstanceCreateInfo();
58
59 Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkInstanceCreateInfo-sType-sType");
60 ici.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
61 vk::CreateInstance(&ici, nullptr, &dummy_instance);
62 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +020063}
64
Petr Kraus18b7d1f2020-03-31 21:12:30 +020065TEST_F(VkLayerTest, InstanceDuplicatePnextStype) {
66 TEST_DESCRIPTION("Test creating instance with duplicate sType in the pNext chain.");
67
68 if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) {
69 printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
70 return;
71 }
72 instance_extensions_.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
73
74 auto ici = GetInstanceCreateInfo();
75
76 Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkInstanceCreateInfo-sType-unique");
77 const VkValidationFeaturesEXT duplicate_pnext = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, ici.pNext};
78 const VkValidationFeaturesEXT first_pnext = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, &duplicate_pnext};
79 ici.pNext = &first_pnext;
80 vk::CreateInstance(&ici, nullptr, &dummy_instance);
81 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +020082}
83
Petr Kraus18b7d1f2020-03-31 21:12:30 +020084TEST_F(VkLayerTest, InstanceAppInfoBadStype) {
85 TEST_DESCRIPTION("Test creating instance with invalid sType in VkApplicationInfo.");
86
87 auto ici = GetInstanceCreateInfo();
88
89 VkApplicationInfo bad_app_info = {};
90 if (ici.pApplicationInfo) bad_app_info = *ici.pApplicationInfo;
91 bad_app_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
92 ici.pApplicationInfo = &bad_app_info;
93
94 Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkApplicationInfo-sType-sType");
95 vk::CreateInstance(&ici, nullptr, &dummy_instance);
96 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +020097}
98
Petr Kraus18b7d1f2020-03-31 21:12:30 +020099TEST_F(VkLayerTest, InstanceValidationFeaturesBadFlags) {
100 TEST_DESCRIPTION("Test creating instance with invalid flags in VkValidationFeaturesEXT.");
101
102 if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) {
103 printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
104 return;
105 }
106 instance_extensions_.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
107
108 auto ici = GetInstanceCreateInfo();
109
110 // the test framework should not be using VkValidationFeatureEnableEXT itself
111 for (auto traversable_pnext = reinterpret_cast<const VkBaseInStructure*>(ici.pNext); traversable_pnext;
112 traversable_pnext = traversable_pnext->pNext) {
113 ASSERT_NE(traversable_pnext->sType, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT);
114 }
115
Petr Kraus77430942020-04-04 01:43:08 +0200116 VkValidationFeaturesEXT validation_features_template = {};
117 validation_features_template.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
118 validation_features_template.pNext = ici.pNext;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200119
120 {
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200121 const VkValidationFeatureEnableEXT bad_enable = (VkValidationFeatureEnableEXT)0x42;
Petr Kraus77430942020-04-04 01:43:08 +0200122 VkValidationFeaturesEXT validation_features = validation_features_template;
123 validation_features.enabledValidationFeatureCount = 1;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200124 validation_features.pEnabledValidationFeatures = &bad_enable;
Petr Kraus77430942020-04-04 01:43:08 +0200125 ici.pNext = &validation_features;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200126
Petr Kraus77430942020-04-04 01:43:08 +0200127 // VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200128 Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
129 vk::CreateInstance(&ici, nullptr, &dummy_instance);
130 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200131 }
132
133 {
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200134 const VkValidationFeatureDisableEXT bad_disable = (VkValidationFeatureDisableEXT)0x42;
Petr Kraus77430942020-04-04 01:43:08 +0200135 VkValidationFeaturesEXT validation_features = validation_features_template;
136 validation_features.disabledValidationFeatureCount = 1;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200137 validation_features.pDisabledValidationFeatures = &bad_disable;
Petr Kraus77430942020-04-04 01:43:08 +0200138 ici.pNext = &validation_features;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200139
Petr Kraus77430942020-04-04 01:43:08 +0200140 // VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200141 Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
142 vk::CreateInstance(&ici, nullptr, &dummy_instance);
143 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200144 }
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200145}
146
147TEST_F(VkLayerTest, InstanceBadValidationFlags) {
148 TEST_DESCRIPTION("Test creating instance with invalid VkValidationFlagsEXT.");
149
150 if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME)) {
151 printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME);
152 return;
153 }
154 instance_extensions_.push_back(VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME);
155
156 auto ici = GetInstanceCreateInfo();
157
158 // the test framework should not be using VkValidationFlagsEXT itself
159 for (auto traversable_pnext = reinterpret_cast<const VkBaseInStructure*>(ici.pNext); traversable_pnext;
160 traversable_pnext = traversable_pnext->pNext) {
161 ASSERT_NE(traversable_pnext->sType, VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT);
162 }
163
Petr Kraus77430942020-04-04 01:43:08 +0200164 VkValidationFlagsEXT validation_flags_template = {};
165 validation_flags_template.sType = VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT;
166 validation_flags_template.pNext = ici.pNext;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200167
168 {
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200169 const VkValidationCheckEXT bad_disable = (VkValidationCheckEXT)0x42;
Petr Kraus77430942020-04-04 01:43:08 +0200170 VkValidationFlagsEXT validation_flags = validation_flags_template;
171 validation_flags.disabledValidationCheckCount = 1;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200172 validation_flags.pDisabledValidationChecks = &bad_disable;
Petr Kraus77430942020-04-04 01:43:08 +0200173 ici.pNext = &validation_flags;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200174
Petr Kraus77430942020-04-04 01:43:08 +0200175 // VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200176 Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
177 vk::CreateInstance(&ici, nullptr, &dummy_instance);
178 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200179 }
180
181 {
Petr Kraus77430942020-04-04 01:43:08 +0200182 VkValidationFlagsEXT validation_flags = validation_flags_template;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200183 validation_flags.disabledValidationCheckCount = 0;
Petr Kraus77430942020-04-04 01:43:08 +0200184 ici.pNext = &validation_flags;
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200185
Petr Kraus77430942020-04-04 01:43:08 +0200186 // VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200187 Monitor().SetDesiredFailureMsg(kErrorBit, "parameter disabledValidationCheckCount must be greater than 0");
188 vk::CreateInstance(&ici, nullptr, &dummy_instance);
189 Monitor().VerifyFound();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200190 }
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200191}
192
Petr Kraus77430942020-04-04 01:43:08 +0200193void* VKAPI_PTR DummyAlloc(void*, size_t size, size_t alignment, VkSystemAllocationScope) {
194 size_t space = size + alignment - 1;
195 void* mem_ptr = std::malloc(space);
196 return std::align(alignment, size, mem_ptr, space);
197}
198void VKAPI_PTR DummyFree(void*, void* pMemory) {
199 // just leak it
200}
201void* VKAPI_PTR DummyRealloc(void* pUserData, void* pOriginal, size_t size, size_t alignment,
202 VkSystemAllocationScope allocationScope) {
203 DummyFree(pUserData, pOriginal);
204 return DummyAlloc(pUserData, size, alignment, allocationScope);
205}
206void VKAPI_PTR DummyInfoAlloc(void*, size_t, VkInternalAllocationType, VkSystemAllocationScope) {}
207void VKAPI_PTR DummyInfoFree(void*, size_t, VkInternalAllocationType, VkSystemAllocationScope) {}
208
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200209TEST_F(VkLayerTest, DestroyInstanceAllocationCallbacksCompatibility) {
210 TEST_DESCRIPTION("Test vkDestroyInstance with incompatible allocation callbacks.");
211
212 const auto ici = GetInstanceCreateInfo();
213 const VkAllocationCallbacks alloc_callbacks = {nullptr, &DummyAlloc, &DummyRealloc,
214 &DummyFree, &DummyInfoAlloc, &DummyInfoFree};
215
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200216 {
217 VkInstance instance;
218 ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &instance));
219
220 Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-vkDestroyInstance-instance-00631");
221 vk::DestroyInstance(instance, &alloc_callbacks);
222 Monitor().VerifyFound();
223 }
224}
225
226TEST_F(VkLayerTest, DestroyInstanceHandleLeak) {
227 TEST_DESCRIPTION("Test vkDestroyInstance while leaking a VkDevice object.");
Tony-LunarGa0186342021-10-11 13:17:51 -0600228 ASSERT_NO_FATAL_FAILURE(InitFramework());
229 if (!IsPlatform(kMockICD)) {
230 // This test leaks a device (on purpose) and should not be run on a real driver
sjfricke11b24692022-06-21 20:49:53 +0900231 GTEST_SKIP() << "This test only runs on the mock ICD";
Tony-LunarGa0186342021-10-11 13:17:51 -0600232 }
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200233 const auto ici = GetInstanceCreateInfo();
234
235 VkInstance instance;
236 ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &instance));
237 uint32_t physical_device_count = 1;
238 VkPhysicalDevice physical_device;
Petr Kraus75ae8d92020-04-07 21:20:04 +0200239 const VkResult err = vk::EnumeratePhysicalDevices(instance, &physical_device_count, &physical_device);
240 ASSERT_TRUE(err == VK_SUCCESS || err == VK_INCOMPLETE) << vk_result_string(err);
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200241 ASSERT_EQ(physical_device_count, 1);
242
243 float dqci_priorities[] = {1.0};
sfricke-samsung54314c72021-12-31 01:59:25 -0600244 VkDeviceQueueCreateInfo dqci = LvlInitStruct<VkDeviceQueueCreateInfo>();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200245 dqci.queueFamilyIndex = 0;
246 dqci.queueCount = 1;
247 dqci.pQueuePriorities = dqci_priorities;
248
sfricke-samsung54314c72021-12-31 01:59:25 -0600249 VkDeviceCreateInfo dci = LvlInitStruct<VkDeviceCreateInfo>();
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200250 dci.queueCreateInfoCount = 1;
251 dci.pQueueCreateInfos = &dqci;
252
253 VkDevice leaked_device;
254 ASSERT_VK_SUCCESS(vk::CreateDevice(physical_device, &dci, nullptr, &leaked_device));
255
Petr Kraus77430942020-04-04 01:43:08 +0200256 // VUID-vkDestroyInstance-instance-00629
Petr Kraus18b7d1f2020-03-31 21:12:30 +0200257 Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-ObjectTracker-ObjectLeak");
258 vk::DestroyInstance(instance, nullptr);
259 Monitor().VerifyFound();
Nathaniel Cesariocabaf442022-07-21 14:57:41 -0600260}