vulkaninfo.c revision a048b3146ed9bc094adf4d6ba7355cd8a5ef7008
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>
29d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
30ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32
31ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#include <Windows.h>
3218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h>
3318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h>
34ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif
35ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott
369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include <vulkan.h>
3746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
3846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ERR(err) printf("%s:%d: failed with %s\n", \
399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    __FILE__, __LINE__, vk_result_string(err));
4046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32
4218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
4318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool consoleCreated = false;
4418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
4518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define WAIT_FOR_CONSOLE_DESTROY \
4618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    do { \
4718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        if (consoleCreated) \
4818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo            Sleep(INFINITE); \
4918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    } while (0)
5018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else
5118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    #define WAIT_FOR_CONSOLE_DESTROY
5218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif
5318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
5418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
5518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define ERR_EXIT(err) \
5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    do { \
5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        ERR(err); \
5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        fflush(stdout); \
5918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        WAIT_FOR_CONSOLE_DESTROY; \
6018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        exit(-1); \
6118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo   } while (0)
6246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
6322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__)
6422a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused))
6522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else
6622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY
6722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif
6822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour
6946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
7046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8
7246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5
744e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo"
7546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu;
7746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
7846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev {
7946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    struct app_gpu *gpu; /* point back to the GPU */
8046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
81382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkDevice obj;
8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
8346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
848205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkFormatProperties format_props[VK_NUM_FORMAT];
8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu};
8646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance {
883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkInstance  instance;
893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t global_extension_count;
903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *global_extensions;
913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter};
923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu {
94e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t id;
958205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDevice obj;
9646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
978205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceProperties props;
988205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDevicePerformance perf;
9946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
100e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t queue_count;
1018205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceQueueProperties *queue_props;
102ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkDeviceQueueCreateInfo *queue_reqs;
10346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
1048205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceMemoryProperties memory_props;
105a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    VkPhysicalDeviceFeatures features;
106a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    VkPhysicalDeviceLimits limits;
10746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
1083c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t device_extension_count;
1093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *device_extensions;
11046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
11146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    struct app_dev dev;
11246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu};
11346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
114382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_result_string(VkResult err)
11546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
11646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    switch (err) {
11746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define STR(r) case r: return #r
1189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_SUCCESS);
1199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_UNSUPPORTED);
1209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_NOT_READY);
1219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_TIMEOUT);
1229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_EVENT_SET);
1239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_EVENT_RESET);
1249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_UNKNOWN);
1259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_UNAVAILABLE);
1269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INITIALIZATION_FAILED);
1278205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VK_ERROR_OUT_OF_HOST_MEMORY);
1288205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
1299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_DEVICE_ALREADY_CREATED);
1309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_DEVICE_LOST);
1319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_POINTER);
1329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_VALUE);
1339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_HANDLE);
1349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_ORDINAL);
1359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_MEMORY_SIZE);
1369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_EXTENSION);
1379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_FLAGS);
1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_ALIGNMENT);
1399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_FORMAT);
1409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_IMAGE);
1419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_DESCRIPTOR_SET_DATA);
1429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_QUEUE_TYPE);
1439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INVALID_OBJECT_TYPE);
1449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION);
1459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_BAD_SHADER_CODE);
1469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_BAD_PIPELINE_DATA);
1479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_NOT_MAPPABLE);
1489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_MEMORY_MAP_FAILED);
1499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_MEMORY_UNMAP_FAILED);
1509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INCOMPATIBLE_DEVICE);
1519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INCOMPATIBLE_DRIVER);
1529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INCOMPLETE_COMMAND_BUFFER);
1539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_BUILDING_COMMAND_BUFFER);
1549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_MEMORY_NOT_BOUND);
1559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    STR(VK_ERROR_INCOMPATIBLE_QUEUE);
15646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR
15746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    default: return "UNKNOWN_RESULT";
15846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
15946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
160d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
1618205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type)
162d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
163190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    switch (type) {
1648205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_PHYSICAL_DEVICE_TYPE_ ##r: return #r
165190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    STR(OTHER);
1668205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(INTEGRATED_GPU);
1678205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(DISCRETE_GPU);
1688205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    STR(VIRTUAL_GPU);
169d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR
1708205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    default: return "UNKNOWN_DEVICE";
171190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
172d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
173d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
174382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_format_string(VkFormat fmt)
175d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
1762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    switch (fmt) {
1778205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_FORMAT_ ##r: return #r
178190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    STR(UNDEFINED);
1792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4_UNORM);
1802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4_USCALED);
1812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4B4A4_UNORM);
1822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R4G4B4A4_USCALED);
1832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G6B5_UNORM);
1842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G6B5_USCALED);
1852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G5B5A1_UNORM);
1862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R5G5B5A1_USCALED);
1872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_UNORM);
1882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SNORM);
1892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_USCALED);
1902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SSCALED);
1912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_UINT);
1922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SINT);
1932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8_SRGB);
1942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_UNORM);
1952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SNORM);
1962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_USCALED);
1972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SSCALED);
1982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_UINT);
1992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SINT);
2002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8_SRGB);
2012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_UNORM);
2022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SNORM);
2032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_USCALED);
2042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SSCALED);
2052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_UINT);
2062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SINT);
2072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8_SRGB);
2082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_UNORM);
2092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SNORM);
2102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_USCALED);
2112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SSCALED);
2122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_UINT);
2132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SINT);
2142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R8G8B8A8_SRGB);
2152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_UNORM);
2162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SNORM);
2172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_USCALED);
2182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SSCALED);
2192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_UINT);
2202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R10G10B10A2_SINT);
2212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_UNORM);
2222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SNORM);
2232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_USCALED);
2242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SSCALED);
2252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_UINT);
2262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SINT);
2272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16_SFLOAT);
2282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_UNORM);
2292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SNORM);
2302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_USCALED);
2312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SSCALED);
2322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_UINT);
2332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SINT);
2342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16_SFLOAT);
2352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_UNORM);
2362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SNORM);
2372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_USCALED);
2382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SSCALED);
2392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_UINT);
2402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SINT);
2412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16_SFLOAT);
2422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_UNORM);
2432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SNORM);
2442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_USCALED);
2452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SSCALED);
2462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_UINT);
2472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SINT);
2482b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R16G16B16A16_SFLOAT);
2492b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_UINT);
2502b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_SINT);
2512b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32_SFLOAT);
2522b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_UINT);
2532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_SINT);
2542b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32_SFLOAT);
2552b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_UINT);
2562b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_SINT);
2572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32_SFLOAT);
2582b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_UINT);
2592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_SINT);
2602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R32G32B32A32_SFLOAT);
2612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64_SFLOAT);
2622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64_SFLOAT);
2632b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64B64_SFLOAT);
2642b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R64G64B64A64_SFLOAT);
2652b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R11G11B10_UFLOAT);
2662b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(R9G9B9E5_UFLOAT);
2672b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D16_UNORM);
2682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D24_UNORM);
2692b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D32_SFLOAT);
2702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(S8_UINT);
2712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D16_UNORM_S8_UINT);
2722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D24_UNORM_S8_UINT);
2732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(D32_SFLOAT_S8_UINT);
274fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(BC1_RGB_UNORM);
275fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(BC1_RGB_SRGB);
2762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC2_UNORM);
2772b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC2_SRGB);
2782b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC3_UNORM);
2792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC3_SRGB);
2802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC4_UNORM);
2812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC4_SNORM);
2822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC5_UNORM);
2832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC5_SNORM);
2842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC6H_UFLOAT);
2852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC6H_SFLOAT);
2862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC7_UNORM);
2872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(BC7_SRGB);
2882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8_UNORM);
2892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8A1_UNORM);
2902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ETC2_R8G8B8A8_UNORM);
2912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11_UNORM);
2922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11_SNORM);
2932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11G11_UNORM);
2942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(EAC_R11G11_SNORM);
2952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_4x4_UNORM);
2962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_4x4_SRGB);
297fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(ASTC_5x4_UNORM);
298fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter    STR(ASTC_5x4_SRGB);
2992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_5x5_UNORM);
3002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_5x5_SRGB);
3012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x5_UNORM);
3022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x5_SRGB);
3032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x6_UNORM);
3042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_6x6_SRGB);
3052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x5_UNORM);
3062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x5_SRGB);
3072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x6_UNORM);
3082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x6_SRGB);
3092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x8_UNORM);
3102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_8x8_SRGB);
3112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x5_UNORM);
3122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x5_SRGB);
3132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x6_UNORM);
3142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x6_SRGB);
3152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x8_UNORM);
3162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x8_SRGB);
3172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x10_UNORM);
3182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_10x10_SRGB);
3192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x10_UNORM);
3202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x10_SRGB);
3212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x12_UNORM);
3222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(ASTC_12x12_SRGB);
3232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B5G6R5_UNORM);
3242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B5G6R5_USCALED);
3252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_UNORM);
3262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SNORM);
3272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_USCALED);
3282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SSCALED);
3292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_UINT);
3302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SINT);
3312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8_SRGB);
3322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_UNORM);
3332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SNORM);
3342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_USCALED);
3352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SSCALED);
3362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_UINT);
3372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SINT);
3382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B8G8R8A8_SRGB);
3392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_UNORM);
3402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SNORM);
3412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_USCALED);
3422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SSCALED);
3432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_UINT);
3442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    STR(B10G10R10A2_SINT);
345d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR
3462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes    default: return "UNKNOWN_FORMAT";
347190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
348d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
349d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
35046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init_formats(struct app_dev *dev)
35146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
352382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormat f;
3532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes
3548205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    for (f = 0; f < VK_NUM_FORMAT; f++) {
355382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        const VkFormat fmt = f;
356382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkResult err;
3572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes
358d757630a88456aa57e5699f42d96896f17d2f624Chris Forbes        err = vkGetPhysicalDeviceFormatInfo(dev->gpu->obj, fmt, &dev->format_props[f]);
3592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes        if (err) {
3602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes            memset(&dev->format_props[f], 0,
3612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes                   sizeof(dev->format_props[f]));
3622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes        }
36346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
36446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
36546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
36646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu)
36746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
368ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkDeviceCreateInfo info = {
3699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
37046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .pNext = NULL,
37146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .queueRecordCount = 0,
37246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .pRequestedQueues = NULL,
37346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        .extensionCount = 0,
3741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        .pEnabledExtensions = NULL,
37580d3b716eb7e4c2d4acab18e620298735672b268Jon Ashburn        .flags = 0,
37646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    };
3773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkResult U_ASSERT_ONLY err;
3783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    // Extensions to enable
3793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *enable_extension_list;
3803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    static char *known_extensions[] = {
381e880e9bfd899c6c747b053cfb09f5d59168221b8Courtney Goeltzenleuchter        "VK_WSI_LunarG",
3823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        "Validation",
3833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
384426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
385426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    uint32_t extCount;
386426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDeviceExtensionCount(gpu->obj, &extCount);
3873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    assert(!err);
3883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
3893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    enable_extension_list = malloc(sizeof(VkExtensionProperties) * extCount);
3903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (!enable_extension_list) {
3913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
3923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
3933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
3949e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter    fflush(stdout);
3959e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter
3963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties extProp;
3973c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    gpu->device_extension_count = 0;
3983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    bool32_t U_ASSERT_ONLY extFound = 0; // TODO : Need to enhance this if/when we enable multiple extensions
3993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) {
4003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        for (uint32_t j = 0; j < extCount; j++) {
401426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour            err = vkGetPhysicalDeviceExtensionProperties(
402426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour                      gpu->obj, j, &extProp);
4033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            if (!strcmp(known_extensions[i], extProp.name)) {
4043c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                extFound = 1;
4053c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                memcpy(&enable_extension_list[gpu->device_extension_count], &extProp, sizeof(extProp));
4063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                gpu->device_extension_count++;
4079e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter                printf("%s: %s\n", extProp.name, extProp.description);
4089e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter                fflush(stdout);
4093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            }
4103c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        }
4113c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
4123c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    assert(extFound);
4133c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
4143c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    gpu->device_extensions = enable_extension_list;
41546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
41646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* request all queues */
41746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    info.queueRecordCount = gpu->queue_count;
41846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    info.pRequestedQueues = gpu->queue_reqs;
41946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
420a7e408fed6c19d5113a319b0ec309ad899d5d067Courtney Goeltzenleuchter    info.extensionCount = gpu->device_extension_count;
4213c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    info.pEnabledExtensions = enable_extension_list;
4223c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    dev->gpu = gpu;
4233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkCreateDevice(gpu->obj, &info, &dev->obj);
4243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (err)
4253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
42646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
42746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
42846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
42946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_destroy(struct app_dev *dev)
43046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
4319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    vkDestroyDevice(dev->obj);
43246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
43346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4343c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_create_instance(struct app_instance *inst)
43546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
4363c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    const VkApplicationInfo app_info = {
4373c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
4383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pNext = NULL,
4393c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pAppName = APP_SHORT_NAME,
4403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .appVersion = 1,
4413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pEngineName = APP_SHORT_NAME,
4423c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .engineVersion = 1,
4433c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .apiVersion = VK_API_VERSION,
4443c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
4453c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkInstanceCreateInfo inst_info = {
4463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
4473c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pNext = NULL,
4483c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pAppInfo = &app_info,
4493c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pAllocCb = NULL,
4503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .extensionCount = 0,
4513c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        .pEnabledExtensions = NULL,
4523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    };
45322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour    VkResult U_ASSERT_ONLY err;
4543c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    // Global Extensions to enable
455aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott    static char *known_extensions[] = {
45697b4c5d6d4f50d5c4f3c5c4f715462b6a7db94e7Tobin Ehlis        "VK_WSI_LunarG",
45746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    };
458426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
4593536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis    uint32_t extCount = 0;
4603c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties extProp;
4613c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    VkExtensionProperties *enable_extension_list;
4623c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t global_extension_count = 0;
4633c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
464426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetGlobalExtensionCount(&extCount);
4653536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis    assert(!err);
4663536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis
4673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    enable_extension_list = malloc(sizeof(VkExtensionProperties) * extCount);
4683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (!enable_extension_list) {
4693c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
4703c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
4713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
47222a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour    bool32_t U_ASSERT_ONLY extFound = 0; // TODO : Need to enhance this if/when we enable multiple extensions
4733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) {
4743c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        for (uint32_t j = 0; j < extCount; j++) {
475426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour            err = vkGetGlobalExtensionProperties(j, &extProp);
4763c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            if (!strcmp(known_extensions[i], extProp.name)) {
4773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                extFound = 1;
4783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                memcpy(&enable_extension_list[global_extension_count], &extProp, sizeof(extProp));
4793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter                global_extension_count++;
4803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            }
4813536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis        }
48246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
4833536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis    assert(extFound);
48446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    inst_info.extensionCount = global_extension_count;
4863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    inst_info.pEnabledExtensions = enable_extension_list;
48746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
4883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkCreateInstance(&inst_info, &inst->instance);
4893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
4903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        printf("Cannot create Vulkan instance.\n");
4913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
4923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    } else if (err) {
4933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        ERR_EXIT(err);
49446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
4953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
4963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    inst->global_extension_count = global_extension_count;
4973c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    inst->global_extensions = enable_extension_list;
4983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}
4993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
5003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_destroy_instance(struct app_instance *inst)
5013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{
5023c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    free(inst->global_extensions);
5033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    vkDestroyInstance(inst->instance);
50446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
50546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
5063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
5078205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, VkPhysicalDevice obj)
50846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
509382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult err;
510aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott    uint32_t i;
51146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
51246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    memset(gpu, 0, sizeof(*gpu));
51346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
51446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->id = id;
51546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->obj = obj;
516426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
517426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props);
518426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    if (err)
51946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        ERR_EXIT(err);
52046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
521426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDevicePerformance(gpu->obj, &gpu->perf);
522426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    if (err)
52346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        ERR_EXIT(err);
52446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
52546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* get queue count */
526426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDeviceQueueCount(gpu->obj, &gpu->queue_count);
527426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    if (err)
52846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        ERR_EXIT(err);
52946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
53046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->queue_props =
53146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu            malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count);
532426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour
53346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    if (!gpu->queue_props)
5348205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
535426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDeviceQueueProperties(gpu->obj, gpu->queue_count, gpu->queue_props);
536426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    if (err)
53746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        ERR_EXIT(err);
53846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
53946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    /* set up queue requests */
54046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count);
54146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    if (!gpu->queue_reqs)
5428205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour        ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
54346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    for (i = 0; i < gpu->queue_count; i++) {
54446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        gpu->queue_reqs[i].queueNodeIndex = i;
54546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount;
54646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    }
54746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
548426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    err = vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props);
549426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    if (err)
55046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu        ERR_EXIT(err);
55146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
552a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    err = vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features);
553a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    if (err)
554a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes        ERR_EXIT(err);
555a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
556a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    err = vkGetPhysicalDeviceLimits(gpu->obj, &gpu->limits);
557a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    if (err)
558a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes        ERR_EXIT(err);
559a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
56046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_init(&gpu->dev, gpu);
56146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_init_formats(&gpu->dev);
56246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
56346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
56446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_gpu_destroy(struct app_gpu *gpu)
56546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{
56646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    app_dev_destroy(&gpu->dev);
5673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    free(gpu->device_extensions);
56846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    free(gpu->queue_reqs);
56946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu    free(gpu->queue_props);
57046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}
57146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu
572382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt)
573d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
574382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    const VkFormatProperties *props = &dev->format_props[fmt];
575190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    struct {
576190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        const char *name;
577382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFlags flags;
578190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    } tilings[2];
579e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t i;
580190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
581190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    if (!props->linearTilingFeatures && !props->optimalTilingFeatures)
582190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        return;
583190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
584190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    tilings[0].name = "linear";
585190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    tilings[0].flags = props->linearTilingFeatures;
586190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    tilings[1].name = "optimal";
587190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    tilings[1].flags = props->optimalTilingFeatures;
588190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
5899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    printf("FORMAT_%s\n", vk_format_string(fmt));
590190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < ARRAY_SIZE(tilings); i++) {
591190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        if (!tilings[i].flags)
592190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu            continue;
593190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
594190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\t%s tiling image =%s%s%s\n", tilings[i].name,
5958205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)      ? " sampled" : "",
5968205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)   ? " storage" : "",
5978205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? " atomic" : "");
598ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter        printf("\t%s tiling texel =%s%s%s\n", tilings[i].name,
5998205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)      ? " TBO" : "",
6008205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)   ? " IBO" : "",
6018205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? " atomic" : "");
602ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter        printf("\t%s tiling attachment =%s%s%s\n", tilings[i].name,
6038205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? " color" : "",
6048205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? " blend" : "",
6058205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (tilings[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)       ? " depth/stencil" : "");
606ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter        printf("\t%s tiling vertex = %u\n", tilings[i].name,
6078205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (bool) (tilings[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT));
608190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\t%s tiling conversion = %u\n", tilings[i].name,
6098205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                (bool) (tilings[i].flags & VK_FORMAT_FEATURE_CONVERSION_BIT));
610190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
611d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
612d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
613d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
614d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void
615d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev)
616d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
617382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormat fmt;
618190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
6198205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    for (fmt = 0; fmt < VK_NUM_FORMAT; fmt++) {
6202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes        app_dev_dump_format_props(dev, fmt);
621190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
622d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
623d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
624009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32
625009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER    "%Iu"
626009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else
627009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER    "%zu"
628009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif
629009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan
630d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_props(const struct app_gpu *gpu)
631d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
6328205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    const VkPhysicalDeviceProperties *props = &gpu->props;
633190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
6348205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("VkPhysicalDeviceProperties\n");
635190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tapiVersion = %u\n",                   props->apiVersion);
636190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tdriverVersion = %u\n",                props->driverVersion);
637190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tvendorId = 0x%04x\n",                 props->vendorId);
638190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tdeviceId = 0x%04x\n",                 props->deviceId);
6398205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("\tdeviceType = %s\n",                   vk_physical_device_type_string(props->deviceType));
6408205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("\tdeviceName = %s\n",                   props->deviceName);
641a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes}
642a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
643a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu)
644a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{
645a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    const VkPhysicalDeviceFeatures *features = &gpu->features;
646a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
647a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("VkPhysicalDeviceFeatures\n");
648a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    /* TODO: add interesting features */
649a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\tgeometryShader = %u\n",               features->geometryShader);
650a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes}
651a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
652a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_limits(const struct app_gpu *gpu)
653a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{
654a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    const VkPhysicalDeviceLimits *limits = &gpu->limits;
655a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes
656a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("VkPhysicalDeviceLimits\n");
657a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    /* TODO: add interesting limits */
658a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\tmaxInlineMemoryUpdateSize = " PRINTF_SIZE_T_SPECIFIER "\n",   limits->maxInlineMemoryUpdateSize);
659a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\tmaxBoundDescriptorSets = %u\n",                               limits->maxBoundDescriptorSets);
660a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\tmaxComputeWorkGroupInvocations = %u\n",                       limits->maxComputeWorkGroupInvocations);
661a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\ttimestampFrequency = %lu\n",                                  limits->timestampFrequency);
662d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
663d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
664d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_perf(const struct app_gpu *gpu)
665d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
6668205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    const VkPhysicalDevicePerformance *perf = &gpu->perf;
667190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
6688205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("VkPhysicalDevicePerformance\n");
6698205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("\tmaxGpuClock = %f\n",      perf->maxDeviceClock);
670190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\taluPerClock = %f\n",      perf->aluPerClock);
671190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\ttexPerClock = %f\n",      perf->texPerClock);
672190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tprimsPerClock = %f\n",    perf->primsPerClock);
673190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tpixelsPerClock = %f\n",   perf->pixelsPerClock);
674d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
675d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
6763c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_gpu_dump_instance_extensions(const struct app_instance *inst)
6773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{
6783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    uint32_t i;
6793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    printf("Extensions");
6803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    printf("\tcount = %d\n",            inst->global_extension_count);
6813c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    printf("\t");
6823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    for (i=0; i< inst->global_extension_count; i++) {
6833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        if (i>0)
6843c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter            printf(", "); // separator between extension names
6853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        printf("%s",                    inst->global_extensions[i].name);
6863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    }
6873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    printf("\n");
6883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}
6893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter
690ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchterstatic void app_gpu_dump_extensions(const struct app_gpu *gpu)
691ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter{
692aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott    uint32_t i;
693ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("Extensions");
6943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    printf("\tcount = %d\n",            gpu->device_extension_count);
695ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("\t");
6963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    for (i=0; i< gpu->device_extension_count; i++) {
697ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter        if (i>0)
698ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter            printf(", "); // separator between extension names
6993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter        printf("%s(%d): %s", gpu->device_extensions[i].name,
7003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter               gpu->device_extensions[i].version,
7013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter               gpu->device_extensions[i].description);
702ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    }
703ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("\n");
704ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter}
705ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter
706e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id)
707d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
7088205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    const VkPhysicalDeviceQueueProperties *props = &gpu->queue_props[id];
709190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
7108205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("VkPhysicalDeviceQueueProperties[%d]\n", id);
711190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tqueueFlags = %c%c%c%c\n",
7129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.',
7139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_COMPUTE_BIT)  ? 'C' : '.',
7149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_DMA_BIT)      ? 'D' : '.',
7159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter            (props->queueFlags & VK_QUEUE_EXTENDED_BIT) ? 'X' : '.');
716190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tqueueCount = %u\n",           props->queueCount);
717190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\tsupportsTimestamps = %u\n",   props->supportsTimestamps);
718d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
719d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
720d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_memory_props(const struct app_gpu *gpu)
721d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
7228205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props;
723d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
7248205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    printf("VkPhysicalDeviceMemoryProperties\n");
725723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    printf("\tmemoryTypeCount = %u\n",                props->memoryTypeCount);
726723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    for (uint32_t i = 0; i < props->memoryTypeCount; i++) {
727723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\tmemoryTypes[%u] : \n", i);
728723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags);
729723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\t\theapIndex     = %u\n", props->memoryTypes[i].heapIndex);
730723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
731723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    printf("\tmemoryHeapCount = %u\n",                props->memoryHeapCount);
732723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    for (uint32_t i = 0; i < props->memoryHeapCount; i++) {
733723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\tmemoryHeaps[%u] : \n", i);
734723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", props->memoryHeaps[i].size);
735723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
736d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
737d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
738d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump(const struct app_gpu *gpu)
739d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
740e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t i;
741190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
742190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("GPU%u\n", gpu->id);
743190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_gpu_dump_props(gpu);
744190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\n");
745ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    app_gpu_dump_extensions(gpu);
746ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter    printf("\n");
747190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_gpu_dump_perf(gpu);
748190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\n");
749190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu->queue_count; i++) {
750190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_dump_queue_props(gpu, i);
751190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\n");
752190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
753190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_gpu_dump_memory_props(gpu);
754190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    printf("\n");
755a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    app_gpu_dump_features(gpu);
756a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\n");
757a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    app_gpu_dump_limits(gpu);
758a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes    printf("\n");
759190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    app_dev_dump(&gpu->dev);
760d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
761d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu
762d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuint main(int argc, char **argv)
763d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{
764190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    struct app_gpu gpus[MAX_GPUS];
7658205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDevice objs[MAX_GPUS];
766e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski    uint32_t gpu_count, i;
767382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult err;
7683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    struct app_instance inst;
769190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
7703c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    app_create_instance(&inst);
7713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    app_gpu_dump_instance_extensions(&inst);
77229669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn
7733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL);
77407b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    if (err)
77507b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn        ERR_EXIT(err);
77607b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    if (gpu_count > MAX_GPUS) {
77718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        printf("Too many GPUS found \n");
77818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        ERR_EXIT(VK_ERROR_UNKNOWN);
77907b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn    }
7803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs);
781190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    if (err)
782190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        ERR_EXIT(err);
783190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
784190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu_count; i++) {
785190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_init(&gpus[i], i, objs[i]);
786190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_dump(&gpus[i]);
787190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        printf("\n\n");
788190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    }
789190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
790190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    for (i = 0; i < gpu_count; i++)
791190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu        app_gpu_destroy(&gpus[i]);
792190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu
7933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter    app_destroy_instance(&inst);
7940b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu
795190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu    return 0;
796d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu}
797ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott
798ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32
79918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
80018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Create a console window with a large scrollback size to which to send stdout.
80118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Returns true if console window was successfully created, false otherwise.
80218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool SetStdOutToNewConsole()
80318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo{
80418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // don't do anything if we already have a console
80518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (GetStdHandle(STD_OUTPUT_HANDLE))
80618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
80718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
80818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // allocate a console for this app
80918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    AllocConsole();
81018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
81118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // redirect unbuffered STDOUT to the console
81218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
81318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
81418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    FILE *fp = _fdopen( fileDescriptor, "w" );
81518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    *stdout = *fp;
81618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    setvbuf( stdout, NULL, _IONBF, 0 );
81718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
81818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // make the console window bigger
81918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    CONSOLE_SCREEN_BUFFER_INFO csbi;
82018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    SMALL_RECT r;
82118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    COORD bufferSize;
82218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
82318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
82418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    bufferSize.X = csbi.dwSize.X;
82518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    bufferSize.Y = 1000;
82618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize))
82718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
82818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    r.Left = r.Top = 0;
82918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    r.Right = csbi.dwSize.X-1;
83018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    r.Bottom = 60;
83118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (!SetConsoleWindowInfo(consoleHandle, true, &r))
83218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
83318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
83418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    // change the console window title
8354e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott    if (!SetConsoleTitle(TEXT(APP_SHORT_NAME)))
83618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        return false;
83718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
83818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    return true;
83918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo}
84018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo
841ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliottint WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
842ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott{
843ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    char *argv = pCmdLine;
84418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    consoleCreated = SetStdOutToNewConsole();
845ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    main(1, &argv);
846ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott    fflush(stdout);
84718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo    if (consoleCreated)
84818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo        Sleep(INFINITE);
849ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott}
850ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif
851