blob: 4eeba067cf1e53164399ce484483f083e0e73f0e [file] [log] [blame]
Chia-I Wu46c29dd2014-12-02 21:09:20 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wu46c29dd2014-12-02 21:09:20 +08003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS 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. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
Chia-I Wud4bae362014-07-29 11:15:00 +080024#include <stdlib.h>
25#include <stdio.h>
26#include <stdbool.h>
27#include <string.h>
Chia-I Wu46c29dd2014-12-02 21:09:20 +080028#include <assert.h>
Mark Lobodzinski825cc512015-08-14 10:30:30 -060029#include <inttypes.h>
Chia-I Wud4bae362014-07-29 11:15:00 +080030
Ian Elliottea95f5c2015-04-17 21:23:34 -060031#ifdef _WIN32
32#include <Windows.h>
David Pinedo18fb9232015-04-21 14:45:16 -060033#include <fcntl.h>
34#include <io.h>
Ian Elliottea95f5c2015-04-17 21:23:34 -060035#endif
36
Ian Elliott338dedb2015-08-21 15:09:33 -060037#include "vk_ext_khr_swapchain.h"
38#include "vk_ext_khr_device_swapchain.h"
Ian Elliotte36b2082015-07-06 14:27:58 -060039
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060040#include <vulkan.h>
Chia-I Wu46c29dd2014-12-02 21:09:20 +080041
42#define ERR(err) printf("%s:%d: failed with %s\n", \
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060043 __FILE__, __LINE__, vk_result_string(err));
Chia-I Wu46c29dd2014-12-02 21:09:20 +080044
David Pinedo18fb9232015-04-21 14:45:16 -060045#ifdef _WIN32
46
Ian Elliott7c83aa22015-07-08 17:09:54 -060047#define snprintf _snprintf
48
David Pinedo18fb9232015-04-21 14:45:16 -060049bool consoleCreated = false;
50
51#define WAIT_FOR_CONSOLE_DESTROY \
52 do { \
53 if (consoleCreated) \
54 Sleep(INFINITE); \
55 } while (0)
56#else
57 #define WAIT_FOR_CONSOLE_DESTROY
58#endif
59
60
61#define ERR_EXIT(err) \
62 do { \
63 ERR(err); \
64 fflush(stdout); \
65 WAIT_FOR_CONSOLE_DESTROY; \
66 exit(-1); \
67 } while (0)
Chia-I Wu46c29dd2014-12-02 21:09:20 +080068
Tony Barbour22a30862015-04-22 09:02:32 -060069#if defined(NDEBUG) && defined(__GNUC__)
70#define U_ASSERT_ONLY __attribute__((unused))
71#else
72#define U_ASSERT_ONLY
73#endif
74
Chia-I Wu46c29dd2014-12-02 21:09:20 +080075#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
76
77#define MAX_GPUS 8
78
79#define MAX_QUEUE_TYPES 5
Ian Elliott4e19ed02015-04-28 10:52:52 -060080#define APP_SHORT_NAME "vulkaninfo"
Chia-I Wu46c29dd2014-12-02 21:09:20 +080081
82struct app_gpu;
83
84struct app_dev {
85 struct app_gpu *gpu; /* point back to the GPU */
86
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060087 VkDevice obj;
Chia-I Wu46c29dd2014-12-02 21:09:20 +080088
Chia-I Wu46c29dd2014-12-02 21:09:20 +080089
Courtney Goeltzenleuchterab36aa62015-07-12 12:40:29 -060090 VkFormatProperties format_props[VK_FORMAT_NUM];
Chia-I Wu46c29dd2014-12-02 21:09:20 +080091};
92
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -060093struct layer_extension_list {
94 VkLayerProperties layer_properties;
95 uint32_t extension_count;
96 VkExtensionProperties *extension_properties;
97};
98
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -060099struct app_instance {
100 VkInstance instance;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600101 uint32_t global_layer_count;
102 struct layer_extension_list *global_layers;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600103 uint32_t global_extension_count;
104 VkExtensionProperties *global_extensions;
105};
106
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800107struct app_gpu {
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600108 uint32_t id;
Tony Barbour8205d902015-04-16 15:59:00 -0600109 VkPhysicalDevice obj;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800110
Tony Barbour8205d902015-04-16 15:59:00 -0600111 VkPhysicalDeviceProperties props;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800112
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600113 uint32_t queue_count;
Cody Northropef72e2a2015-08-03 17:04:53 -0600114 VkQueueFamilyProperties *queue_props;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600115 VkDeviceQueueCreateInfo *queue_reqs;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800116
Tony Barbour8205d902015-04-16 15:59:00 -0600117 VkPhysicalDeviceMemoryProperties memory_props;
Chris Forbesa048b312015-06-21 20:09:12 +1200118 VkPhysicalDeviceFeatures features;
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600119 VkPhysicalDevice limits;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800120
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600121 uint32_t device_layer_count;
122 struct layer_extension_list *device_layers;
123
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600124 uint32_t device_extension_count;
125 VkExtensionProperties *device_extensions;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800126
127 struct app_dev dev;
128};
129
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600130static const char *vk_result_string(VkResult err)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800131{
132 switch (err) {
133#define STR(r) case r: return #r
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 STR(VK_SUCCESS);
135 STR(VK_UNSUPPORTED);
136 STR(VK_NOT_READY);
137 STR(VK_TIMEOUT);
138 STR(VK_EVENT_SET);
139 STR(VK_EVENT_RESET);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600140 STR(VK_ERROR_INITIALIZATION_FAILED);
Tony Barbour8205d902015-04-16 15:59:00 -0600141 STR(VK_ERROR_OUT_OF_HOST_MEMORY);
142 STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600143 STR(VK_ERROR_DEVICE_LOST);
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600144 STR(VK_ERROR_LAYER_NOT_PRESENT);
145 STR(VK_ERROR_EXTENSION_NOT_PRESENT);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600146 STR(VK_ERROR_MEMORY_MAP_FAILED);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600147 STR(VK_ERROR_INCOMPATIBLE_DRIVER);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800148#undef STR
149 default: return "UNKNOWN_RESULT";
150 }
151}
Chia-I Wud4bae362014-07-29 11:15:00 +0800152
Tony Barbour8205d902015-04-16 15:59:00 -0600153static const char *vk_physical_device_type_string(VkPhysicalDeviceType type)
Chia-I Wud4bae362014-07-29 11:15:00 +0800154{
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800155 switch (type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600156#define STR(r) case VK_PHYSICAL_DEVICE_TYPE_ ##r: return #r
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800157 STR(OTHER);
Tony Barbour8205d902015-04-16 15:59:00 -0600158 STR(INTEGRATED_GPU);
159 STR(DISCRETE_GPU);
160 STR(VIRTUAL_GPU);
Chia-I Wud4bae362014-07-29 11:15:00 +0800161#undef STR
Tony Barbour8205d902015-04-16 15:59:00 -0600162 default: return "UNKNOWN_DEVICE";
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800163 }
Chia-I Wud4bae362014-07-29 11:15:00 +0800164}
165
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600166static const char *vk_format_string(VkFormat fmt)
Chia-I Wud4bae362014-07-29 11:15:00 +0800167{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700168 switch (fmt) {
Tony Barbour8205d902015-04-16 15:59:00 -0600169#define STR(r) case VK_FORMAT_ ##r: return #r
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800170 STR(UNDEFINED);
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700171 STR(R4G4_UNORM);
172 STR(R4G4_USCALED);
173 STR(R4G4B4A4_UNORM);
174 STR(R4G4B4A4_USCALED);
175 STR(R5G6B5_UNORM);
176 STR(R5G6B5_USCALED);
177 STR(R5G5B5A1_UNORM);
178 STR(R5G5B5A1_USCALED);
179 STR(R8_UNORM);
180 STR(R8_SNORM);
181 STR(R8_USCALED);
182 STR(R8_SSCALED);
183 STR(R8_UINT);
184 STR(R8_SINT);
185 STR(R8_SRGB);
186 STR(R8G8_UNORM);
187 STR(R8G8_SNORM);
188 STR(R8G8_USCALED);
189 STR(R8G8_SSCALED);
190 STR(R8G8_UINT);
191 STR(R8G8_SINT);
192 STR(R8G8_SRGB);
193 STR(R8G8B8_UNORM);
194 STR(R8G8B8_SNORM);
195 STR(R8G8B8_USCALED);
196 STR(R8G8B8_SSCALED);
197 STR(R8G8B8_UINT);
198 STR(R8G8B8_SINT);
199 STR(R8G8B8_SRGB);
200 STR(R8G8B8A8_UNORM);
201 STR(R8G8B8A8_SNORM);
202 STR(R8G8B8A8_USCALED);
203 STR(R8G8B8A8_SSCALED);
204 STR(R8G8B8A8_UINT);
205 STR(R8G8B8A8_SINT);
206 STR(R8G8B8A8_SRGB);
207 STR(R10G10B10A2_UNORM);
208 STR(R10G10B10A2_SNORM);
209 STR(R10G10B10A2_USCALED);
210 STR(R10G10B10A2_SSCALED);
211 STR(R10G10B10A2_UINT);
212 STR(R10G10B10A2_SINT);
213 STR(R16_UNORM);
214 STR(R16_SNORM);
215 STR(R16_USCALED);
216 STR(R16_SSCALED);
217 STR(R16_UINT);
218 STR(R16_SINT);
219 STR(R16_SFLOAT);
220 STR(R16G16_UNORM);
221 STR(R16G16_SNORM);
222 STR(R16G16_USCALED);
223 STR(R16G16_SSCALED);
224 STR(R16G16_UINT);
225 STR(R16G16_SINT);
226 STR(R16G16_SFLOAT);
227 STR(R16G16B16_UNORM);
228 STR(R16G16B16_SNORM);
229 STR(R16G16B16_USCALED);
230 STR(R16G16B16_SSCALED);
231 STR(R16G16B16_UINT);
232 STR(R16G16B16_SINT);
233 STR(R16G16B16_SFLOAT);
234 STR(R16G16B16A16_UNORM);
235 STR(R16G16B16A16_SNORM);
236 STR(R16G16B16A16_USCALED);
237 STR(R16G16B16A16_SSCALED);
238 STR(R16G16B16A16_UINT);
239 STR(R16G16B16A16_SINT);
240 STR(R16G16B16A16_SFLOAT);
241 STR(R32_UINT);
242 STR(R32_SINT);
243 STR(R32_SFLOAT);
244 STR(R32G32_UINT);
245 STR(R32G32_SINT);
246 STR(R32G32_SFLOAT);
247 STR(R32G32B32_UINT);
248 STR(R32G32B32_SINT);
249 STR(R32G32B32_SFLOAT);
250 STR(R32G32B32A32_UINT);
251 STR(R32G32B32A32_SINT);
252 STR(R32G32B32A32_SFLOAT);
253 STR(R64_SFLOAT);
254 STR(R64G64_SFLOAT);
255 STR(R64G64B64_SFLOAT);
256 STR(R64G64B64A64_SFLOAT);
257 STR(R11G11B10_UFLOAT);
258 STR(R9G9B9E5_UFLOAT);
259 STR(D16_UNORM);
Courtney Goeltzenleuchter7ed10592015-09-10 17:17:43 -0600260 STR(D24_UNORM_X8);
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700261 STR(D32_SFLOAT);
262 STR(S8_UINT);
263 STR(D16_UNORM_S8_UINT);
264 STR(D24_UNORM_S8_UINT);
265 STR(D32_SFLOAT_S8_UINT);
Courtney Goeltzenleuchterfe8a2e12015-03-03 11:30:36 -0700266 STR(BC1_RGB_UNORM);
267 STR(BC1_RGB_SRGB);
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700268 STR(BC2_UNORM);
269 STR(BC2_SRGB);
270 STR(BC3_UNORM);
271 STR(BC3_SRGB);
272 STR(BC4_UNORM);
273 STR(BC4_SNORM);
274 STR(BC5_UNORM);
275 STR(BC5_SNORM);
276 STR(BC6H_UFLOAT);
277 STR(BC6H_SFLOAT);
278 STR(BC7_UNORM);
279 STR(BC7_SRGB);
280 STR(ETC2_R8G8B8_UNORM);
281 STR(ETC2_R8G8B8A1_UNORM);
282 STR(ETC2_R8G8B8A8_UNORM);
283 STR(EAC_R11_UNORM);
284 STR(EAC_R11_SNORM);
285 STR(EAC_R11G11_UNORM);
286 STR(EAC_R11G11_SNORM);
287 STR(ASTC_4x4_UNORM);
288 STR(ASTC_4x4_SRGB);
Courtney Goeltzenleuchterfe8a2e12015-03-03 11:30:36 -0700289 STR(ASTC_5x4_UNORM);
290 STR(ASTC_5x4_SRGB);
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700291 STR(ASTC_5x5_UNORM);
292 STR(ASTC_5x5_SRGB);
293 STR(ASTC_6x5_UNORM);
294 STR(ASTC_6x5_SRGB);
295 STR(ASTC_6x6_UNORM);
296 STR(ASTC_6x6_SRGB);
297 STR(ASTC_8x5_UNORM);
298 STR(ASTC_8x5_SRGB);
299 STR(ASTC_8x6_UNORM);
300 STR(ASTC_8x6_SRGB);
301 STR(ASTC_8x8_UNORM);
302 STR(ASTC_8x8_SRGB);
303 STR(ASTC_10x5_UNORM);
304 STR(ASTC_10x5_SRGB);
305 STR(ASTC_10x6_UNORM);
306 STR(ASTC_10x6_SRGB);
307 STR(ASTC_10x8_UNORM);
308 STR(ASTC_10x8_SRGB);
309 STR(ASTC_10x10_UNORM);
310 STR(ASTC_10x10_SRGB);
311 STR(ASTC_12x10_UNORM);
312 STR(ASTC_12x10_SRGB);
313 STR(ASTC_12x12_UNORM);
314 STR(ASTC_12x12_SRGB);
315 STR(B5G6R5_UNORM);
316 STR(B5G6R5_USCALED);
317 STR(B8G8R8_UNORM);
318 STR(B8G8R8_SNORM);
319 STR(B8G8R8_USCALED);
320 STR(B8G8R8_SSCALED);
321 STR(B8G8R8_UINT);
322 STR(B8G8R8_SINT);
323 STR(B8G8R8_SRGB);
324 STR(B8G8R8A8_UNORM);
325 STR(B8G8R8A8_SNORM);
326 STR(B8G8R8A8_USCALED);
327 STR(B8G8R8A8_SSCALED);
328 STR(B8G8R8A8_UINT);
329 STR(B8G8R8A8_SINT);
330 STR(B8G8R8A8_SRGB);
331 STR(B10G10R10A2_UNORM);
332 STR(B10G10R10A2_SNORM);
333 STR(B10G10R10A2_USCALED);
334 STR(B10G10R10A2_SSCALED);
335 STR(B10G10R10A2_UINT);
336 STR(B10G10R10A2_SINT);
Chia-I Wud4bae362014-07-29 11:15:00 +0800337#undef STR
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700338 default: return "UNKNOWN_FORMAT";
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800339 }
Chia-I Wud4bae362014-07-29 11:15:00 +0800340}
341
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800342static void app_dev_init_formats(struct app_dev *dev)
343{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600344 VkFormat f;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800345
Courtney Goeltzenleuchterab36aa62015-07-12 12:40:29 -0600346 for (f = 0; f < VK_FORMAT_NUM; f++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600347 const VkFormat fmt = f;
348 VkResult err;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800349
Courtney Goeltzenleuchter4da96aa2015-07-12 12:52:09 -0600350 err = vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, &dev->format_props[f]);
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700351 if (err) {
352 memset(&dev->format_props[f], 0,
353 sizeof(dev->format_props[f]));
354 }
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800355 }
356}
357
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600358static void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch)
359{
360 *major = version >> 22;
361 *minor = (version >> 12) & 0x3ff;
362 *patch = version & 0xfff;
363}
364
365static void app_get_physical_device_layer_extensions(
366 struct app_gpu *gpu,
367 char *layer_name,
368 uint32_t *extension_count,
369 VkExtensionProperties **extension_properties)
370{
371 VkResult err;
372 uint32_t ext_count = 0;
373 VkExtensionProperties *ext_ptr = NULL;
374
375 /* repeat get until VK_INCOMPLETE goes away */
376 do {
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600377 err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, NULL);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600378 assert(!err);
379
380 if (ext_ptr) {
381 free(ext_ptr);
382 }
383 ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties));
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600384 err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, ext_ptr);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600385 } while (err == VK_INCOMPLETE);
386 assert(!err);
387
388 *extension_count = ext_count;
389 *extension_properties = ext_ptr;
390}
391
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800392static void app_dev_init(struct app_dev *dev, struct app_gpu *gpu)
393{
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600394 VkDeviceCreateInfo info = {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600395 .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800396 .pNext = NULL,
397 .queueRecordCount = 0,
398 .pRequestedQueues = NULL,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600399 .layerCount = 0,
400 .ppEnabledLayerNames = NULL,
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800401 .extensionCount = 0,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600402 .ppEnabledExtensionNames = NULL,
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800403 };
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600404 VkResult U_ASSERT_ONLY err;
405 // Extensions to enable
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600406 static const char *known_extensions[] = {
Ian Elliott338dedb2015-08-21 15:09:33 -0600407 VK_EXT_KHR_DEVICE_SWAPCHAIN_EXTENSION_NAME,
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600408 };
Tony Barbour426b9052015-06-24 16:06:58 -0600409
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600410 uint32_t count = 0;
411
412 /* Scan layers */
413 VkLayerProperties *device_layer_properties = NULL;
414 struct layer_extension_list *device_layers = NULL;
415
416 do {
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600417 err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, NULL);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600418 assert(!err);
419
420 if (device_layer_properties) {
421 free(device_layer_properties);
422 }
423 device_layer_properties = malloc(sizeof(VkLayerProperties) * count);
424 assert(device_layer_properties);
425
426 if (device_layers) {
427 free(device_layers);
428 }
429 device_layers = malloc(sizeof(struct layer_extension_list) * count);
430 assert(device_layers);
431
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600432 err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, device_layer_properties);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600433 } while (err == VK_INCOMPLETE);
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600434 assert(!err);
435
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600436 gpu->device_layer_count = count;
437 gpu->device_layers = device_layers;
438
439 for (uint32_t i = 0; i < gpu->device_layer_count; i++) {
440 VkLayerProperties *src_info = &device_layer_properties[i];
441 struct layer_extension_list *dst_info = &gpu->device_layers[i];
442 memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties));
443
444 /* Save away layer extension info for report */
445 app_get_physical_device_layer_extensions(
446 gpu,
447 src_info->layerName,
448 &dst_info->extension_count,
449 &dst_info->extension_properties);
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600450 }
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600451 free(device_layer_properties);
452
453 app_get_physical_device_layer_extensions(
454 gpu,
455 NULL,
456 &gpu->device_extension_count,
457 &gpu->device_extensions);
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600458
Courtney Goeltzenleuchter9e42b882015-06-25 16:24:36 -0600459 fflush(stdout);
460
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600461 uint32_t enabled_extension_count = 0;
Courtney Goeltzenleuchter67a07412015-07-10 10:10:27 -0600462 uint32_t known_extension_count = ARRAY_SIZE(known_extensions);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600463
Courtney Goeltzenleuchter67a07412015-07-10 10:10:27 -0600464 for (uint32_t i = 0; i < known_extension_count; i++) {
Courtney Goeltzenleuchter1f41f542015-07-09 11:44:38 -0600465 VkBool32 extension_found = 0;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600466 for (uint32_t j = 0; j < gpu->device_extension_count; j++) {
467 VkExtensionProperties *ext_prop = &gpu->device_extensions[j];
468 if (!strcmp(known_extensions[i], ext_prop->extName)) {
469
470 extension_found = 1;
471 enabled_extension_count++;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600472 }
473 }
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600474 if (!extension_found) {
475 printf("Cannot find extension: %s\n", known_extensions[i]);
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600476 ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600477 }
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600478 }
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800479
480 /* request all queues */
481 info.queueRecordCount = gpu->queue_count;
482 info.pRequestedQueues = gpu->queue_reqs;
483
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600484 info.layerCount = 0;
485 info.ppEnabledLayerNames = NULL;
486 info.extensionCount = enabled_extension_count;
487 info.ppEnabledExtensionNames = (const char*const*) known_extensions;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600488 dev->gpu = gpu;
489 err = vkCreateDevice(gpu->obj, &info, &dev->obj);
490 if (err)
491 ERR_EXIT(err);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800492
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800493}
494
495static void app_dev_destroy(struct app_dev *dev)
496{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600497 vkDestroyDevice(dev->obj);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800498}
499
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600500static void app_get_global_layer_extensions(
501 char *layer_name,
502 uint32_t *extension_count,
503 VkExtensionProperties **extension_properties)
504{
505 VkResult err;
506 uint32_t ext_count = 0;
507 VkExtensionProperties *ext_ptr = NULL;
508
509 /* repeat get until VK_INCOMPLETE goes away */
510 do {
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600511 err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, NULL);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600512 assert(!err);
513
514 if (ext_ptr) {
515 free(ext_ptr);
516 }
517 ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties));
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600518 err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, ext_ptr);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600519 } while (err == VK_INCOMPLETE);
520 assert(!err);
521
522 *extension_count = ext_count;
523 *extension_properties = ext_ptr;
524}
525
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600526static void app_create_instance(struct app_instance *inst)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800527{
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600528 const VkApplicationInfo app_info = {
529 .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
530 .pNext = NULL,
531 .pAppName = APP_SHORT_NAME,
532 .appVersion = 1,
533 .pEngineName = APP_SHORT_NAME,
534 .engineVersion = 1,
535 .apiVersion = VK_API_VERSION,
536 };
537 VkInstanceCreateInfo inst_info = {
538 .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
539 .pNext = NULL,
540 .pAppInfo = &app_info,
541 .pAllocCb = NULL,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600542 .layerCount = 0,
543 .ppEnabledLayerNames = NULL,
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600544 .extensionCount = 0,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600545 .ppEnabledExtensionNames = NULL,
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600546 };
Tony Barbour22a30862015-04-22 09:02:32 -0600547 VkResult U_ASSERT_ONLY err;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600548 // Global Extensions to enable
Ian Elliottaae1a572015-02-04 16:48:37 -0700549 static char *known_extensions[] = {
Ian Elliott338dedb2015-08-21 15:09:33 -0600550 "VK_EXT_KHR_swapchain",
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800551 };
Tony Barbour426b9052015-06-24 16:06:58 -0600552
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600553 uint32_t global_extension_count = 0;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600554 uint32_t count = 0;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600555
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600556 /* Scan layers */
557 VkLayerProperties *global_layer_properties = NULL;
558 struct layer_extension_list *global_layers = NULL;
559
560 do {
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600561 err = vkEnumerateInstanceLayerProperties(&count, NULL);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600562 assert(!err);
563
564 if (global_layer_properties) {
565 free(global_layer_properties);
566 }
567 global_layer_properties = malloc(sizeof(VkLayerProperties) * count);
568 assert(global_layer_properties);
569
570 if (global_layers) {
571 free(global_layers);
572 }
573 global_layers = malloc(sizeof(struct layer_extension_list) * count);
574 assert(global_layers);
575
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600576 err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600577 } while (err == VK_INCOMPLETE);
Tobin Ehlis3536b442015-04-16 18:04:57 -0600578 assert(!err);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800579
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600580 inst->global_layer_count = count;
581 inst->global_layers = global_layers;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600582
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600583 for (uint32_t i = 0; i < inst->global_layer_count; i++) {
584 VkLayerProperties *src_info = &global_layer_properties[i];
585 struct layer_extension_list *dst_info = &inst->global_layers[i];
586 memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties));
587
588 /* Save away layer extension info for report */
589 app_get_global_layer_extensions(
590 src_info->layerName,
591 &dst_info->extension_count,
592 &dst_info->extension_properties);
593 }
594 free(global_layer_properties);
595
596 /* Collect global extensions */
597 inst->global_extension_count = 0;
598 app_get_global_layer_extensions(
599 NULL,
600 &inst->global_extension_count,
601 &inst->global_extensions);
602
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600603 for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) {
Courtney Goeltzenleuchter1f41f542015-07-09 11:44:38 -0600604 VkBool32 extension_found = 0;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600605 for (uint32_t j = 0; j < inst->global_extension_count; j++) {
606 VkExtensionProperties *extension_prop = &inst->global_extensions[j];
607 if (!strcmp(known_extensions[i], extension_prop->extName)) {
608
609 extension_found = 1;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600610 global_extension_count++;
611 }
Tobin Ehlis3536b442015-04-16 18:04:57 -0600612 }
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600613 if (!extension_found) {
614 printf("Cannot find extension: %s\n", known_extensions[i]);
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600615 ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600616 }
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800617 }
618
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600619 inst_info.extensionCount = global_extension_count;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600620 inst_info.ppEnabledExtensionNames = (const char * const *) known_extensions;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800621
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600622 err = vkCreateInstance(&inst_info, &inst->instance);
623 if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
624 printf("Cannot create Vulkan instance.\n");
625 ERR_EXIT(err);
626 } else if (err) {
627 ERR_EXIT(err);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800628 }
629}
630
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600631static void app_destroy_instance(struct app_instance *inst)
632{
633 free(inst->global_extensions);
634 vkDestroyInstance(inst->instance);
635}
636
637
Tony Barbour8205d902015-04-16 15:59:00 -0600638static void app_gpu_init(struct app_gpu *gpu, uint32_t id, VkPhysicalDevice obj)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800639{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600640 VkResult err;
Ian Elliottaae1a572015-02-04 16:48:37 -0700641 uint32_t i;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800642
643 memset(gpu, 0, sizeof(*gpu));
644
645 gpu->id = id;
646 gpu->obj = obj;
Tony Barbour426b9052015-06-24 16:06:58 -0600647
648 err = vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props);
649 if (err)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800650 ERR_EXIT(err);
651
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800652 /* get queue count */
Cody Northropef72e2a2015-08-03 17:04:53 -0600653 err = vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL);
Tony Barbour426b9052015-06-24 16:06:58 -0600654 if (err)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800655 ERR_EXIT(err);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800656
657 gpu->queue_props =
658 malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count);
Tony Barbour426b9052015-06-24 16:06:58 -0600659
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800660 if (!gpu->queue_props)
Tony Barbour8205d902015-04-16 15:59:00 -0600661 ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
Cody Northropef72e2a2015-08-03 17:04:53 -0600662 err = vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, gpu->queue_props);
Tony Barbour426b9052015-06-24 16:06:58 -0600663 if (err)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800664 ERR_EXIT(err);
665
666 /* set up queue requests */
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800667 gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count);
668 if (!gpu->queue_reqs)
Tony Barbour8205d902015-04-16 15:59:00 -0600669 ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800670 for (i = 0; i < gpu->queue_count; i++) {
Courtney Goeltzenleuchterea975642015-09-16 16:23:55 -0600671 gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
672 gpu->queue_reqs[i].pNext = NULL;
Chris Forbesfa6d36e2015-07-11 19:11:39 +1200673 gpu->queue_reqs[i].queueFamilyIndex = i;
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800674 gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount;
675 }
676
Tony Barbour426b9052015-06-24 16:06:58 -0600677 err = vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props);
678 if (err)
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800679 ERR_EXIT(err);
680
Chris Forbesa048b312015-06-21 20:09:12 +1200681 err = vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features);
682 if (err)
683 ERR_EXIT(err);
684
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800685 app_dev_init(&gpu->dev, gpu);
686 app_dev_init_formats(&gpu->dev);
687}
688
689static void app_gpu_destroy(struct app_gpu *gpu)
690{
691 app_dev_destroy(&gpu->dev);
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600692 free(gpu->device_extensions);
Chia-I Wu46c29dd2014-12-02 21:09:20 +0800693 free(gpu->queue_reqs);
694 free(gpu->queue_props);
695}
696
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600697static void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt)
Chia-I Wud4bae362014-07-29 11:15:00 +0800698{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600699 const VkFormatProperties *props = &dev->format_props[fmt];
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800700 struct {
701 const char *name;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600702 VkFlags flags;
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600703 } features[3];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600704 uint32_t i;
Chia-I Wud4bae362014-07-29 11:15:00 +0800705
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600706 features[0].name = "linearTiling FormatFeatureFlags";
707 features[0].flags = props->linearTilingFeatures;
708 features[1].name = "optimalTiling FormatFeatureFlags";
709 features[1].flags = props->optimalTilingFeatures;
710 features[2].name = "bufferFeatures FormatFeatureFlags";
711 features[2].flags = props->bufferFeatures;
Chia-I Wud4bae362014-07-29 11:15:00 +0800712
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600713 printf("\nFORMAT_%s:", vk_format_string(fmt));
714 for (i = 0; i < ARRAY_SIZE(features); i++) {
715 printf("\n\t%s:", features[i].name);
716 if (features[i].flags == 0) {
717 printf("\n\t\tNone");
718 } else {
Courtney Goeltzenleuchter75295792015-09-10 16:25:49 -0600719 printf("%s%s%s%s%s%s%s%s%s%s%s%s",
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600720 ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""),
721 ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""),
722 ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""),
723 ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""),
724 ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""),
725 ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""),
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600726 ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SOURCE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SOURCE_BIT" : ""),
727 ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DESTINATION_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DESTINATION_BIT" : ""),
728 ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""),
729 ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""),
730 ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""),
731 ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : ""));
732 }
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800733 }
Mark Lobodzinski4b36dd42015-09-03 15:21:52 -0600734 printf("\n");
Chia-I Wud4bae362014-07-29 11:15:00 +0800735}
736
Chia-I Wud4bae362014-07-29 11:15:00 +0800737
738static void
739app_dev_dump(const struct app_dev *dev)
740{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600741 VkFormat fmt;
Chia-I Wud4bae362014-07-29 11:15:00 +0800742
Courtney Goeltzenleuchterab36aa62015-07-12 12:40:29 -0600743 for (fmt = 0; fmt < VK_FORMAT_NUM; fmt++) {
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700744 app_dev_dump_format_props(dev, fmt);
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800745 }
Chia-I Wud4bae362014-07-29 11:15:00 +0800746}
747
Mike Stroyan009d8ca2015-05-27 13:09:15 -0600748#ifdef _WIN32
749#define PRINTF_SIZE_T_SPECIFIER "%Iu"
750#else
751#define PRINTF_SIZE_T_SPECIFIER "%zu"
752#endif
753
Chris Forbesa048b312015-06-21 20:09:12 +1200754static void app_gpu_dump_features(const struct app_gpu *gpu)
755{
756 const VkPhysicalDeviceFeatures *features = &gpu->features;
757
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600758 printf("VkPhysicalDeviceFeatures:\n");
759 printf("=========================\n");
760
761 printf("\trobustBufferAccess = %u\n", features->robustBufferAccess );
762 printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 );
763 printf("\timageCubeArray = %u\n", features->imageCubeArray );
764 printf("\tindependentBlend = %u\n", features->independentBlend );
765 printf("\tgeometryShader = %u\n", features->geometryShader );
766 printf("\ttessellationShader = %u\n", features->tessellationShader );
767 printf("\tsampleRateShading = %u\n", features->sampleRateShading );
768 printf("\tdualSourceBlend = %u\n", features->dualSourceBlend );
769 printf("\tlogicOp = %u\n", features->logicOp );
770 printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect );
Courtney Goeltzenleuchterc0f9fa72015-10-15 12:57:38 -0600771 printf("\tdepthClip = %u\n", features->depthClamp );
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600772 printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp );
773 printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid );
774 printf("\tdepthBounds = %u\n", features->depthBounds );
775 printf("\twideLines = %u\n", features->wideLines );
776 printf("\tlargePoints = %u\n", features->largePoints );
777 printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 );
778 printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR );
779 printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC );
780 printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery );
781 printf("\tvertexSideEffects = %u\n", features->vertexSideEffects );
782 printf("\ttessellationSideEffects = %u\n", features->tessellationSideEffects );
783 printf("\tgeometrySideEffects = %u\n", features->geometrySideEffects );
784 printf("\tfragmentSideEffects = %u\n", features->fragmentSideEffects );
785 printf("\tshaderTessellationPointSize = %u\n", features->shaderTessellationPointSize );
786 printf("\tshaderGeometryPointSize = %u\n", features->shaderGeometryPointSize );
787 printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended );
788 printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats );
789 printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample );
790 printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing);
791 printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing );
792 printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing);
793 printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing );
794 printf("\tshaderClipDistance = %u\n", features->shaderClipDistance );
795 printf("\tshaderCullDistance = %u\n", features->shaderCullDistance );
796 printf("\tshaderFloat64 = %u\n", features->shaderFloat64 );
797 printf("\tshaderInt64 = %u\n", features->shaderInt64 );
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600798 printf("\tshaderInt16 = %u\n", features->shaderInt16 );
799 printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency );
800 printf("\tshaderResourceMinLOD = %u\n", features->shaderResourceMinLOD );
801 printf("\talphaToOne = %u\n", features->alphaToOne );
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600802 printf("\tsparseBinding = %u\n", features->sparseBinding );
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600803 printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer );
804 printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D );
805 printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D );
806 printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples );
807 printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples );
808 printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples );
809 printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples );
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600810 printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased );
Chris Forbesa048b312015-06-21 20:09:12 +1200811}
812
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600813static void app_dump_sparse_props(const VkPhysicalDeviceSparseProperties *sparseProps)
Chris Forbesa048b312015-06-21 20:09:12 +1200814{
Chris Forbesa048b312015-06-21 20:09:12 +1200815
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600816 printf("\tVkPhysicalDeviceSparseProperties:\n");
817 printf("\t---------------------------------\n");
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600818
Courtney Goeltzenleuchter00c8c982015-09-10 12:54:32 -0600819 printf("\t\tresidencyStandard2DBlockShape = %u\n", sparseProps->residencyStandard2DBlockShape );
820 printf("\t\tresidencyStandard2DMSBlockShape = %u\n", sparseProps->residencyStandard2DMSBlockShape );
821 printf("\t\tresidencyStandard3DBlockShape = %u\n", sparseProps->residencyStandard3DBlockShape );
822 printf("\t\tresidencyAlignedMipSize = %u\n", sparseProps->residencyAlignedMipSize );
823 printf("\t\tresidencyNonResident = %u\n", sparseProps->residencyNonResident );
824 printf("\t\tresidencyNonResidentStrict = %u\n", sparseProps->residencyNonResidentStrict );
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600825}
826
827static void app_dump_limits(const VkPhysicalDeviceLimits *limits)
828{
829 printf("\tVkPhysicalDeviceLimits:\n");
830 printf("\t-----------------------\n");
831
832 printf("\t\tmaxImageDimension1D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension1D );
833 printf("\t\tmaxImageDimension2D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension2D );
834 printf("\t\tmaxImageDimension3D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension3D );
835 printf("\t\tmaxImageDimensionCube = 0x%" PRIxLEAST32 "\n", limits->maxImageDimensionCube );
836 printf("\t\tmaxImageArrayLayers = 0x%" PRIxLEAST32 "\n", limits->maxImageArrayLayers );
837 printf("\t\tmaxTexelBufferSize = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferSize );
838 printf("\t\tmaxUniformBufferSize = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferSize );
839 printf("\t\tmaxStorageBufferSize = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferSize );
840 printf("\t\tmaxPushConstantsSize = 0x%" PRIxLEAST32 "\n", limits->maxPushConstantsSize );
841 printf("\t\tmaxMemoryAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxMemoryAllocationCount );
842 printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity );
843 printf("\t\tmaxBoundDescriptorSets = 0x%" PRIxLEAST32 "\n", limits->maxBoundDescriptorSets );
844 printf("\t\tmaxDescriptorSets = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSets );
845 printf("\t\tmaxPerStageDescriptorSamplers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSamplers );
846 printf("\t\tmaxPerStageDescriptorUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorUniformBuffers );
847 printf("\t\tmaxPerStageDescriptorStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageBuffers );
848 printf("\t\tmaxPerStageDescriptorSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSampledImages );
849 printf("\t\tmaxPerStageDescriptorStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageImages );
850 printf("\t\tmaxDescriptorSetSamplers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSamplers );
851 printf("\t\tmaxDescriptorSetUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffers );
852 printf("\t\tmaxDescriptorSetStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffers );
853 printf("\t\tmaxDescriptorSetSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSampledImages );
854 printf("\t\tmaxDescriptorSetStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageImages );
855 printf("\t\tmaxVertexInputAttributes = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributes );
856 printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset );
857 printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride );
858 printf("\t\tmaxVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxVertexOutputComponents );
859 printf("\t\tmaxTessGenLevel = 0x%" PRIxLEAST32 "\n", limits->maxTessGenLevel );
860 printf("\t\tmaxTessPatchSize = 0x%" PRIxLEAST32 "\n", limits->maxTessPatchSize );
861 printf("\t\tmaxTessControlPerVertexInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessControlPerVertexInputComponents );
862 printf("\t\tmaxTessControlPerVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessControlPerVertexOutputComponents);
863 printf("\t\tmaxTessControlPerPatchOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessControlPerPatchOutputComponents );
864 printf("\t\tmaxTessControlTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessControlTotalOutputComponents );
865 printf("\t\tmaxTessEvaluationInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessEvaluationInputComponents );
866 printf("\t\tmaxTessEvaluationOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessEvaluationOutputComponents );
867 printf("\t\tmaxGeometryShaderInvocations = 0x%" PRIxLEAST32 "\n", limits->maxGeometryShaderInvocations );
868 printf("\t\tmaxGeometryInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryInputComponents );
869 printf("\t\tmaxGeometryOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputComponents );
870 printf("\t\tmaxGeometryOutputVertices = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputVertices );
871 printf("\t\tmaxGeometryTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryTotalOutputComponents );
872 printf("\t\tmaxFragmentInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxFragmentInputComponents );
873 printf("\t\tmaxFragmentOutputBuffers = 0x%" PRIxLEAST32 "\n", limits->maxFragmentOutputBuffers );
874 printf("\t\tmaxFragmentDualSourceBuffers = 0x%" PRIxLEAST32 "\n", limits->maxFragmentDualSourceBuffers );
875 printf("\t\tmaxFragmentCombinedOutputResources = 0x%" PRIxLEAST32 "\n", limits->maxFragmentCombinedOutputResources );
876 printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize );
877 printf("\t\tmaxComputeWorkGroupCount[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[0] );
878 printf("\t\tmaxComputeWorkGroupCount[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[1] );
879 printf("\t\tmaxComputeWorkGroupCount[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[2] );
880 printf("\t\tmaxComputeWorkGroupInvocations = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupInvocations );
881 printf("\t\tmaxComputeWorkGroupSize[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[0] );
882 printf("\t\tmaxComputeWorkGroupSize[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[1] );
883 printf("\t\tmaxComputeWorkGroupSize[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[2] );
884 printf("\t\tsubPixelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subPixelPrecisionBits );
885 printf("\t\tsubTexelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subTexelPrecisionBits );
886 printf("\t\tmipmapPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->mipmapPrecisionBits );
887 printf("\t\tmaxDrawIndexedIndexValue = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndexedIndexValue );
888 printf("\t\tmaxDrawIndirectInstanceCount = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndirectInstanceCount );
889 printf("\t\tprimitiveRestartForPatches = 0x%" PRIxLEAST32 "\n", limits->primitiveRestartForPatches );
890 printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias );
891 printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy );
892 printf("\t\tmaxViewports = 0x%" PRIxLEAST32 "\n", limits->maxViewports );
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600893 printf("\t\tmaxViewportDimensions[0] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[0] );
894 printf("\t\tmaxViewportDimensions[1] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[1] );
895 printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] );
896 printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] );
897 printf("\t\tviewportSubPixelBits = 0x%" PRIxLEAST32 "\n", limits->viewportSubPixelBits );
898 printf("\t\tminMemoryMapAlignment = 0x%" PRIxLEAST32 "\n", limits->minMemoryMapAlignment );
899 printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST32 "\n", limits->minTexelBufferOffsetAlignment );
900 printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST32 "\n", limits->minUniformBufferOffsetAlignment );
901 printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST32 "\n", limits->minStorageBufferOffsetAlignment );
902 printf("\t\tminTexelOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset );
903 printf("\t\tmaxTexelOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset );
904 printf("\t\tminTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset );
905 printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset );
906 printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset );
907 printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset );
908 printf("\t\tsubPixelInterpolationOffsetBits = 0x%" PRIxLEAST32 "\n", limits->subPixelInterpolationOffsetBits );
909 printf("\t\tmaxFramebufferWidth = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferWidth );
910 printf("\t\tmaxFramebufferHeight = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferHeight );
911 printf("\t\tmaxFramebufferLayers = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferLayers );
912 printf("\t\tmaxFramebufferColorSamples = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferColorSamples );
913 printf("\t\tmaxFramebufferDepthSamples = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferDepthSamples );
914 printf("\t\tmaxFramebufferStencilSamples = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferStencilSamples );
915 printf("\t\tmaxColorAttachments = 0x%" PRIxLEAST32 "\n", limits->maxColorAttachments );
916 printf("\t\tmaxSampledImageColorSamples = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageColorSamples );
917 printf("\t\tmaxSampledImageDepthSamples = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageDepthSamples );
918 printf("\t\tmaxSampledImageIntegerSamples = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageIntegerSamples );
919 printf("\t\tmaxStorageImageSamples = 0x%" PRIxLEAST32 "\n", limits->maxStorageImageSamples );
920 printf("\t\tmaxSampleMaskWords = 0x%" PRIxLEAST32 "\n", limits->maxSampleMaskWords );
921 printf("\t\ttimestampFrequency = 0x%" PRIxLEAST64 "\n", limits->timestampFrequency );
922 printf("\t\tmaxClipDistances = 0x%" PRIxLEAST32 "\n", limits->maxClipDistances );
923 printf("\t\tmaxCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCullDistances );
924 printf("\t\tmaxCombinedClipAndCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCombinedClipAndCullDistances );
925 printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] );
926 printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] );
927 printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] );
928 printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] );
929 printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity );
930 printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity );
Chia-I Wud4bae362014-07-29 11:15:00 +0800931}
932
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600933static void app_gpu_dump_props(const struct app_gpu *gpu)
934{
935 const VkPhysicalDeviceProperties *props = &gpu->props;
936
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600937 printf("VkPhysicalDeviceProperties:\n");
938 printf("===========================\n");
939 printf("\tapiVersion = %u\n", props->apiVersion);
940 printf("\tdriverVersion = %u\n", props->driverVersion);
941 printf("\tvendorId = 0x%04x\n", props->vendorId);
942 printf("\tdeviceId = 0x%04x\n", props->deviceId);
943 printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType));
944 printf("\tdeviceName = %s\n", props->deviceName);
Mark Lobodzinski7dae6862015-09-07 12:56:17 -0600945
946 app_dump_limits(&gpu->props.limits);
947 app_dump_sparse_props(&gpu->props.sparseProperties);
948
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600949 fflush(stdout);
950}
951
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600952static void app_dump_extensions(
953 const char *indent,
954 const char *layer_name,
955 const uint32_t extension_count,
956 const VkExtensionProperties *extension_properties)
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600957{
958 uint32_t i;
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600959 if (layer_name && (strlen(layer_name) > 0)) {
960 printf("%s%s Extensions", indent, layer_name);
961 } else {
962 printf("Extensions");
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600963 }
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600964 printf("\tcount = %d\n", extension_count);
965 for (i=0; i< extension_count; i++) {
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600966 VkExtensionProperties const *ext_prop = &extension_properties[i];
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -0600967
Courtney Goeltzenleuchterff87c822014-10-03 18:05:10 -0600968 if (i>0)
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600969 printf("\n"); // separator between extensions
970
971 printf("%s\t", indent);
Ian Elliottd5b6e892015-09-04 14:14:35 -0600972 printf("%-32s: extension revision %2d",
973 ext_prop->extName, ext_prop->specVersion);
Courtney Goeltzenleuchterff87c822014-10-03 18:05:10 -0600974 }
975 printf("\n");
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600976 fflush(stdout);
Courtney Goeltzenleuchterff87c822014-10-03 18:05:10 -0600977}
978
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600979static void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id)
Chia-I Wud4bae362014-07-29 11:15:00 +0800980{
Cody Northropef72e2a2015-08-03 17:04:53 -0600981 const VkQueueFamilyProperties *props = &gpu->queue_props[id];
Chia-I Wud4bae362014-07-29 11:15:00 +0800982
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600983 printf("VkQueueFamilyProperties[%d]:\n", id);
984 printf("============================\n");
985 printf("\tqueueFlags = %c%c%c%c\n",
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600986 (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.',
987 (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.',
988 (props->queueFlags & VK_QUEUE_DMA_BIT) ? 'D' : '.',
989 (props->queueFlags & VK_QUEUE_EXTENDED_BIT) ? 'X' : '.');
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600990 printf("\tqueueCount = %u\n", props->queueCount);
Chia-I Wu190ebdc2014-08-06 12:04:13 +0800991 printf("\tsupportsTimestamps = %u\n", props->supportsTimestamps);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600992 fflush(stdout);
Chia-I Wud4bae362014-07-29 11:15:00 +0800993}
994
995static void app_gpu_dump_memory_props(const struct app_gpu *gpu)
996{
Tony Barbour8205d902015-04-16 15:59:00 -0600997 const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props;
Chia-I Wud4bae362014-07-29 11:15:00 +0800998
Mark Lobodzinski825cc512015-08-14 10:30:30 -0600999 printf("VkPhysicalDeviceMemoryProperties:\n");
1000 printf("=================================\n");
1001 printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount);
Mark Lobodzinski72346292015-07-02 16:49:40 -06001002 for (uint32_t i = 0; i < props->memoryTypeCount; i++) {
1003 printf("\tmemoryTypes[%u] : \n", i);
1004 printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags);
1005 printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex);
1006 }
Mark Lobodzinski825cc512015-08-14 10:30:30 -06001007 printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount);
Mark Lobodzinski72346292015-07-02 16:49:40 -06001008 for (uint32_t i = 0; i < props->memoryHeapCount; i++) {
1009 printf("\tmemoryHeaps[%u] : \n", i);
Mark Lobodzinski825cc512015-08-14 10:30:30 -06001010 printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", props->memoryHeaps[i].size);
Mark Lobodzinski72346292015-07-02 16:49:40 -06001011 }
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001012 fflush(stdout);
Chia-I Wud4bae362014-07-29 11:15:00 +08001013}
1014
1015static void app_gpu_dump(const struct app_gpu *gpu)
1016{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001017 uint32_t i;
Chia-I Wuf5c46f42014-08-05 15:33:40 +08001018
Mark Lobodzinski825cc512015-08-14 10:30:30 -06001019 printf("Device Extensions and layers:\n");
1020 printf("=============================\n");
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001021 printf("GPU%u\n", gpu->id);
1022 app_gpu_dump_props(gpu);
1023 printf("\n");
Mark Lobodzinski825cc512015-08-14 10:30:30 -06001024 app_dump_extensions("", "Device", gpu->device_extension_count, gpu->device_extensions);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001025 printf("\n");
1026 printf("Layers\tcount = %d\n", gpu->device_layer_count);
1027 for (uint32_t i = 0; i < gpu->device_layer_count; i++) {
1028 uint32_t major, minor, patch;
1029 char spec_version[64], layer_version[64];
1030 struct layer_extension_list const *layer_info = &gpu->device_layers[i];
1031
1032 extract_version(layer_info->layer_properties.specVersion, &major, &minor, &patch);
1033 snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch);
1034 extract_version(layer_info->layer_properties.implVersion, &major, &minor, &patch);
1035 snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch);
1036 printf("\t%s (%s) Vulkan version %s, layer version %s\n",
1037 layer_info->layer_properties.layerName,
Ian Elliott3f26dee2015-07-13 11:09:59 -06001038 (char*) layer_info->layer_properties.description,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001039 spec_version, layer_version);
1040
1041 app_dump_extensions("\t",
1042 layer_info->layer_properties.layerName,
1043 layer_info->extension_count,
1044 layer_info->extension_properties);
1045 fflush(stdout);
1046 }
Courtney Goeltzenleuchterff87c822014-10-03 18:05:10 -06001047 printf("\n");
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001048 for (i = 0; i < gpu->queue_count; i++) {
1049 app_gpu_dump_queue_props(gpu, i);
1050 printf("\n");
1051 }
1052 app_gpu_dump_memory_props(gpu);
1053 printf("\n");
Chris Forbesa048b312015-06-21 20:09:12 +12001054 app_gpu_dump_features(gpu);
1055 printf("\n");
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001056 app_dev_dump(&gpu->dev);
Chia-I Wud4bae362014-07-29 11:15:00 +08001057}
1058
Chia-I Wud4bae362014-07-29 11:15:00 +08001059int main(int argc, char **argv)
1060{
David Pinedo7b4e9ec2015-10-19 15:22:28 -06001061 unsigned int major, minor, patch;
1062 struct app_gpu gpus[MAX_GPUS];
Tony Barbour8205d902015-04-16 15:59:00 -06001063 VkPhysicalDevice objs[MAX_GPUS];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001064 uint32_t gpu_count, i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001065 VkResult err;
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -06001066 struct app_instance inst;
Chia-I Wud4bae362014-07-29 11:15:00 +08001067
David Pinedo7b4e9ec2015-10-19 15:22:28 -06001068 major = VK_API_VERSION >> 22;
1069 minor = (VK_API_VERSION >> 12) & 0x4ff;
1070 patch = VK_API_VERSION & 0xfff;
1071 printf("===========\n");
David Pinedob5ec4c22015-10-19 15:15:34 -06001072 printf("VULKAN INFO\n");
1073 printf("===========\n\n");
1074 printf("Vulkan API Version: %d %d %d\n\n", major, minor, patch);
1075
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -06001076 app_create_instance(&inst);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001077
Mark Lobodzinski825cc512015-08-14 10:30:30 -06001078 printf("Instance Extensions and layers:\n");
1079 printf("===============================\n");
1080 app_dump_extensions("", "Instance", inst.global_extension_count, inst.global_extensions);
1081
1082 printf("Instance Layers\tcount = %d\n", inst.global_layer_count);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001083 for (uint32_t i = 0; i < inst.global_layer_count; i++) {
1084 uint32_t major, minor, patch;
1085 char spec_version[64], layer_version[64];
1086 VkLayerProperties const *layer_prop = &inst.global_layers[i].layer_properties;
1087
1088 extract_version(layer_prop->specVersion, &major, &minor, &patch);
1089 snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch);
1090 extract_version(layer_prop->implVersion, &major, &minor, &patch);
1091 snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch);
1092 printf("\t%s (%s) Vulkan version %s, layer version %s\n",
Ian Elliott3f26dee2015-07-13 11:09:59 -06001093 layer_prop->layerName, (char*) layer_prop->description, spec_version, layer_version);
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -06001094
1095 app_dump_extensions("\t",
1096 inst.global_layers[i].layer_properties.layerName,
1097 inst.global_layers[i].extension_count,
1098 inst.global_layers[i].extension_properties);
1099 }
Jon Ashburn29669a42015-04-04 14:52:07 -06001100
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -06001101 err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL);
Jon Ashburn07b309a2015-04-15 11:31:12 -06001102 if (err)
1103 ERR_EXIT(err);
1104 if (gpu_count > MAX_GPUS) {
David Pinedo18fb9232015-04-21 14:45:16 -06001105 printf("Too many GPUS found \n");
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -06001106 ERR_EXIT(-1);
Jon Ashburn07b309a2015-04-15 11:31:12 -06001107 }
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -06001108 err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs);
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001109 if (err)
1110 ERR_EXIT(err);
Chia-I Wud4bae362014-07-29 11:15:00 +08001111
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001112 for (i = 0; i < gpu_count; i++) {
1113 app_gpu_init(&gpus[i], i, objs[i]);
1114 app_gpu_dump(&gpus[i]);
1115 printf("\n\n");
1116 }
Chia-I Wud4bae362014-07-29 11:15:00 +08001117
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001118 for (i = 0; i < gpu_count; i++)
1119 app_gpu_destroy(&gpus[i]);
Chia-I Wud4bae362014-07-29 11:15:00 +08001120
Courtney Goeltzenleuchter3c1ccf52015-06-04 16:20:06 -06001121 app_destroy_instance(&inst);
Chia-I Wu0b9a7372014-08-06 12:09:19 +08001122
Chia-I Wu190ebdc2014-08-06 12:04:13 +08001123 return 0;
Chia-I Wud4bae362014-07-29 11:15:00 +08001124}
Ian Elliottea95f5c2015-04-17 21:23:34 -06001125
1126#ifdef _WIN32
David Pinedo18fb9232015-04-21 14:45:16 -06001127
1128// Create a console window with a large scrollback size to which to send stdout.
1129// Returns true if console window was successfully created, false otherwise.
1130bool SetStdOutToNewConsole()
1131{
1132 // don't do anything if we already have a console
1133 if (GetStdHandle(STD_OUTPUT_HANDLE))
1134 return false;
1135
1136 // allocate a console for this app
1137 AllocConsole();
1138
1139 // redirect unbuffered STDOUT to the console
1140 HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
1141 int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
1142 FILE *fp = _fdopen( fileDescriptor, "w" );
1143 *stdout = *fp;
1144 setvbuf( stdout, NULL, _IONBF, 0 );
1145
1146 // make the console window bigger
1147 CONSOLE_SCREEN_BUFFER_INFO csbi;
1148 SMALL_RECT r;
1149 COORD bufferSize;
1150 if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
1151 return false;
David Pinedod1887572015-10-09 11:31:15 -06001152 bufferSize.X = csbi.dwSize.X+30;
David Pinedoe1b115f2015-10-02 16:49:43 -06001153 bufferSize.Y = 20000;
David Pinedo18fb9232015-04-21 14:45:16 -06001154 if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize))
1155 return false;
1156 r.Left = r.Top = 0;
David Pinedod1887572015-10-09 11:31:15 -06001157 r.Right = csbi.dwSize.X-1+30;
David Pinedo3bf020c2015-09-29 16:56:02 -06001158 r.Bottom = 50;
David Pinedo18fb9232015-04-21 14:45:16 -06001159 if (!SetConsoleWindowInfo(consoleHandle, true, &r))
1160 return false;
1161
1162 // change the console window title
Ian Elliott4e19ed02015-04-28 10:52:52 -06001163 if (!SetConsoleTitle(TEXT(APP_SHORT_NAME)))
David Pinedo18fb9232015-04-21 14:45:16 -06001164 return false;
1165
1166 return true;
1167}
1168
Ian Elliottea95f5c2015-04-17 21:23:34 -06001169int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
1170{
1171 char *argv = pCmdLine;
David Pinedo18fb9232015-04-21 14:45:16 -06001172 consoleCreated = SetStdOutToNewConsole();
Ian Elliottea95f5c2015-04-17 21:23:34 -06001173 main(1, &argv);
1174 fflush(stdout);
David Pinedo18fb9232015-04-21 14:45:16 -06001175 if (consoleCreated)
1176 Sleep(INFINITE);
Ian Elliottea95f5c2015-04-17 21:23:34 -06001177}
1178#endif