vulkaninfo.c revision 7e470703805a7c93655ea18f553e225e84356429
146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu/*
29cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter * Vulkan
346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu *
446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Copyright (C) 2014 LunarG, Inc.
546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu *
646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * copy of this software and associated documentation files (the "Software"),
846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * to deal in the Software without restriction, including without limitation
946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
1146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Software is furnished to do so, subject to the following conditions:
1246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu *
1346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * The above copyright notice and this permission notice shall be included
1446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * in all copies or substantial portions of the Software.
1546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu *
1646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * DEALINGS IN THE SOFTWARE.
2346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu */
24d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdlib.h>
25d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdio.h>
26d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdbool.h>
27d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <string.h>
2846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h>
29825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski#include <inttypes.h>
30d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
31ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32
32ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#include <Windows.h>
3318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h>
3418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h>
35ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif
36ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott
37338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott#include "vk_ext_khr_swapchain.h"
38338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott#include "vk_ext_khr_device_swapchain.h"
39e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott
409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include <vulkan.h>
4146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ERR(err) printf("%s:%d: failed with %s\n", \
439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    __FILE__, __LINE__, vk_result_string(err));
4446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32
4618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
477c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf
487c83aa210365e148877f0f3698292a1b509018ffIan Elliott
4918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool consoleCreated = false;
5018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
5118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define WAIT_FOR_CONSOLE_DESTROY \
5218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    do { \
5318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        if (consoleCreated) \
5418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo            Sleep(INFINITE); \
5518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    } while (0)
5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else
5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    #define WAIT_FOR_CONSOLE_DESTROY
5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif
5918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
6018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
6118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define ERR_EXIT(err) \
6218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    do { \
6318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        ERR(err); \
6418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        fflush(stdout); \
6518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        WAIT_FOR_CONSOLE_DESTROY; \
6618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        exit(-1); \
6718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo   } while (0)
6846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
6922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__)
7022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused))
7122a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else
7222a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY
7322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif
7422a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour
7546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
7646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8
7846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5
804e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo"
8146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu;
8346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
8446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev {
8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    struct app_gpu *gpu; /* point back to the GPU */
8646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
87382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkDevice obj;
8846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
8946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
90ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter    VkFormatProperties format_props[VK_FORMAT_NUM];
9146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu};
9246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
9318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstruct layer_extension_list {
9418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkLayerProperties layer_properties;
9518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t extension_count;
9618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkExtensionProperties *extension_properties;
9718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter};
9818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance {
1003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkInstance  instance;
10118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t global_layer_count;
10218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    struct layer_extension_list *global_layers;
1033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t global_extension_count;
1043c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *global_extensions;
1053c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter};
1063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
10746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu {
108e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t id;
1098205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDevice obj;
11046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
1118205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceProperties props;
11246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
113e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t queue_count;
114ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop    VkQueueFamilyProperties *queue_props;
115ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkDeviceQueueCreateInfo *queue_reqs;
11646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
1178205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceMemoryProperties memory_props;
118a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    VkPhysicalDeviceFeatures features;
1197dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    VkPhysicalDevice limits;
12046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
12118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t device_layer_count;
12218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    struct layer_extension_list *device_layers;
12318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
1243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t device_extension_count;
1253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *device_extensions;
12646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
12746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    struct app_dev dev;
12846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu};
12946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
130382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_result_string(VkResult err)
13146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
13246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    switch (err) {
13346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define STR(r) case r: return #r
1349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_SUCCESS);
1359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_NOT_READY);
1369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_TIMEOUT);
1379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_EVENT_SET);
1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_EVENT_RESET);
1399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INITIALIZATION_FAILED);
1408205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VK_ERROR_OUT_OF_HOST_MEMORY);
1418205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
1429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_DEVICE_LOST);
143ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter    STR(VK_ERROR_LAYER_NOT_PRESENT);
144ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter    STR(VK_ERROR_EXTENSION_NOT_PRESENT);
1459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_MEMORY_MAP_FAILED);
1469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INCOMPATIBLE_DRIVER);
14746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR
14846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    default: return "UNKNOWN_RESULT";
14946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
15046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
151d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
1528205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type)
153d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
154190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    switch (type) {
1558205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_PHYSICAL_DEVICE_TYPE_ ##r: return #r
156190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    STR(OTHER);
1578205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(INTEGRATED_GPU);
1588205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(DISCRETE_GPU);
1598205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VIRTUAL_GPU);
160d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR
1618205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    default: return "UNKNOWN_DEVICE";
162190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
163d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
164d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
165382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_format_string(VkFormat fmt)
166d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
1672b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    switch (fmt) {
1688205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_FORMAT_ ##r: return #r
169190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    STR(UNDEFINED);
1702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4_UNORM);
1712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4_USCALED);
1722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4B4A4_UNORM);
1732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4B4A4_USCALED);
1742b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G6B5_UNORM);
1752b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G6B5_USCALED);
1762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G5B5A1_UNORM);
1772b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G5B5A1_USCALED);
1782b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_UNORM);
1792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SNORM);
1802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_USCALED);
1812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SSCALED);
1822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_UINT);
1832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SINT);
1842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SRGB);
1852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_UNORM);
1862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SNORM);
1872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_USCALED);
1882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SSCALED);
1892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_UINT);
1902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SINT);
1912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SRGB);
1922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_UNORM);
1932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SNORM);
1942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_USCALED);
1952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SSCALED);
1962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_UINT);
1972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SINT);
1982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SRGB);
1992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_UNORM);
2002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SNORM);
2012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_USCALED);
2022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SSCALED);
2032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_UINT);
2042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SINT);
2052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SRGB);
2062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_UNORM);
2072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SNORM);
2082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_USCALED);
2092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SSCALED);
2102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_UINT);
2112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SINT);
2122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_UNORM);
2132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SNORM);
2142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_USCALED);
2152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SSCALED);
2162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_UINT);
2172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SINT);
2182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SFLOAT);
2192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_UNORM);
2202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SNORM);
2212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_USCALED);
2222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SSCALED);
2232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_UINT);
2242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SINT);
2252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SFLOAT);
2262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_UNORM);
2272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SNORM);
2282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_USCALED);
2292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SSCALED);
2302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_UINT);
2312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SINT);
2322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SFLOAT);
2332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_UNORM);
2342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SNORM);
2352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_USCALED);
2362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SSCALED);
2372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_UINT);
2382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SINT);
2392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SFLOAT);
2402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_UINT);
2412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_SINT);
2422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_SFLOAT);
2432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_UINT);
2442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_SINT);
2452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_SFLOAT);
2462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_UINT);
2472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_SINT);
2482b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_SFLOAT);
2492b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_UINT);
2502b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_SINT);
2512b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_SFLOAT);
2522b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64_SFLOAT);
2532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64_SFLOAT);
2542b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64B64_SFLOAT);
2552b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64B64A64_SFLOAT);
2562b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R11G11B10_UFLOAT);
2572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R9G9B9E5_UFLOAT);
2582b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D16_UNORM);
2597ed105917014d56bae29b0a14dcee32e1256e55cCourtney Goeltzenleuchter    STR(D24_UNORM_X8);
2602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D32_SFLOAT);
2612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(S8_UINT);
2622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D16_UNORM_S8_UINT);
2632b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D24_UNORM_S8_UINT);
2642b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D32_SFLOAT_S8_UINT);
265fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(BC1_RGB_UNORM);
266fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(BC1_RGB_SRGB);
2672b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC2_UNORM);
2682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC2_SRGB);
2692b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC3_UNORM);
2702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC3_SRGB);
2712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC4_UNORM);
2722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC4_SNORM);
2732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC5_UNORM);
2742b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC5_SNORM);
2752b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC6H_UFLOAT);
2762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC6H_SFLOAT);
2772b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC7_UNORM);
2782b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC7_SRGB);
2792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8_UNORM);
2802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8A1_UNORM);
2812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8A8_UNORM);
2822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11_UNORM);
2832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11_SNORM);
2842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11G11_UNORM);
2852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11G11_SNORM);
2862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_4x4_UNORM);
2872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_4x4_SRGB);
288fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(ASTC_5x4_UNORM);
289fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(ASTC_5x4_SRGB);
2902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_5x5_UNORM);
2912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_5x5_SRGB);
2922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x5_UNORM);
2932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x5_SRGB);
2942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x6_UNORM);
2952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x6_SRGB);
2962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x5_UNORM);
2972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x5_SRGB);
2982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x6_UNORM);
2992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x6_SRGB);
3002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x8_UNORM);
3012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x8_SRGB);
3022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x5_UNORM);
3032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x5_SRGB);
3042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x6_UNORM);
3052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x6_SRGB);
3062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x8_UNORM);
3072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x8_SRGB);
3082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x10_UNORM);
3092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x10_SRGB);
3102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x10_UNORM);
3112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x10_SRGB);
3122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x12_UNORM);
3132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x12_SRGB);
3142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B5G6R5_UNORM);
3152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B5G6R5_USCALED);
3162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_UNORM);
3172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SNORM);
3182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_USCALED);
3192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SSCALED);
3202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_UINT);
3212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SINT);
3222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SRGB);
3232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_UNORM);
3242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SNORM);
3252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_USCALED);
3262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SSCALED);
3272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_UINT);
3282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SINT);
3292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SRGB);
3302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_UNORM);
3312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SNORM);
3322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_USCALED);
3332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SSCALED);
3342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_UINT);
3352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SINT);
336d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR
3372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    default: return "UNKNOWN_FORMAT";
338190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
339d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
340d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
34146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init_formats(struct app_dev *dev)
34246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
343382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormat f;
3442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes
345ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter    for (f = 0; f < VK_FORMAT_NUM; f++) {
346382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        const VkFormat fmt = f;
3472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes
34801d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter        vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, &dev->format_props[f]);
34946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
35046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
35146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
35218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch)
35318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{
35418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *major = version >> 22;
35518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *minor = (version >> 12) & 0x3ff;
35618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *patch = version & 0xfff;
35718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}
35818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
35918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_physical_device_layer_extensions(
36018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        struct app_gpu *gpu,
36118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        char *layer_name,
36218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        uint32_t *extension_count,
36318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkExtensionProperties **extension_properties)
36418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{
36518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkResult err;
36618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t ext_count = 0;
36718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkExtensionProperties *ext_ptr = NULL;
36818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
36918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    /* repeat get until VK_INCOMPLETE goes away */
37018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    do {
37174c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, NULL);
37218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(!err);
37318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
37418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (ext_ptr) {
37518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(ext_ptr);
37618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
37718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties));
37874c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, ext_ptr);
37918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    } while (err == VK_INCOMPLETE);
38018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    assert(!err);
38118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
38218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *extension_count = ext_count;
38318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *extension_properties = ext_ptr;
38418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}
38518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
38646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu)
38746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
388ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkDeviceCreateInfo info = {
3899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
39046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .pNext = NULL,
391dfd53f5bd7048e3d538cb195e22e04f95a02507bCourtney Goeltzenleuchter        .requestedQueueCount = 0,
39246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .pRequestedQueues = NULL,
393763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu        .enabledLayerNameCount = 0,
39418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        .ppEnabledLayerNames = NULL,
395763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu        .enabledExtensionNameCount = 0,
39618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        .ppEnabledExtensionNames = NULL,
39746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    };
3983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkResult U_ASSERT_ONLY err;
3993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    // Extensions to enable
40018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    static const char *known_extensions[] = {
401338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott        VK_EXT_KHR_DEVICE_SWAPCHAIN_EXTENSION_NAME,
4023c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
403426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
40418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t count = 0;
40518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
40618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    /* Scan layers */
40718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkLayerProperties *device_layer_properties = NULL;
40818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    struct layer_extension_list *device_layers = NULL;
40918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
41018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    do {
41174c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, NULL);
41218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(!err);
41318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
41418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (device_layer_properties) {
41518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(device_layer_properties);
41618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
41718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        device_layer_properties = malloc(sizeof(VkLayerProperties) * count);
41818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(device_layer_properties);
41918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
42018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (device_layers) {
42118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(device_layers);
42218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
42318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        device_layers = malloc(sizeof(struct layer_extension_list) * count);
42418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(device_layers);
42518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
42674c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, device_layer_properties);
42718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    } while (err == VK_INCOMPLETE);
4283c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    assert(!err);
4293c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
43018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    gpu->device_layer_count = count;
43118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    gpu->device_layers = device_layers;
43218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
43318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    for (uint32_t i = 0; i < gpu->device_layer_count; i++) {
43418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkLayerProperties *src_info = &device_layer_properties[i];
43518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        struct layer_extension_list *dst_info = &gpu->device_layers[i];
43618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties));
43718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
43818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        /* Save away layer extension info for report */
43918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        app_get_physical_device_layer_extensions(
44018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    gpu,
44118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    src_info->layerName,
44218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    &dst_info->extension_count,
44318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    &dst_info->extension_properties);
4443c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
44518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    free(device_layer_properties);
44618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
44718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    app_get_physical_device_layer_extensions(
44818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                gpu,
44918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                NULL,
45018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                &gpu->device_extension_count,
45118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                &gpu->device_extensions);
4523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
4539e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter    fflush(stdout);
4549e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter
45518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t enabled_extension_count = 0;
45667a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter    uint32_t known_extension_count = ARRAY_SIZE(known_extensions);
45718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
45867a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter    for (uint32_t i = 0; i < known_extension_count; i++) {
4591f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter        VkBool32 extension_found = 0;
46018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        for (uint32_t j = 0; j < gpu->device_extension_count; j++) {
46118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            VkExtensionProperties *ext_prop = &gpu->device_extensions[j];
46218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            if (!strcmp(known_extensions[i], ext_prop->extName)) {
46318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
46418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                extension_found = 1;
46518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                enabled_extension_count++;
4663c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            }
4673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        }
46818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (!extension_found) {
46918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            printf("Cannot find extension: %s\n", known_extensions[i]);
470ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter            ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT);
47118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
4723c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
47346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
47446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* request all queues */
475dfd53f5bd7048e3d538cb195e22e04f95a02507bCourtney Goeltzenleuchter    info.requestedQueueCount = gpu->queue_count;
47646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    info.pRequestedQueues = gpu->queue_reqs;
47746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
478763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    info.enabledLayerNameCount = 0;
47918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    info.ppEnabledLayerNames = NULL;
480763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    info.enabledExtensionNameCount = enabled_extension_count;
48118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    info.ppEnabledExtensionNames = (const char*const*) known_extensions;
4823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    dev->gpu = gpu;
48369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu    err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj);
4843c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (err)
4853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
48646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
48746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
48846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
48946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_destroy(struct app_dev *dev)
49046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
49169f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu    vkDestroyDevice(dev->obj, NULL);
49246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
49346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
49418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_global_layer_extensions(
49518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        char *layer_name,
49618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        uint32_t *extension_count,
49718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkExtensionProperties **extension_properties)
49818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{
49918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkResult err;
50018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t ext_count = 0;
50118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkExtensionProperties *ext_ptr = NULL;
50218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
50318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    /* repeat get until VK_INCOMPLETE goes away */
50418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    do {
50574c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, NULL);
50618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(!err);
50718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
50818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (ext_ptr) {
50918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(ext_ptr);
51018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
51118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties));
51274c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, ext_ptr);
51318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    } while (err == VK_INCOMPLETE);
51418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    assert(!err);
51518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
51618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *extension_count = ext_count;
51718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    *extension_properties = ext_ptr;
51818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}
51918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
5203c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_create_instance(struct app_instance *inst)
52146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
5223c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    const VkApplicationInfo app_info = {
5233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
5243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pNext = NULL,
5253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pAppName = APP_SHORT_NAME,
5263c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .appVersion = 1,
5273c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pEngineName = APP_SHORT_NAME,
5283c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .engineVersion = 1,
5293c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .apiVersion = VK_API_VERSION,
5303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
5313c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkInstanceCreateInfo inst_info = {
5323c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
5333c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pNext = NULL,
5343c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pAppInfo = &app_info,
535763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu        .enabledLayerNameCount = 0,
53618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        .ppEnabledLayerNames = NULL,
537763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu        .enabledExtensionNameCount = 0,
53818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        .ppEnabledExtensionNames = NULL,
5393c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
54022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour    VkResult U_ASSERT_ONLY err;
5413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    // Global Extensions to enable
542aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott    static char *known_extensions[] = {
543338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott        "VK_EXT_KHR_swapchain",
54446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    };
545426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
5463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t global_extension_count = 0;
54718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    uint32_t count = 0;
54818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
54918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    /* Scan layers */
55018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    VkLayerProperties *global_layer_properties = NULL;
55118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    struct layer_extension_list *global_layers = NULL;
55218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
55318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    do {
55474c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateInstanceLayerProperties(&count, NULL);
55518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(!err);
55618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
55718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (global_layer_properties) {
55818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(global_layer_properties);
55918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
56018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        global_layer_properties = malloc(sizeof(VkLayerProperties) * count);
56118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(global_layer_properties);
56218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
56318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (global_layers) {
56418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            free(global_layers);
56518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
56618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        global_layers = malloc(sizeof(struct layer_extension_list) * count);
56718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        assert(global_layers);
5683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
56974c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter        err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties);
57018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    } while (err == VK_INCOMPLETE);
5713536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis    assert(!err);
5723536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis
57318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    inst->global_layer_count = count;
57418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    inst->global_layers = global_layers;
57518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
57618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    for (uint32_t i = 0; i < inst->global_layer_count; i++) {
57718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkLayerProperties *src_info = &global_layer_properties[i];
57818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        struct layer_extension_list *dst_info = &inst->global_layers[i];
57918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties));
58018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
58118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        /* Save away layer extension info for report */
58218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        app_get_global_layer_extensions(
58318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    src_info->layerName,
58418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    &dst_info->extension_count,
58518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                    &dst_info->extension_properties);
5863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
58718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    free(global_layer_properties);
58818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
58918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    /* Collect global extensions */
59018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    inst->global_extension_count = 0;
59118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    app_get_global_layer_extensions(
59218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                NULL,
59318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                &inst->global_extension_count,
59418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                &inst->global_extensions);
5953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
5963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) {
5971f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter        VkBool32 extension_found = 0;
59818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        for (uint32_t j = 0; j < inst->global_extension_count; j++) {
59918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            VkExtensionProperties *extension_prop = &inst->global_extensions[j];
60018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            if (!strcmp(known_extensions[i], extension_prop->extName)) {
60118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
60218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                extension_found = 1;
6033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                global_extension_count++;
6043c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            }
6053536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis        }
60618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        if (!extension_found) {
60718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            printf("Cannot find extension: %s\n", known_extensions[i]);
608ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter            ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT);
60918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        }
61046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
61146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
612763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    inst_info.enabledExtensionNameCount = global_extension_count;
61318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    inst_info.ppEnabledExtensionNames = (const char * const *) known_extensions;
61446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
61569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu    err = vkCreateInstance(&inst_info, NULL, &inst->instance);
6163c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
6173c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        printf("Cannot create Vulkan instance.\n");
6183c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
6193c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    } else if (err) {
6203c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
62146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
6223c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}
6233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
6243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_destroy_instance(struct app_instance *inst)
6253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{
6263c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    free(inst->global_extensions);
62769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu    vkDestroyInstance(inst->instance, NULL);
62846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
62946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
6303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
6318205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, VkPhysicalDevice obj)
63246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
633aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott    uint32_t i;
63446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
63546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    memset(gpu, 0, sizeof(*gpu));
63646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
63746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->id = id;
63846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->obj = obj;
639426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
64001d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter    vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props);
64146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
64246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* get queue count */
64301d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter    vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL);
64446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
64546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->queue_props =
64646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu            malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count);
647426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
64846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    if (!gpu->queue_props)
6498205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
65001d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter    vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, gpu->queue_props);
65146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
65246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* set up queue requests */
65346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count);
65446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    if (!gpu->queue_reqs)
6558205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
65646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    for (i = 0; i < gpu->queue_count; i++) {
657d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter        float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float));
658d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter        memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float));
659ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter        gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
660ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter        gpu->queue_reqs[i].pNext = NULL;
661fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes        gpu->queue_reqs[i].queueFamilyIndex = i;
662763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu        gpu->queue_reqs[i].queuePriorityCount = gpu->queue_props[i].queueCount;
663d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter        gpu->queue_reqs[i].pQueuePriorities = queue_priorities;
66446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
66546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
66601d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter    vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props);
66746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
66801d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter    vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features);
669a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
67046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_init(&gpu->dev, gpu);
67146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_init_formats(&gpu->dev);
67246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
67346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
67446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_gpu_destroy(struct app_gpu *gpu)
67546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
67646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_destroy(&gpu->dev);
6773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    free(gpu->device_extensions);
67846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    free(gpu->queue_reqs);
679d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter    for (uint32_t i = 0; i < gpu->queue_count; i++) {
680d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter        free((void *) gpu->queue_reqs[i].pQueuePriorities);
681d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter    }
68246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    free(gpu->queue_props);
68346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
68446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
685382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt)
686d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
687382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    const VkFormatProperties *props = &dev->format_props[fmt];
688190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    struct {
689190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        const char *name;
690382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFlags flags;
6914b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    } features[3];
692e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t i;
693190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
6944b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[0].name  = "linearTiling   FormatFeatureFlags";
6954b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[0].flags = props->linearTilingFeatures;
6964b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[1].name  = "optimalTiling  FormatFeatureFlags";
6974b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[1].flags = props->optimalTilingFeatures;
6984b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[2].name  = "bufferFeatures FormatFeatureFlags";
6994b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    features[2].flags = props->bufferFeatures;
7004b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski
7014b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    printf("\nFORMAT_%s:", vk_format_string(fmt));
7024b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    for (i = 0; i < ARRAY_SIZE(features); i++) {
7034b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski        printf("\n\t%s:", features[i].name);
7044b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski        if (features[i].flags == 0) {
7054b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski            printf("\n\t\tNone");
7064b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski        } else {
707752957901902cd3de9b99ef272d7b7fbaeef2705Courtney Goeltzenleuchter            printf("%s%s%s%s%s%s%s%s%s%s%s%s",
7084b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)               ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT"               : ""),
7094b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)               ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT"               : ""),
7104b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)        ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT"        : ""),
7114b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)            ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT"            : ""),
7124b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)      ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT"      : ""),
7134b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)    ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT"    : ""),
7144b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SOURCE_BIT)                 ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SOURCE_BIT"                 : ""),
7154b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DESTINATION_BIT)            ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DESTINATION_BIT"            : ""),
7164b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)        ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT"        : ""),
7174b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)        ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT"        : ""),
7184b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""),
7194b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski               ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)               ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT"               : ""));
7204b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski        }
721190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
7224b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski    printf("\n");
723d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
724d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
725d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
726d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void
727d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev)
728d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
729382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormat fmt;
730190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
731ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter    for (fmt = 0; fmt < VK_FORMAT_NUM; fmt++) {
7322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes        app_dev_dump_format_props(dev, fmt);
733190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
734d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
735d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
736009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32
737009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER    "%Iu"
738009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else
739009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER    "%zu"
740009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif
741009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan
742a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu)
743a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{
744a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    const VkPhysicalDeviceFeatures *features = &gpu->features;
745a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
746825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("VkPhysicalDeviceFeatures:\n");
747825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("=========================\n");
748825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski
749825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\trobustBufferAccess                      = %u\n", features->robustBufferAccess                     );
750825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tfullDrawIndexUint32                     = %u\n", features->fullDrawIndexUint32                    );
751825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\timageCubeArray                          = %u\n", features->imageCubeArray                         );
752825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tindependentBlend                        = %u\n", features->independentBlend                       );
753825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tgeometryShader                          = %u\n", features->geometryShader                         );
754825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\ttessellationShader                      = %u\n", features->tessellationShader                     );
755825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsampleRateShading                       = %u\n", features->sampleRateShading                      );
756825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdualSourceBlend                         = %u\n", features->dualSourceBlend                        );
757825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tlogicOp                                 = %u\n", features->logicOp                                );
758825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tmultiDrawIndirect                       = %u\n", features->multiDrawIndirect                      );
759c0f9fa7f4a5e44878c491476e2ece1bacd3223c2Courtney Goeltzenleuchter    printf("\tdepthClip                               = %u\n", features->depthClamp                              );
760825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdepthBiasClamp                          = %u\n", features->depthBiasClamp                         );
761825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tfillModeNonSolid                        = %u\n", features->fillModeNonSolid                       );
762825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdepthBounds                             = %u\n", features->depthBounds                            );
763825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\twideLines                               = %u\n", features->wideLines                              );
764825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tlargePoints                             = %u\n", features->largePoints                            );
765825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\ttextureCompressionETC2                  = %u\n", features->textureCompressionETC2                 );
766825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\ttextureCompressionASTC_LDR              = %u\n", features->textureCompressionASTC_LDR             );
767825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\ttextureCompressionBC                    = %u\n", features->textureCompressionBC                   );
7684ddda2f5cecb55eecc761380150072dd41850376Mike Stroyan    printf("\tocclusionQueryNonConservative           = %u\n", features->occlusionQueryNonConservative          );
769825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tpipelineStatisticsQuery                 = %u\n", features->pipelineStatisticsQuery                );
770fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu    printf("\tvertexSideEffects                       = %u\n", features->vertexPipelineStoresAndAtomics         );
771fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu    printf("\ttessellationSideEffects                 = %u\n", features->fragmentStoresAndAtomics               );
772fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu    printf("\tgeometrySideEffects                     = %u\n", features->shaderTessellationAndGeometryPointSize );
773825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderImageGatherExtended               = %u\n", features->shaderImageGatherExtended              );
774825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderStorageImageExtendedFormats       = %u\n", features->shaderStorageImageExtendedFormats      );
775825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderStorageImageMultisample           = %u\n", features->shaderStorageImageMultisample          );
776825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing);
777825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderSampledImageArrayDynamicIndexing  = %u\n", features->shaderSampledImageArrayDynamicIndexing );
778825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing);
779825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderStorageImageArrayDynamicIndexing  = %u\n", features->shaderStorageImageArrayDynamicIndexing );
780825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderClipDistance                      = %u\n", features->shaderClipDistance                     );
781825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderCullDistance                      = %u\n", features->shaderCullDistance                     );
782825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderFloat64                           = %u\n", features->shaderFloat64                          );
783825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderInt64                             = %u\n", features->shaderInt64                            );
784825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderInt16                             = %u\n", features->shaderInt16                            );
785825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderResourceResidency                 = %u\n", features->shaderResourceResidency                );
786825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tshaderResourceMinLOD                    = %u\n", features->shaderResourceMinLOD                   );
787825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\talphaToOne                              = %u\n", features->alphaToOne                             );
7887dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\tsparseBinding                           = %u\n", features->sparseBinding                          );
789825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidencyBuffer                   = %u\n", features->sparseResidencyBuffer                  );
790825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidencyImage2D                  = %u\n", features->sparseResidencyImage2D                 );
791825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidencyImage3D                  = %u\n", features->sparseResidencyImage3D                 );
792825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidency2Samples                 = %u\n", features->sparseResidency2Samples                );
793825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidency4Samples                 = %u\n", features->sparseResidency4Samples                );
794825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidency8Samples                 = %u\n", features->sparseResidency8Samples                );
795825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidency16Samples                = %u\n", features->sparseResidency16Samples               );
796825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tsparseResidencyAliased                  = %u\n", features->sparseResidencyAliased                 );
797a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes}
798a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
7997dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_sparse_props(const VkPhysicalDeviceSparseProperties *sparseProps)
800a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{
8017dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
8027dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\tVkPhysicalDeviceSparseProperties:\n");
8037dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t---------------------------------\n");
8047dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
80500c8c98bc320535aebf61ad3fe255ebbd234549bCourtney Goeltzenleuchter    printf("\t\tresidencyStandard2DBlockShape     = %u\n", sparseProps->residencyStandard2DBlockShape    );
8067e470703805a7c93655ea18f553e225e84356429Chia-I Wu    printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparseProps->residencyStandard2DMultisampleBlockShape);
80700c8c98bc320535aebf61ad3fe255ebbd234549bCourtney Goeltzenleuchter    printf("\t\tresidencyStandard3DBlockShape     = %u\n", sparseProps->residencyStandard3DBlockShape    );
80800c8c98bc320535aebf61ad3fe255ebbd234549bCourtney Goeltzenleuchter    printf("\t\tresidencyAlignedMipSize           = %u\n", sparseProps->residencyAlignedMipSize          );
80900c8c98bc320535aebf61ad3fe255ebbd234549bCourtney Goeltzenleuchter    printf("\t\tresidencyNonResident              = %u\n", sparseProps->residencyNonResident             );
81000c8c98bc320535aebf61ad3fe255ebbd234549bCourtney Goeltzenleuchter    printf("\t\tresidencyNonResidentStrict        = %u\n", sparseProps->residencyNonResidentStrict       );
8117dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski}
8127dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
8137dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_limits(const VkPhysicalDeviceLimits *limits)
8147dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski{
8157dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\tVkPhysicalDeviceLimits:\n");
8167dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t-----------------------\n");
8177dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
8187dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxImageDimension1D                     = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension1D                    );
8197dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxImageDimension2D                     = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension2D                    );
8207dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxImageDimension3D                     = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension3D                    );
8217dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxImageDimensionCube                   = 0x%" PRIxLEAST32 "\n", limits->maxImageDimensionCube                  );
8227dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxImageArrayLayers                     = 0x%" PRIxLEAST32 "\n", limits->maxImageArrayLayers                    );
823a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour    printf("\t\tsampleCounts                            = 0x%" PRIxLEAST32 "\n", limits->sampleCounts                           );
8247e470703805a7c93655ea18f553e225e84356429Chia-I Wu    printf("\t\tmaxTexelBufferElements                  = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements                 );
825d6633e2e0499acf899d8d5c1c8844089e0df5acbCourtney Goeltzenleuchter    printf("\t\tmaxUniformBufferRange                    = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange                 );
826d6633e2e0499acf899d8d5c1c8844089e0df5acbCourtney Goeltzenleuchter    printf("\t\tmaxStorageBufferRange                    = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange                 );
8277dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPushConstantsSize                    = 0x%" PRIxLEAST32 "\n", limits->maxPushConstantsSize                   );
8287dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxMemoryAllocationCount                = 0x%" PRIxLEAST32 "\n", limits->maxMemoryAllocationCount               );
8297dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tbufferImageGranularity                  = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity                 );
830a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour    printf("\t\tsparseAddressSpaceSize                  = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize                 );
8317dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxBoundDescriptorSets                  = 0x%" PRIxLEAST32 "\n", limits->maxBoundDescriptorSets                 );
8327dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPerStageDescriptorSamplers           = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSamplers          );
8337dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPerStageDescriptorUniformBuffers     = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorUniformBuffers    );
8347dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPerStageDescriptorStorageBuffers     = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageBuffers    );
8357dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPerStageDescriptorSampledImages      = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSampledImages     );
8367dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxPerStageDescriptorStorageImages      = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageImages     );
8377dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDescriptorSetSamplers                = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSamplers               );
8387dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDescriptorSetUniformBuffers          = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffers         );
839a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour    printf("\t\tmaxDescriptorSetUniformBuffersDynamic   = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffersDynamic  );
8407dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDescriptorSetStorageBuffers          = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffers         );
841a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour    printf("\t\tmaxDescriptorSetStorageBuffersDynamic   = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffersDynamic  );
8427dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDescriptorSetSampledImages           = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSampledImages          );
8437dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDescriptorSetStorageImages           = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageImages          );
8447dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxVertexInputAttributes                = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributes               );
845a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour    printf("\t\tmaxVertexInputBindings                  = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindings                 );
8467dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxVertexInputAttributeOffset           = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset          );
8477dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxVertexInputBindingStride             = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride            );
8487dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxVertexOutputComponents               = 0x%" PRIxLEAST32 "\n", limits->maxVertexOutputComponents              );
849c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationGenLevel                         = 0x%" PRIxLEAST32 "\n", limits->maxTessellationGenLevel                        );
850c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationPatchSize                        = 0x%" PRIxLEAST32 "\n", limits->maxTessellationPatchSize                       );
851c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationControlPerVertexInputComponents  = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexInputComponents );
852c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationControlPerVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexOutputComponents);
853c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationControlPerPatchOutputComponents  = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerPatchOutputComponents );
854c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationControlTotalOutputComponents     = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlTotalOutputComponents    );
855c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationEvaluationInputComponents        = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationInputComponents       );
856c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter    printf("\t\tmaxTessellationEvaluationOutputComponents       = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationOutputComponents      );
8577dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxGeometryShaderInvocations            = 0x%" PRIxLEAST32 "\n", limits->maxGeometryShaderInvocations           );
8587dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxGeometryInputComponents              = 0x%" PRIxLEAST32 "\n", limits->maxGeometryInputComponents             );
8597dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxGeometryOutputComponents             = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputComponents            );
8607dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxGeometryOutputVertices               = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputVertices              );
8617dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxGeometryTotalOutputComponents        = 0x%" PRIxLEAST32 "\n", limits->maxGeometryTotalOutputComponents       );
8627dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFragmentInputComponents              = 0x%" PRIxLEAST32 "\n", limits->maxFragmentInputComponents             );
863d6633e2e0499acf899d8d5c1c8844089e0df5acbCourtney Goeltzenleuchter    printf("\t\tmaxFragmentOutputAttachments                = 0x%" PRIxLEAST32 "\n", limits->maxFragmentOutputAttachments               );
864d6633e2e0499acf899d8d5c1c8844089e0df5acbCourtney Goeltzenleuchter    printf("\t\tmaxFragmentDualSourceAttachments            = 0x%" PRIxLEAST32 "\n", limits->maxFragmentDualSourceAttachments           );
8657dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFragmentCombinedOutputResources      = 0x%" PRIxLEAST32 "\n", limits->maxFragmentCombinedOutputResources     );
8667dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeSharedMemorySize              = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize             );
8677dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupCount[0]             = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[0]            );
8687dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupCount[1]             = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[1]            );
8697dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupCount[2]             = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[2]            );
8707dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupInvocations          = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupInvocations         );
8717dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupSize[0]              = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[0]             );
8727dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupSize[1]              = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[1]             );
8737dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxComputeWorkGroupSize[2]              = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[2]             );
8747dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tsubPixelPrecisionBits                   = 0x%" PRIxLEAST32 "\n", limits->subPixelPrecisionBits                  );
8757dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tsubTexelPrecisionBits                   = 0x%" PRIxLEAST32 "\n", limits->subTexelPrecisionBits                  );
8767dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmipmapPrecisionBits                     = 0x%" PRIxLEAST32 "\n", limits->mipmapPrecisionBits                    );
8777dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDrawIndexedIndexValue                = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndexedIndexValue               );
8787dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxDrawIndirectInstanceCount            = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndirectInstanceCount           );
8797dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSamplerLodBias                       = %f\n",                 limits->maxSamplerLodBias                      );
8807dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSamplerAnisotropy                    = %f\n",                 limits->maxSamplerAnisotropy                   );
8817dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxViewports                            = 0x%" PRIxLEAST32 "\n", limits->maxViewports                           );
8827dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxViewportDimensions[0]                = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[0]               );
8837dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxViewportDimensions[1]                = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[1]               );
8847dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tviewportBoundsRange[0]                  = %f\n",                 limits->viewportBoundsRange[0]                 );
8857dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tviewportBoundsRange[1]                  = %f\n",                 limits->viewportBoundsRange[1]                 );
8867dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tviewportSubPixelBits                    = 0x%" PRIxLEAST32 "\n", limits->viewportSubPixelBits                   );
8873ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\tminMemoryMapAlignment                   = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment         );
8883ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\tminTexelBufferOffsetAlignment           = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment          );
8893ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\tminUniformBufferOffsetAlignment         = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment        );
8903ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\tminStorageBufferOffsetAlignment         = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment        );
8917dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tminTexelOffset                          = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset                         );
8927dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxTexelOffset                          = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset                         );
8937dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tminTexelGatherOffset                    = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset                   );
8947dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxTexelGatherOffset                    = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset                   );
8957dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tminInterpolationOffset                  = %f\n",                 limits->minInterpolationOffset                 );
8967dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxInterpolationOffset                  = %f\n",                 limits->maxInterpolationOffset                 );
8977dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tsubPixelInterpolationOffsetBits         = 0x%" PRIxLEAST32 "\n", limits->subPixelInterpolationOffsetBits        );
8987dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferWidth                     = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferWidth                    );
8997dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferHeight                    = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferHeight                   );
9007dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferLayers                    = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferLayers                   );
9017dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferColorSamples              = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferColorSamples             );
9027dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferDepthSamples              = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferDepthSamples             );
9037dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxFramebufferStencilSamples            = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferStencilSamples           );
9047dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxColorAttachments                     = 0x%" PRIxLEAST32 "\n", limits->maxColorAttachments                    );
9057dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSampledImageColorSamples             = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageColorSamples            );
9067dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSampledImageDepthSamples             = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageDepthSamples            );
9077dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSampledImageIntegerSamples           = 0x%" PRIxLEAST32 "\n", limits->maxSampledImageIntegerSamples          );
9087dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxStorageImageSamples                  = 0x%" PRIxLEAST32 "\n", limits->maxStorageImageSamples                 );
9097dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxSampleMaskWords                      = 0x%" PRIxLEAST32 "\n", limits->maxSampleMaskWords                     );
910c789f69f07b921211ca6929db9413598e9a574e7Chia-I Wu    printf("\t\ttimestampPeriod                         = 0x%f\n",               limits->timestampPeriod                        );
9117dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxClipDistances                        = 0x%" PRIxLEAST32 "\n", limits->maxClipDistances                       );
9127dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxCullDistances                        = 0x%" PRIxLEAST32 "\n", limits->maxCullDistances                       );
9137dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tmaxCombinedClipAndCullDistances         = 0x%" PRIxLEAST32 "\n", limits->maxCombinedClipAndCullDistances        );
9147dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tpointSizeRange[0]                       = %f\n",                 limits->pointSizeRange[0]                      );
9157dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tpointSizeRange[1]                       = %f\n",                 limits->pointSizeRange[1]                      );
9167dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tlineWidthRange[0]                       = %f\n",                 limits->lineWidthRange[0]                      );
9177dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tlineWidthRange[1]                       = %f\n",                 limits->lineWidthRange[1]                      );
9187dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tpointSizeGranularity                    = %f\n",                 limits->pointSizeGranularity                   );
9197dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    printf("\t\tlineWidthGranularity                    = %f\n",                 limits->lineWidthGranularity                   );
9203c332106cb0750f6a5a34f58a2e0735635ee7e97Chia-I Wu    printf("\t\tstrictLines                             = %u\n",                 limits->strictLines                            );
9213ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\trecommendedBufferCopyOffsetAlignment    = 0x%" PRIxLEAST64 "\n", limits->recommendedBufferCopyOffsetAlignment   );
9223ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu    printf("\t\trecommendedBufferCopyRowPitchAlignment  = 0x%" PRIxLEAST64 "\n", limits->recommendedBufferCopyRowPitchAlignment );
923d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
924d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
92518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_gpu_dump_props(const struct app_gpu *gpu)
92618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{
92718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    const VkPhysicalDeviceProperties *props = &gpu->props;
92818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
929825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("VkPhysicalDeviceProperties:\n");
930825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("===========================\n");
931825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tapiVersion     = %u\n",                props->apiVersion);
932825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdriverVersion  = %u\n",                props->driverVersion);
933825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tvendorId       = 0x%04x\n",            props->vendorId);
934825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdeviceId       = 0x%04x\n",            props->deviceId);
935825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdeviceType     = %s\n",                vk_physical_device_type_string(props->deviceType));
936825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tdeviceName     = %s\n",                props->deviceName);
9377dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
9387dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    app_dump_limits(&gpu->props.limits);
9397dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski    app_dump_sparse_props(&gpu->props.sparseProperties);
9407dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski
94118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    fflush(stdout);
94218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}
94318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
94418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_dump_extensions(
94518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        const char *indent,
94618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        const char *layer_name,
94718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        const uint32_t extension_count,
94818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        const VkExtensionProperties *extension_properties)
9493c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{
9503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t i;
95118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    if (layer_name && (strlen(layer_name) > 0)) {
95218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        printf("%s%s Extensions", indent, layer_name);
95318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    } else {
95418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        printf("Extensions");
9553c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
95618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    printf("\tcount = %d\n", extension_count);
95718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    for (i=0; i< extension_count; i++) {
95818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkExtensionProperties const *ext_prop = &extension_properties[i];
9593c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
960ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter        if (i>0)
96118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter            printf("\n"); // separator between extensions
96218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
96318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        printf("%s\t", indent);
964d5b6e890d23a20280a2bed4a5358db1d8fafb74bIan Elliott        printf("%-32s: extension revision %2d",
965d5b6e890d23a20280a2bed4a5358db1d8fafb74bIan Elliott                       ext_prop->extName, ext_prop->specVersion);
966ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    }
967ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("\n");
96818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    fflush(stdout);
969ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter}
970ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter
971e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id)
972d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
973ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop    const VkQueueFamilyProperties *props = &gpu->queue_props[id];
974190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
975825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("VkQueueFamilyProperties[%d]:\n", id);
976825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("============================\n");
977b21a51a4aae758d8b8f622eb7ca363bb7896cb00Chia-I Wu    printf("\tqueueFlags         = %c%c%c\n",
9789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.',
9799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_COMPUTE_BIT)  ? 'C' : '.',
980b21a51a4aae758d8b8f622eb7ca363bb7896cb00Chia-I Wu            (props->queueFlags & VK_QUEUE_DMA_BIT)      ? 'D' : '.');
981825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tqueueCount         = %u\n",   props->queueCount);
98268535a67f71882ce0a4a915e2e9ddc9e2fb6c761Courtney Goeltzenleuchter    printf("\ttimestampValidBits = %u\n",   props->timestampValidBits);
98318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    fflush(stdout);
984d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
985d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
986d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_memory_props(const struct app_gpu *gpu)
987d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
9888205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props;
989d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
990825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("VkPhysicalDeviceMemoryProperties:\n");
991825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("=================================\n");
992825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tmemoryTypeCount       = %u\n", props->memoryTypeCount);
993723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    for (uint32_t i = 0; i < props->memoryTypeCount; i++) {
994723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\tmemoryTypes[%u] : \n", i);
995723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags);
996723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\t\theapIndex     = %u\n", props->memoryTypes[i].heapIndex);
997723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
998825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("\tmemoryHeapCount       = %u\n",                props->memoryHeapCount);
999723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    for (uint32_t i = 0; i < props->memoryHeapCount; i++) {
1000723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\tmemoryHeaps[%u] : \n", i);
1001825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski        printf("\t\tsize          = " PRINTF_SIZE_T_SPECIFIER "\n", props->memoryHeaps[i].size);
1002723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
100318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    fflush(stdout);
1004d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
1005d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
1006d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump(const struct app_gpu *gpu)
1007d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
1008e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t i;
1009190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
1010825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("Device Extensions and layers:\n");
1011825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("=============================\n");
1012190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("GPU%u\n", gpu->id);
1013190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_gpu_dump_props(gpu);
1014190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\n");
1015825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    app_dump_extensions("", "Device", gpu->device_extension_count, gpu->device_extensions);
101618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    printf("\n");
101718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    printf("Layers\tcount = %d\n", gpu->device_layer_count);
101818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    for (uint32_t i = 0; i < gpu->device_layer_count; i++) {
101918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        uint32_t major, minor, patch;
102018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        char spec_version[64], layer_version[64];
102118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        struct layer_extension_list const *layer_info = &gpu->device_layers[i];
102218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
102318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        extract_version(layer_info->layer_properties.specVersion, &major, &minor, &patch);
102418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch);
102518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        extract_version(layer_info->layer_properties.implVersion, &major, &minor, &patch);
102618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch);
102718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        printf("\t%s (%s) Vulkan version %s, layer version %s\n",
102818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter               layer_info->layer_properties.layerName,
10293f26dee9c7577a32f4a104a8d2028f4b1f2aeae6Ian Elliott               (char*) layer_info->layer_properties.description,
103018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter               spec_version, layer_version);
103118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
103218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        app_dump_extensions("\t",
103318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            layer_info->layer_properties.layerName,
103418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            layer_info->extension_count,
103518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            layer_info->extension_properties);
103618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        fflush(stdout);
103718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    }
1038ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("\n");
1039190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu->queue_count; i++) {
1040190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_dump_queue_props(gpu, i);
1041190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\n");
1042190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
1043190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_gpu_dump_memory_props(gpu);
1044190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\n");
1045a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    app_gpu_dump_features(gpu);
1046a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\n");
1047190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_dev_dump(&gpu->dev);
1048d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
1049d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
1050d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuint main(int argc, char **argv)
1051d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
10527b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    unsigned int major, minor, patch;
10537b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    struct app_gpu gpus[MAX_GPUS];
10548205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDevice objs[MAX_GPUS];
1055e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t gpu_count, i;
1056382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult err;
10573c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    struct app_instance inst;
1058190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
10597b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    major = VK_API_VERSION >> 22;
10607b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    minor = (VK_API_VERSION >> 12) & 0x4ff;
10617b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    patch = VK_API_VERSION & 0xfff;
10627b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo    printf("===========\n");
1063b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo	printf("VULKAN INFO\n");
1064b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo    printf("===========\n\n");
1065b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo    printf("Vulkan API Version: %d %d %d\n\n", major, minor, patch);
1066b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo
10673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    app_create_instance(&inst);
106818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
1069825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("Instance Extensions and layers:\n");
1070825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("===============================\n");
1071825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    app_dump_extensions("", "Instance", inst.global_extension_count, inst.global_extensions);
1072825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski
1073825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski    printf("Instance Layers\tcount = %d\n", inst.global_layer_count);
107418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    for (uint32_t i = 0; i < inst.global_layer_count; i++) {
107518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        uint32_t major, minor, patch;
107618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        char spec_version[64], layer_version[64];
107718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        VkLayerProperties const *layer_prop = &inst.global_layers[i].layer_properties;
107818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
107918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        extract_version(layer_prop->specVersion, &major, &minor, &patch);
108018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch);
108118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        extract_version(layer_prop->implVersion, &major, &minor, &patch);
108218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch);
108318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        printf("\t%s (%s) Vulkan version %s, layer version %s\n",
10843f26dee9c7577a32f4a104a8d2028f4b1f2aeae6Ian Elliott               layer_prop->layerName, (char*) layer_prop->description, spec_version, layer_version);
108518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
108618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter        app_dump_extensions("\t",
108718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            inst.global_layers[i].layer_properties.layerName,
108818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            inst.global_layers[i].extension_count,
108918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter                            inst.global_layers[i].extension_properties);
109018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    }
109129669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn
10923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL);
109307b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    if (err)
109407b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn        ERR_EXIT(err);
109507b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    if (gpu_count > MAX_GPUS) {
109618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        printf("Too many GPUS found \n");
1097ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter        ERR_EXIT(-1);
109807b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    }
10993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs);
1100190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    if (err)
1101190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        ERR_EXIT(err);
1102190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
1103190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu_count; i++) {
1104190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_init(&gpus[i], i, objs[i]);
1105190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_dump(&gpus[i]);
1106190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\n\n");
1107190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
1108190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
1109190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu_count; i++)
1110190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_destroy(&gpus[i]);
1111190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
11123c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    app_destroy_instance(&inst);
11130b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu
1114190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    return 0;
1115d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
1116ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott
1117ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32
111818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
111918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Create a console window with a large scrollback size to which to send stdout.
112018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Returns true if console window was successfully created, false otherwise.
112118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool SetStdOutToNewConsole()
112218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo{
112318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // don't do anything if we already have a console
112418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (GetStdHandle(STD_OUTPUT_HANDLE))
112518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
112618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
112718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // allocate a console for this app
112818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    AllocConsole();
112918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
113018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // redirect unbuffered STDOUT to the console
113118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
113218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
113318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    FILE *fp = _fdopen( fileDescriptor, "w" );
113418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    *stdout = *fp;
113518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    setvbuf( stdout, NULL, _IONBF, 0 );
113618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
113718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // make the console window bigger
113818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    CONSOLE_SCREEN_BUFFER_INFO csbi;
113918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    SMALL_RECT r;
114018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    COORD bufferSize;
114118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
114218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
1143d188757e3644ce0b7fda6228a2d4fccde4c67701David Pinedo    bufferSize.X = csbi.dwSize.X+30;
1144e1b115fdf18e54ebfd90e3990ad775527a38534bDavid Pinedo    bufferSize.Y = 20000;
114518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize))
114618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
114718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    r.Left = r.Top = 0;
1148d188757e3644ce0b7fda6228a2d4fccde4c67701David Pinedo    r.Right = csbi.dwSize.X-1+30;
11493bf020c230cf7931af430c4918a22cd046edbb9bDavid Pinedo    r.Bottom = 50;
115018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!SetConsoleWindowInfo(consoleHandle, true, &r))
115118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
115218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
115318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // change the console window title
11544e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott    if (!SetConsoleTitle(TEXT(APP_SHORT_NAME)))
115518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
115618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
115718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    return true;
115818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo}
115918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
1160ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliottint WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
1161ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott{
1162ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    char *argv = pCmdLine;
116318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    consoleCreated = SetStdOutToNewConsole();
1164ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    main(1, &argv);
1165ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    fflush(stdout);
116618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (consoleCreated)
116718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        Sleep(INFINITE);
1168ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott}
1169ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif
1170