blob: e9c14a8d5f7e57a1ef0a5c36cd6dfd3c4c761b94 [file] [log] [blame]
Jeremy Hayes6650d1f2016-04-20 09:00:39 -06001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials are
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice(s) and this permission notice shall be included in
14 * all copies or substantial portions of the Materials.
15 *
16 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS.
24 *
25 * Author: Jeremy Hayes <jeremy@lunarG.com>
26 */
27
Jeremy Hayes10357562016-07-06 11:56:44 -060028#include <algorithm>
29#include <iostream>
Jeremy Hayesd8726c22016-04-21 13:19:41 -060030#include <memory>
Jeremy Hayes10357562016-07-06 11:56:44 -060031#include <string>
32#include <vector>
Jeremy Hayesd8726c22016-04-21 13:19:41 -060033
Jeremy Hayes6650d1f2016-04-20 09:00:39 -060034#include "test_common.h"
Mark Lobodzinski51414032016-09-07 16:29:11 -060035#include <vulkan/vulkan.h>
Jeremy Hayes6650d1f2016-04-20 09:00:39 -060036
Mark Lobodzinski51414032016-09-07 16:29:11 -060037namespace VK {
Jeremy Hayesc5587182016-06-28 11:29:05 -060038
Mark Lobodzinski51414032016-09-07 16:29:11 -060039struct InstanceCreateInfo {
40 InstanceCreateInfo()
41 : info // MSVC can't handle list initialization, thus explicit construction herein.
42 (VkInstanceCreateInfo{
43 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
44 nullptr, // pNext
45 0, // flags
46 nullptr, // pApplicationInfo
47 0, // enabledLayerCount
48 nullptr, // ppEnabledLayerNames
49 0, // enabledExtensionCount
50 nullptr // ppEnabledExtensionNames
51 }) {}
Jeremy Hayesc5587182016-06-28 11:29:05 -060052
Mark Lobodzinski51414032016-09-07 16:29:11 -060053 InstanceCreateInfo &sType(VkStructureType const &sType) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060054 info.sType = sType;
55
56 return *this;
57 }
58
Mark Lobodzinski51414032016-09-07 16:29:11 -060059 InstanceCreateInfo &pNext(void const *const pNext) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060060 info.pNext = pNext;
61
62 return *this;
63 }
64
Mark Lobodzinski51414032016-09-07 16:29:11 -060065 InstanceCreateInfo &flags(VkInstanceCreateFlags const &flags) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060066 info.flags = flags;
67
68 return *this;
69 }
70
Mark Lobodzinski51414032016-09-07 16:29:11 -060071 InstanceCreateInfo &pApplicationInfo(VkApplicationInfo const *const pApplicationInfo) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060072 info.pApplicationInfo = pApplicationInfo;
73
74 return *this;
75 }
76
Mark Lobodzinski51414032016-09-07 16:29:11 -060077 InstanceCreateInfo &enabledLayerCount(uint32_t const &enabledLayerCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060078 info.enabledLayerCount = enabledLayerCount;
79
80 return *this;
81 }
82
Mark Lobodzinski51414032016-09-07 16:29:11 -060083 InstanceCreateInfo &ppEnabledLayerNames(char const *const *const ppEnabledLayerNames) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060084 info.ppEnabledLayerNames = ppEnabledLayerNames;
85
86 return *this;
87 }
88
Mark Lobodzinski51414032016-09-07 16:29:11 -060089 InstanceCreateInfo &enabledExtensionCount(uint32_t const &enabledExtensionCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060090 info.enabledExtensionCount = enabledExtensionCount;
91
92 return *this;
93 }
94
Mark Lobodzinski51414032016-09-07 16:29:11 -060095 InstanceCreateInfo &ppEnabledExtensionNames(char const *const *const ppEnabledExtensionNames) {
Jeremy Hayesc5587182016-06-28 11:29:05 -060096 info.ppEnabledExtensionNames = ppEnabledExtensionNames;
97
98 return *this;
99 }
100
Mark Lobodzinski51414032016-09-07 16:29:11 -0600101 operator VkInstanceCreateInfo const *() const { return &info; }
Jeremy Hayesc5587182016-06-28 11:29:05 -0600102
Mark Lobodzinski51414032016-09-07 16:29:11 -0600103 operator VkInstanceCreateInfo *() { return &info; }
Jeremy Hayesc5587182016-06-28 11:29:05 -0600104
105 VkInstanceCreateInfo info;
106};
107
Mark Lobodzinski51414032016-09-07 16:29:11 -0600108struct DeviceQueueCreateInfo {
109 DeviceQueueCreateInfo()
110 : info // MSVC can't handle list initialization, thus explicit construction herein.
111 (VkDeviceQueueCreateInfo{
112 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
113 nullptr, // pNext
114 0, // flags
115 0, // queueFamilyIndex
116 0, // queueCount
117 nullptr // pQueuePriorities
118 }) {}
Jeremy Hayesc5587182016-06-28 11:29:05 -0600119
Mark Lobodzinski51414032016-09-07 16:29:11 -0600120 DeviceQueueCreateInfo &sType(VkStructureType const &sType) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600121 info.sType = sType;
122
123 return *this;
124 }
125
Mark Lobodzinski51414032016-09-07 16:29:11 -0600126 DeviceQueueCreateInfo &pNext(void const *const pNext) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600127 info.pNext = pNext;
128
129 return *this;
130 }
131
Mark Lobodzinski51414032016-09-07 16:29:11 -0600132 DeviceQueueCreateInfo &flags(VkDeviceQueueCreateFlags const &flags) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600133 info.flags = flags;
134
135 return *this;
136 }
137
Mark Lobodzinski51414032016-09-07 16:29:11 -0600138 DeviceQueueCreateInfo &queueFamilyIndex(uint32_t const &queueFamilyIndex) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600139 info.queueFamilyIndex = queueFamilyIndex;
140
141 return *this;
142 }
143
Mark Lobodzinski51414032016-09-07 16:29:11 -0600144 DeviceQueueCreateInfo &queueCount(uint32_t const &queueCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600145 info.queueCount = queueCount;
146
147 return *this;
148 }
149
Mark Lobodzinski51414032016-09-07 16:29:11 -0600150 DeviceQueueCreateInfo &pQueuePriorities(float const *const pQueuePriorities) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600151 info.pQueuePriorities = pQueuePriorities;
152
153 return *this;
154 }
155
Mark Lobodzinski51414032016-09-07 16:29:11 -0600156 operator VkDeviceQueueCreateInfo() { return info; }
Jeremy Hayesc5587182016-06-28 11:29:05 -0600157
158 VkDeviceQueueCreateInfo info;
159};
160
Mark Lobodzinski51414032016-09-07 16:29:11 -0600161struct DeviceCreateInfo {
162 DeviceCreateInfo()
163 : info // MSVC can't handle list initialization, thus explicit construction herein.
164 (VkDeviceCreateInfo{
165 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
166 nullptr, // pNext
167 0, // flags
168 0, // queueCreateInfoCount
169 nullptr, // pQueueCreateInfos
170 0, // enabledLayerCount
171 nullptr, // ppEnabledLayerNames
172 0, // enabledExtensionCount
173 nullptr, // ppEnabledExtensionNames
174 nullptr // pEnabledFeatures
175 }) {}
Jeremy Hayesc5587182016-06-28 11:29:05 -0600176
Mark Lobodzinski51414032016-09-07 16:29:11 -0600177 DeviceCreateInfo &sType(VkStructureType const &sType) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600178 info.sType = sType;
179
180 return *this;
181 }
182
Mark Lobodzinski51414032016-09-07 16:29:11 -0600183 DeviceCreateInfo &pNext(void const *const pNext) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600184 info.pNext = pNext;
185
186 return *this;
187 }
188
Mark Lobodzinski51414032016-09-07 16:29:11 -0600189 DeviceCreateInfo &flags(VkDeviceQueueCreateFlags const &flags) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600190 info.flags = flags;
191
192 return *this;
193 }
194
Mark Lobodzinski51414032016-09-07 16:29:11 -0600195 DeviceCreateInfo &queueCreateInfoCount(uint32_t const &queueCreateInfoCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600196 info.queueCreateInfoCount = queueCreateInfoCount;
197
198 return *this;
199 }
200
Mark Lobodzinski51414032016-09-07 16:29:11 -0600201 DeviceCreateInfo &pQueueCreateInfos(VkDeviceQueueCreateInfo const *const pQueueCreateInfos) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600202 info.pQueueCreateInfos = pQueueCreateInfos;
203
204 return *this;
205 }
206
Mark Lobodzinski51414032016-09-07 16:29:11 -0600207 DeviceCreateInfo &enabledLayerCount(uint32_t const &enabledLayerCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600208 info.enabledLayerCount = enabledLayerCount;
209
210 return *this;
211 }
212
Mark Lobodzinski51414032016-09-07 16:29:11 -0600213 DeviceCreateInfo &ppEnabledLayerNames(char const *const *const ppEnabledLayerNames) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600214 info.ppEnabledLayerNames = ppEnabledLayerNames;
215
216 return *this;
217 }
218
Mark Lobodzinski51414032016-09-07 16:29:11 -0600219 DeviceCreateInfo &enabledExtensionCount(uint32_t const &enabledExtensionCount) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600220 info.enabledExtensionCount = enabledExtensionCount;
221
222 return *this;
223 }
224
Mark Lobodzinski51414032016-09-07 16:29:11 -0600225 DeviceCreateInfo &ppEnabledExtensionNames(char const *const *const ppEnabledExtensionNames) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600226 info.ppEnabledExtensionNames = ppEnabledExtensionNames;
227
228 return *this;
229 }
230
Mark Lobodzinski51414032016-09-07 16:29:11 -0600231 DeviceCreateInfo &pEnabledFeatures(VkPhysicalDeviceFeatures const *const pEnabledFeatures) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600232 info.pEnabledFeatures = pEnabledFeatures;
233
234 return *this;
235 }
236
Mark Lobodzinski51414032016-09-07 16:29:11 -0600237 operator VkDeviceCreateInfo const *() const { return &info; }
Jeremy Hayesc5587182016-06-28 11:29:05 -0600238
Mark Lobodzinski51414032016-09-07 16:29:11 -0600239 operator VkDeviceCreateInfo *() { return &info; }
Jeremy Hayesc5587182016-06-28 11:29:05 -0600240
241 VkDeviceCreateInfo info;
242};
Jeremy Hayesc5587182016-06-28 11:29:05 -0600243}
244
Mark Lobodzinski51414032016-09-07 16:29:11 -0600245struct CommandLine : public ::testing::Test {
246 static void Initialize(int argc, char **argv) { arguments.assign(argv, argv + argc); };
Jeremy Hayes10357562016-07-06 11:56:44 -0600247
Mark Lobodzinski51414032016-09-07 16:29:11 -0600248 static void SetUpTestCase(){};
249 static void TearDownTestCase(){};
Jeremy Hayes10357562016-07-06 11:56:44 -0600250
251 static std::vector<std::string> arguments;
252};
253std::vector<std::string> CommandLine::arguments;
254
255struct EnumerateInstanceLayerProperties : public CommandLine {};
256struct EnumerateInstanceExtensionProperties : public CommandLine {};
Jeremy Hayes52261802016-08-15 10:37:24 -0600257struct ImplicitLayer : public CommandLine {};
Jeremy Hayes10357562016-07-06 11:56:44 -0600258
Jeremy Hayesd8726c22016-04-21 13:19:41 -0600259// Test groups:
260// LX = lunar exchange
261// LVLGH = loader and validation github
262// LVLGL = lodaer and validation gitlab
263
Mark Lobodzinski51414032016-09-07 16:29:11 -0600264TEST(LX435, InstanceCreateInfoConst) {
265 VkInstanceCreateInfo const info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, nullptr, 0, nullptr, 0, nullptr, 0, nullptr};
Jeremy Hayes6650d1f2016-04-20 09:00:39 -0600266
267 VkInstance instance = VK_NULL_HANDLE;
268 VkResult result = vkCreateInstance(&info, VK_NULL_HANDLE, &instance);
269 EXPECT_EQ(result, VK_SUCCESS);
Jeremy Hayes10357562016-07-06 11:56:44 -0600270
271 vkDestroyInstance(instance, nullptr);
Jeremy Hayes6650d1f2016-04-20 09:00:39 -0600272}
273
Mark Lobodzinski51414032016-09-07 16:29:11 -0600274TEST(LX475, DestroyInstanceNullHandle) { vkDestroyInstance(VK_NULL_HANDLE, nullptr); }
Jeremy Hayesd8726c22016-04-21 13:19:41 -0600275
Mark Lobodzinski51414032016-09-07 16:29:11 -0600276TEST(LX475, DestroyDeviceNullHandle) { vkDestroyDevice(VK_NULL_HANDLE, nullptr); }
Jeremy Hayesd8726c22016-04-21 13:19:41 -0600277
Mark Lobodzinski51414032016-09-07 16:29:11 -0600278TEST(CreateInstance, ExtensionNotPresent) {
279 char const *const names[] = {"NotPresent"}; // Temporary required due to MSVC bug.
280 auto const info = VK::InstanceCreateInfo().enabledExtensionCount(1).ppEnabledExtensionNames(names);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600281
282 VkInstance instance = VK_NULL_HANDLE;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600283 VkResult result = vkCreateInstance(info, VK_NULL_HANDLE, &instance);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600284 ASSERT_EQ(result, VK_ERROR_EXTENSION_NOT_PRESENT);
Jeremy Hayes10357562016-07-06 11:56:44 -0600285
286 // It's not necessary to destroy the instance because it will not be created successfully.
Jeremy Hayes097188a2016-06-15 16:37:17 -0600287}
288
Mark Lobodzinski51414032016-09-07 16:29:11 -0600289TEST(CreateInstance, LayerNotPresent) {
290 char const *const names[] = {"NotPresent"}; // Temporary required due to MSVC bug.
291 auto const info = VK::InstanceCreateInfo().enabledLayerCount(1).ppEnabledLayerNames(names);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600292
293 VkInstance instance = VK_NULL_HANDLE;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600294 VkResult result = vkCreateInstance(info, VK_NULL_HANDLE, &instance);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600295 ASSERT_EQ(result, VK_ERROR_LAYER_NOT_PRESENT);
Jeremy Hayes10357562016-07-06 11:56:44 -0600296
297 // It's not necessary to destroy the instance because it will not be created successfully.
Jeremy Hayes097188a2016-06-15 16:37:17 -0600298}
299
Jeremy Hayesab9804d2016-06-30 10:13:35 -0600300// Used by run_loader_tests.sh to test for layer insertion.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600301TEST(CreateInstance, LayerPresent) {
302 char const *const names[] = {"VK_LAYER_LUNARG_parameter_validation"}; // Temporary required due to MSVC bug.
303 auto const info = VK::InstanceCreateInfo().enabledLayerCount(1).ppEnabledLayerNames(names);
Jeremy Hayesab9804d2016-06-30 10:13:35 -0600304
305 VkInstance instance = VK_NULL_HANDLE;
306 VkResult result = vkCreateInstance(info, VK_NULL_HANDLE, &instance);
307 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayes10357562016-07-06 11:56:44 -0600308
309 vkDestroyInstance(instance, nullptr);
Jeremy Hayesab9804d2016-06-30 10:13:35 -0600310}
311
Mark Lobodzinski51414032016-09-07 16:29:11 -0600312TEST(CreateDevice, ExtensionNotPresent) {
Jeremy Hayes097188a2016-06-15 16:37:17 -0600313 VkInstance instance = VK_NULL_HANDLE;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600314 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600315 ASSERT_EQ(result, VK_SUCCESS);
316
317 uint32_t physicalCount = 0;
318 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
319 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayesa6fb5b42016-06-21 10:54:01 -0600320 ASSERT_GT(physicalCount, 0u);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600321
322 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
323 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
324 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayesa6fb5b42016-06-21 10:54:01 -0600325 ASSERT_GT(physicalCount, 0u);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600326
Mark Lobodzinski51414032016-09-07 16:29:11 -0600327 for (uint32_t p = 0; p < physicalCount; ++p) {
Jeremy Hayes097188a2016-06-15 16:37:17 -0600328 uint32_t familyCount = 0;
329 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, nullptr);
330 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayesa6fb5b42016-06-21 10:54:01 -0600331 ASSERT_GT(familyCount, 0u);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600332
333 std::unique_ptr<VkQueueFamilyProperties[]> family(new VkQueueFamilyProperties[familyCount]);
334 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, family.get());
335 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayesa6fb5b42016-06-21 10:54:01 -0600336 ASSERT_GT(familyCount, 0u);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600337
Mark Lobodzinski51414032016-09-07 16:29:11 -0600338 for (uint32_t q = 0; q < familyCount; ++q) {
339 if (~family[q].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes097188a2016-06-15 16:37:17 -0600340 continue;
341 }
342
Jeremy Hayesc5587182016-06-28 11:29:05 -0600343 float const priorities[] = {0.0f}; // Temporary required due to MSVC bug.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600344 VkDeviceQueueCreateInfo const queueInfo[1]{
345 VK::DeviceQueueCreateInfo().queueFamilyIndex(q).queueCount(1).pQueuePriorities(priorities)};
Jeremy Hayes097188a2016-06-15 16:37:17 -0600346
Mark Lobodzinski51414032016-09-07 16:29:11 -0600347 char const *const names[] = {"NotPresent"}; // Temporary required due to MSVC bug.
348 auto const deviceInfo = VK::DeviceCreateInfo()
349 .queueCreateInfoCount(1)
350 .pQueueCreateInfos(queueInfo)
351 .enabledExtensionCount(1)
352 .ppEnabledExtensionNames(names);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600353
354 VkDevice device;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600355 result = vkCreateDevice(physical[p], deviceInfo, nullptr, &device);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600356 ASSERT_EQ(result, VK_ERROR_EXTENSION_NOT_PRESENT);
Jeremy Hayes10357562016-07-06 11:56:44 -0600357
358 // It's not necessary to destroy the device because it will not be created successfully.
Jeremy Hayes097188a2016-06-15 16:37:17 -0600359 }
360 }
Jeremy Hayes10357562016-07-06 11:56:44 -0600361
362 vkDestroyInstance(instance, nullptr);
Jeremy Hayes097188a2016-06-15 16:37:17 -0600363}
364
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600365// LX535 / MI-76: Device layers are deprecated.
366// For backwards compatibility, they are allowed, but must be ignored.
367// Ensure that no errors occur if a bogus device layer list is passed to vkCreateDevice.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600368TEST(CreateDevice, LayersNotPresent) {
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600369 VkInstance instance = VK_NULL_HANDLE;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600370 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600371 ASSERT_EQ(result, VK_SUCCESS);
372
373 uint32_t physicalCount = 0;
374 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
375 ASSERT_EQ(result, VK_SUCCESS);
376 ASSERT_GT(physicalCount, 0u);
377
378 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
379 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
380 ASSERT_EQ(result, VK_SUCCESS);
381 ASSERT_GT(physicalCount, 0u);
382
Mark Lobodzinski51414032016-09-07 16:29:11 -0600383 for (uint32_t p = 0; p < physicalCount; ++p) {
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600384 uint32_t familyCount = 0;
385 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, nullptr);
386 ASSERT_EQ(result, VK_SUCCESS);
387 ASSERT_GT(familyCount, 0u);
388
389 std::unique_ptr<VkQueueFamilyProperties[]> family(new VkQueueFamilyProperties[familyCount]);
390 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, family.get());
391 ASSERT_EQ(result, VK_SUCCESS);
392 ASSERT_GT(familyCount, 0u);
393
Mark Lobodzinski51414032016-09-07 16:29:11 -0600394 for (uint32_t q = 0; q < familyCount; ++q) {
395 if (~family[q].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600396 continue;
397 }
398
Jeremy Hayesc5587182016-06-28 11:29:05 -0600399 float const priorities[] = {0.0f}; // Temporary required due to MSVC bug.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600400 VkDeviceQueueCreateInfo const queueInfo[1]{
401 VK::DeviceQueueCreateInfo().queueFamilyIndex(q).queueCount(1).pQueuePriorities(priorities)};
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600402
Mark Lobodzinski51414032016-09-07 16:29:11 -0600403 char const *const names[] = {"NotPresent"}; // Temporary required due to MSVC bug.
404 auto const deviceInfo = VK::DeviceCreateInfo()
405 .queueCreateInfoCount(1)
406 .pQueueCreateInfos(queueInfo)
407 .enabledLayerCount(1)
408 .ppEnabledLayerNames(names);
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600409
410 VkDevice device;
Jeremy Hayesc5587182016-06-28 11:29:05 -0600411 result = vkCreateDevice(physical[p], deviceInfo, nullptr, &device);
412 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayes10357562016-07-06 11:56:44 -0600413
414 vkDestroyDevice(device, nullptr);
Jeremy Hayesc5587182016-06-28 11:29:05 -0600415 }
416 }
Jeremy Hayes10357562016-07-06 11:56:44 -0600417
418 vkDestroyInstance(instance, nullptr);
419}
420
Mark Lobodzinski51414032016-09-07 16:29:11 -0600421TEST_F(EnumerateInstanceLayerProperties, PropertyCountLessThanAvailable) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600422 uint32_t count = 0u;
423 VkResult result = vkEnumerateInstanceLayerProperties(&count, nullptr);
424 ASSERT_EQ(result, VK_SUCCESS);
425
426 // We need atleast two for the test to be relevant.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600427 if (count < 2u) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600428 return;
429 }
430
431 std::unique_ptr<VkLayerProperties[]> properties(new VkLayerProperties[count]);
432 count = 1;
433 result = vkEnumerateInstanceLayerProperties(&count, properties.get());
434 ASSERT_EQ(result, VK_INCOMPLETE);
435}
436
Mark Lobodzinski51414032016-09-07 16:29:11 -0600437TEST(EnumerateDeviceLayerProperties, PropertyCountLessThanAvailable) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600438 VkInstance instance = VK_NULL_HANDLE;
439 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
440 ASSERT_EQ(result, VK_SUCCESS);
441
442 uint32_t physicalCount = 0;
443 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
444 ASSERT_EQ(result, VK_SUCCESS);
445 ASSERT_GT(physicalCount, 0u);
446
447 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
448 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
449 ASSERT_EQ(result, VK_SUCCESS);
450 ASSERT_GT(physicalCount, 0u);
451
Mark Lobodzinski51414032016-09-07 16:29:11 -0600452 for (uint32_t p = 0; p < physicalCount; ++p) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600453 uint32_t count = 0u;
454 result = vkEnumerateDeviceLayerProperties(physical[p], &count, nullptr);
455 ASSERT_EQ(result, VK_SUCCESS);
456
457 // We need atleast two for the test to be relevant.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600458 if (count < 2u) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600459 continue;
460 }
461
462 std::unique_ptr<VkLayerProperties[]> properties(new VkLayerProperties[count]);
463 count = 1;
464 result = vkEnumerateDeviceLayerProperties(physical[p], &count, properties.get());
465 ASSERT_EQ(result, VK_INCOMPLETE);
466 }
467
468 vkDestroyInstance(instance, nullptr);
469}
470
Mark Lobodzinski51414032016-09-07 16:29:11 -0600471TEST_F(EnumerateInstanceLayerProperties, Count) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600472 uint32_t count = 0u;
473 VkResult result = vkEnumerateInstanceLayerProperties(&count, nullptr);
474 ASSERT_EQ(result, VK_SUCCESS);
475
Mark Lobodzinski51414032016-09-07 16:29:11 -0600476 if (std::find(arguments.begin(), arguments.end(), "count") != arguments.end()) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600477 std::cout << "count=" << count << '\n';
478 }
479}
480
Mark Lobodzinski51414032016-09-07 16:29:11 -0600481TEST_F(EnumerateInstanceLayerProperties, OnePass) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600482 // Count required for this test.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600483 if (std::find(arguments.begin(), arguments.end(), "count") == arguments.end()) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600484 return;
485 }
486
487 uint32_t count = std::stoul(arguments[2]);
488
489 std::unique_ptr<VkLayerProperties[]> properties(new VkLayerProperties[count]);
490 VkResult result = vkEnumerateInstanceLayerProperties(&count, properties.get());
491 ASSERT_EQ(result, VK_SUCCESS);
492
Mark Lobodzinski51414032016-09-07 16:29:11 -0600493 if (std::find(arguments.begin(), arguments.end(), "properties") != arguments.end()) {
494 for (uint32_t p = 0; p < count; ++p) {
495 std::cout << "properties[" << p << "] =" << ' ' << properties[p].layerName << ' ' << properties[p].specVersion << ' '
496 << properties[p].implementationVersion << ' ' << properties[p].description << '\n';
Jeremy Hayes10357562016-07-06 11:56:44 -0600497 }
498 }
499}
500
Mark Lobodzinski51414032016-09-07 16:29:11 -0600501TEST_F(EnumerateInstanceLayerProperties, TwoPass) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600502 uint32_t count = 0u;
503 VkResult result = vkEnumerateInstanceLayerProperties(&count, nullptr);
504 ASSERT_EQ(result, VK_SUCCESS);
505
506 std::unique_ptr<VkLayerProperties[]> properties(new VkLayerProperties[count]);
507 result = vkEnumerateInstanceLayerProperties(&count, properties.get());
508 ASSERT_EQ(result, VK_SUCCESS);
509
Mark Lobodzinski51414032016-09-07 16:29:11 -0600510 if (std::find(arguments.begin(), arguments.end(), "properties") != arguments.end()) {
511 for (uint32_t p = 0; p < count; ++p) {
512 std::cout << "properties[" << p << "] =" << ' ' << properties[p].layerName << ' ' << properties[p].specVersion << ' '
513 << properties[p].implementationVersion << ' ' << properties[p].description << '\n';
Jeremy Hayes10357562016-07-06 11:56:44 -0600514 }
515 }
516}
517
Mark Lobodzinski51414032016-09-07 16:29:11 -0600518TEST_F(EnumerateInstanceExtensionProperties, PropertyCountLessThanAvailable) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600519 uint32_t count = 0u;
520 VkResult result = vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);
521 ASSERT_EQ(result, VK_SUCCESS);
522
523 // We need atleast two for the test to be relevant.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600524 if (count < 2u) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600525 return;
526 }
527
528 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
529 count = 1;
530 result = vkEnumerateInstanceExtensionProperties(nullptr, &count, properties.get());
531 ASSERT_EQ(result, VK_INCOMPLETE);
532}
533
Mark Lobodzinski51414032016-09-07 16:29:11 -0600534TEST(EnumerateDeviceExtensionProperties, PropertyCountLessThanAvailable) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600535 VkInstance instance = VK_NULL_HANDLE;
536 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
537 ASSERT_EQ(result, VK_SUCCESS);
538
539 uint32_t physicalCount = 0;
540 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
541 ASSERT_EQ(result, VK_SUCCESS);
542 ASSERT_GT(physicalCount, 0u);
543
544 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
545 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
546 ASSERT_EQ(result, VK_SUCCESS);
547 ASSERT_GT(physicalCount, 0u);
548
Mark Lobodzinski51414032016-09-07 16:29:11 -0600549 for (uint32_t p = 0; p < physicalCount; ++p) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600550 uint32_t count = 0u;
551 result = vkEnumerateDeviceExtensionProperties(physical[p], nullptr, &count, nullptr);
552 ASSERT_EQ(result, VK_SUCCESS);
553
554 // We need atleast two for the test to be relevant.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600555 if (count < 2u) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600556 continue;
557 }
558
559 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
560 count = 1;
561 result = vkEnumerateDeviceExtensionProperties(physical[p], nullptr, &count, properties.get());
562 ASSERT_EQ(result, VK_INCOMPLETE);
563 }
564
565 vkDestroyInstance(instance, nullptr);
566}
567
Mark Lobodzinski51414032016-09-07 16:29:11 -0600568TEST_F(EnumerateInstanceExtensionProperties, Count) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600569 uint32_t count = 0u;
570 VkResult result = vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);
571 ASSERT_EQ(result, VK_SUCCESS);
572
Mark Lobodzinski51414032016-09-07 16:29:11 -0600573 if (std::find(arguments.begin(), arguments.end(), "count") != arguments.end()) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600574 std::cout << "count=" << count << '\n';
575 }
576}
577
Mark Lobodzinski51414032016-09-07 16:29:11 -0600578TEST_F(EnumerateInstanceExtensionProperties, OnePass) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600579 // Count required for this test.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600580 if (std::find(arguments.begin(), arguments.end(), "count") == arguments.end()) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600581 return;
582 }
583
584 uint32_t count = std::stoul(arguments[2]);
585
586 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
587 VkResult result = vkEnumerateInstanceExtensionProperties(nullptr, &count, properties.get());
588 ASSERT_EQ(result, VK_SUCCESS);
589
Mark Lobodzinski51414032016-09-07 16:29:11 -0600590 if (std::find(arguments.begin(), arguments.end(), "properties") != arguments.end()) {
591 for (uint32_t p = 0; p < count; ++p) {
592 std::cout << "properties[" << p << "] =" << ' ' << properties[p].extensionName << ' ' << properties[p].specVersion
593 << '\n';
Jeremy Hayes10357562016-07-06 11:56:44 -0600594 }
595 }
596}
597
Mark Lobodzinski51414032016-09-07 16:29:11 -0600598TEST_F(EnumerateInstanceExtensionProperties, TwoPass) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600599 uint32_t count = 0u;
600 VkResult result = vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);
601 ASSERT_EQ(result, VK_SUCCESS);
602
603 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
604 result = vkEnumerateInstanceExtensionProperties(nullptr, &count, properties.get());
605 ASSERT_EQ(result, VK_SUCCESS);
606
Mark Lobodzinski51414032016-09-07 16:29:11 -0600607 if (std::find(arguments.begin(), arguments.end(), "properties") != arguments.end()) {
608 for (uint32_t p = 0; p < count; ++p) {
609 std::cout << "properties[" << p << "] =" << ' ' << properties[p].extensionName << ' ' << properties[p].specVersion
610 << '\n';
Jeremy Hayes10357562016-07-06 11:56:44 -0600611 }
612 }
613}
614
Mark Lobodzinski51414032016-09-07 16:29:11 -0600615TEST_F(EnumerateInstanceExtensionProperties, InstanceExtensionEnumerated) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600616 uint32_t count = 0u;
617 VkResult result = vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);
618 ASSERT_EQ(result, VK_SUCCESS);
619
620 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
621 result = vkEnumerateInstanceExtensionProperties(nullptr, &count, properties.get());
622 ASSERT_EQ(result, VK_SUCCESS);
623
624 ASSERT_NE(std::find_if(
Mark Lobodzinski51414032016-09-07 16:29:11 -0600625 &properties[0], &properties[count],
626 [](VkExtensionProperties const &properties) { return strcmp(properties.extensionName, "VK_KHR_surface") == 0; }),
627 &properties[count]);
Jeremy Hayes10357562016-07-06 11:56:44 -0600628}
629
Mark Lobodzinski51414032016-09-07 16:29:11 -0600630TEST(EnumerateDeviceExtensionProperties, DeviceExtensionEnumerated) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600631 VkInstance instance = VK_NULL_HANDLE;
632 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
633 ASSERT_EQ(result, VK_SUCCESS);
634
635 uint32_t physicalCount = 0;
636 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
637 ASSERT_EQ(result, VK_SUCCESS);
638 ASSERT_GT(physicalCount, 0u);
639
640 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
641 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
642 ASSERT_EQ(result, VK_SUCCESS);
643 ASSERT_GT(physicalCount, 0u);
644
Mark Lobodzinski51414032016-09-07 16:29:11 -0600645 for (uint32_t p = 0; p < physicalCount; ++p) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600646 uint32_t count = 0u;
647 result = vkEnumerateDeviceExtensionProperties(physical[p], nullptr, &count, nullptr);
648 ASSERT_EQ(result, VK_SUCCESS);
649
650 std::unique_ptr<VkExtensionProperties[]> properties(new VkExtensionProperties[count]);
651 result = vkEnumerateDeviceExtensionProperties(physical[p], nullptr, &count, properties.get());
652 ASSERT_EQ(result, VK_SUCCESS);
653
Mark Lobodzinski51414032016-09-07 16:29:11 -0600654 ASSERT_NE(std::find_if(&properties[0], &properties[count],
655 [](VkExtensionProperties const &properties) {
656 return strcmp(properties.extensionName, "VK_KHR_swapchain") == 0;
657 }),
658 &properties[count]);
Jeremy Hayes10357562016-07-06 11:56:44 -0600659 }
660
661 vkDestroyInstance(instance, nullptr);
Jeremy Hayesc5587182016-06-28 11:29:05 -0600662}
663
Mark Lobodzinski51414032016-09-07 16:29:11 -0600664TEST_F(ImplicitLayer, Present) {
Jeremy Hayes52261802016-08-15 10:37:24 -0600665 auto const info = VK::InstanceCreateInfo();
666 VkInstance instance = VK_NULL_HANDLE;
667 VkResult result = vkCreateInstance(info, VK_NULL_HANDLE, &instance);
668 ASSERT_EQ(result, VK_SUCCESS);
669
670 vkDestroyInstance(instance, nullptr);
671}
672
Mark Lobodzinski51414032016-09-07 16:29:11 -0600673TEST(WrapObjects, Insert) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600674 VkInstance instance = VK_NULL_HANDLE;
675 VkResult result = vkCreateInstance(VK::InstanceCreateInfo(), VK_NULL_HANDLE, &instance);
676 ASSERT_EQ(result, VK_SUCCESS);
677
678 uint32_t physicalCount = 0;
679 result = vkEnumeratePhysicalDevices(instance, &physicalCount, nullptr);
680 ASSERT_EQ(result, VK_SUCCESS);
681 ASSERT_GT(physicalCount, 0u);
682
683 std::unique_ptr<VkPhysicalDevice[]> physical(new VkPhysicalDevice[physicalCount]);
684 result = vkEnumeratePhysicalDevices(instance, &physicalCount, physical.get());
685 ASSERT_EQ(result, VK_SUCCESS);
686 ASSERT_GT(physicalCount, 0u);
687
Mark Lobodzinski51414032016-09-07 16:29:11 -0600688 for (uint32_t p = 0; p < physicalCount; ++p) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600689 uint32_t familyCount = 0;
690 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, nullptr);
691 ASSERT_EQ(result, VK_SUCCESS);
692 ASSERT_GT(familyCount, 0u);
693
694 std::unique_ptr<VkQueueFamilyProperties[]> family(new VkQueueFamilyProperties[familyCount]);
695 vkGetPhysicalDeviceQueueFamilyProperties(physical[p], &familyCount, family.get());
696 ASSERT_EQ(result, VK_SUCCESS);
697 ASSERT_GT(familyCount, 0u);
698
Mark Lobodzinski51414032016-09-07 16:29:11 -0600699 for (uint32_t q = 0; q < familyCount; ++q) {
700 if (~family[q].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayesc5587182016-06-28 11:29:05 -0600701 continue;
702 }
703
704 float const priorities[] = {0.0f}; // Temporary required due to MSVC bug.
Mark Lobodzinski51414032016-09-07 16:29:11 -0600705 VkDeviceQueueCreateInfo const queueInfo[1]{
706 VK::DeviceQueueCreateInfo().queueFamilyIndex(q).queueCount(1).pQueuePriorities(priorities)};
Jeremy Hayesc5587182016-06-28 11:29:05 -0600707
Mark Lobodzinski51414032016-09-07 16:29:11 -0600708 auto const deviceInfo = VK::DeviceCreateInfo().queueCreateInfoCount(1).pQueueCreateInfos(queueInfo);
Jeremy Hayesc5587182016-06-28 11:29:05 -0600709
710 VkDevice device;
711 result = vkCreateDevice(physical[p], deviceInfo, nullptr, &device);
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600712 ASSERT_EQ(result, VK_SUCCESS);
Jeremy Hayes10357562016-07-06 11:56:44 -0600713
714 vkDestroyDevice(device, nullptr);
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600715 }
716 }
Jeremy Hayes10357562016-07-06 11:56:44 -0600717
718 vkDestroyInstance(instance, nullptr);
Rene Lindsaye7ec3de2016-06-28 10:36:01 -0600719}
720
Mark Lobodzinski51414032016-09-07 16:29:11 -0600721int main(int argc, char **argv) {
Jeremy Hayes6650d1f2016-04-20 09:00:39 -0600722 int result;
723
724 ::testing::InitGoogleTest(&argc, argv);
725
Mark Lobodzinski51414032016-09-07 16:29:11 -0600726 if (argc > 0) {
Jeremy Hayes10357562016-07-06 11:56:44 -0600727 CommandLine::Initialize(argc, argv);
728 }
729
Jeremy Hayes6650d1f2016-04-20 09:00:39 -0600730 result = RUN_ALL_TESTS();
731
732 return result;
733}