vulkaninfo.c revision d3995c987ba7e47700ceb54535880e782c6b04c1
146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu/* 2481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 The Khronos Group Inc. 3481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 Valve Corporation 4481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 LunarG, Inc. 546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 6481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Permission is hereby granted, free of charge, to any person obtaining a copy 7481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * of this software and/or associated documentation files (the "Materials"), to 8481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * deal in the Materials without restriction, including without limitation the 9481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * sell copies of the Materials, and to permit persons to whom the Materials are 11481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * furnished to do so, subject to the following conditions: 1246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 13481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * The above copyright notice(s) and this permission notice shall be included in 14481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * all copies or substantial portions of the Materials. 1546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 16481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * 20481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 21481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 22481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 23481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * USE OR OTHER DEALINGS IN THE MATERIALS. 2496cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * 2596cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> 2696cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: David Pinedo <david@lunarg.com> 2796cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Mark Lobodzinski <mark@lunarg.com> 2846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu */ 29d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdlib.h> 30d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdio.h> 31d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdbool.h> 32d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <string.h> 3346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h> 34825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski#include <inttypes.h> 35d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 36ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 3718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h> 3818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h> 39b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif // _WIN32 4064070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott 41329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vulkan.h> 4246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 43481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define ERR(err) \ 44481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s:%d: failed with %s\n", __FILE__, __LINE__, \ 45481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vk_result_string(err)); 4646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32 4818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 497c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf 507c83aa210365e148877f0f3698292a1b509018ffIan Elliott 51a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Returns nonzero if the console is used only for this process. Will return 52a3b7170656404199592bb65040621772f299a7f3Hugo Landau// zero if another process (such as cmd.exe) is also attached. 53a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic int ConsoleIsExclusive(void) { 54a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD pids[2]; 55a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD num_pids = GetConsoleProcessList(pids, ARRAYSIZE(pids)); 56a3b7170656404199592bb65040621772f299a7f3Hugo Landau return num_pids <= 1; 57a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 59481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY \ 60481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz do { \ 61a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (ConsoleIsExclusive()) \ 62481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz Sleep(INFINITE); \ 6318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 6418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 65481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY 6618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 6718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 68481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define ERR_EXIT(err) \ 69481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz do { \ 70481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR(err); \ 71481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz fflush(stdout); \ 72481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz WAIT_FOR_CONSOLE_DESTROY; \ 73481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz exit(-1); \ 74481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 7546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 7722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 7822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 7922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 8022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 8122a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 8346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8 8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 874e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 8846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu; 9046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev { 9246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_gpu *gpu; /* point back to the GPU */ 9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 94382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 9546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 961f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkFormatProperties format_props[VK_FORMAT_RANGE_SIZE]; 9746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 9846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstruct layer_extension_list { 10018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties layer_properties; 10118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t extension_count; 10218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_properties; 10318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}; 10418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1053c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance { 106481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkInstance instance; 10718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t global_layer_count; 10818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *global_layers; 1093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 1103c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *global_extensions; 1113c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 1123c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 11346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu { 114e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 1158205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 11646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1178205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 11846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 119e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 120ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop VkQueueFamilyProperties *queue_props; 121ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 12246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1238205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 124a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 1257dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski VkPhysicalDevice limits; 12646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 12718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t device_layer_count; 12818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers; 12918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 1313c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 13246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 13346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_dev dev; 13446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 13546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 136481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic VKAPI_ATTR VkBool32 VKAPI_CALL 137481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzdbg_callback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, 138481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint64_t srcObject, size_t location, int32_t msgCode, 139481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const char *pLayerPrefix, const char *pMsg, void *pUserData) { 140481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz char *message = (char *)malloc(strlen(pMsg) + 100); 141f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 142481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz assert(message); 143f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 144acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 145481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, 146481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 1475c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 148481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, 149481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 1505c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 151481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "INFO: [%s] Code %d : %s", pLayerPrefix, msgCode, 152481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 153acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 154481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, 155481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 156f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter } 157f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 158481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s\n", message); 159f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter fflush(stdout); 160f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter free(message); 161f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 162f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter /* 163f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * false indicates that layer should not bail-out of an 164f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * API call that had validation failures. This may mean that the 165f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * app dies inside the driver due to invalid parameter(s). 166f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * That's what would happen without validation layers, so we'll 167f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * keep that behavior here. 168f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter */ 169f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter return false; 170f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter} 171f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 172481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_result_string(VkResult err) { 17346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 174481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 175481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case r: \ 176481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 177481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_SUCCESS); 178481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_NOT_READY); 179481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_TIMEOUT); 180481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_SET); 181481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_RESET); 182481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INITIALIZATION_FAILED); 183481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_HOST_MEMORY); 184481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 185481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_DEVICE_LOST); 186481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_LAYER_NOT_PRESENT); 187481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_EXTENSION_NOT_PRESENT); 188481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_MEMORY_MAP_FAILED); 189481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INCOMPATIBLE_DRIVER); 19046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 191481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 192481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_RESULT"; 19346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 19446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 195d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 196481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type) { 197190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 198481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 199481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case VK_PHYSICAL_DEVICE_TYPE_##r: \ 200481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 201481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(OTHER); 202481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(INTEGRATED_GPU); 203481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(DISCRETE_GPU); 204481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VIRTUAL_GPU); 205d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 206481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 207481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_DEVICE"; 208190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 209d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 210d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 211481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_format_string(VkFormat fmt) { 2122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 213481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 214481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case VK_FORMAT_##r: \ 215481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 216481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(UNDEFINED); 217481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4_UNORM_PACK8); 218481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4B4A4_UNORM_PACK16); 219481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B4G4R4A4_UNORM_PACK16); 220481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G6B5_UNORM_PACK16); 221481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G6R5_UNORM_PACK16); 222481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G5B5A1_UNORM_PACK16); 223481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G5R5A1_UNORM_PACK16); 224481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A1R5G5B5_UNORM_PACK16); 225481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UNORM); 226481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SNORM); 227481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_USCALED); 228481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SSCALED); 229481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UINT); 230481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SINT); 231481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SRGB); 232481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UNORM); 233481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SNORM); 234481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_USCALED); 235481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SSCALED); 236481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UINT); 237481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SINT); 238481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SRGB); 239481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UNORM); 240481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SNORM); 241481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_USCALED); 242481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SSCALED); 243481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UINT); 244481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SINT); 245481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SRGB); 246481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UNORM); 247481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SNORM); 248481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_USCALED); 249481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SSCALED); 250481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UINT); 251481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SINT); 252481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SRGB); 253481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UNORM); 254481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SNORM); 255481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_USCALED); 256481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SSCALED); 257481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UINT); 258481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SINT); 259481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SRGB); 260481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UNORM); 261481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SNORM); 262481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_USCALED); 263481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SSCALED); 264481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UINT); 265481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SINT); 266481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SRGB); 267481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UNORM_PACK32); 268481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SNORM_PACK32); 269481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_USCALED_PACK32); 270481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SSCALED_PACK32); 271481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UINT_PACK32); 272481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SINT_PACK32); 273481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SRGB_PACK32); 274481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UNORM_PACK32); 275481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SNORM_PACK32); 276481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_USCALED_PACK32); 277481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SSCALED_PACK32); 278481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UINT_PACK32); 279481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SINT_PACK32); 280481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UNORM_PACK32); 281481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SNORM_PACK32); 282481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_USCALED_PACK32); 283481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SSCALED_PACK32); 284481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UINT_PACK32); 285481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SINT_PACK32); 286481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UNORM); 287481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SNORM); 288481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_USCALED); 289481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SSCALED); 290481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UINT); 291481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SINT); 292481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SFLOAT); 293481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UNORM); 294481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SNORM); 295481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_USCALED); 296481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SSCALED); 297481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UINT); 298481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SINT); 299481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SFLOAT); 300481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UNORM); 301481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SNORM); 302481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_USCALED); 303481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SSCALED); 304481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UINT); 305481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SINT); 306481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SFLOAT); 307481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UNORM); 308481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SNORM); 309481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_USCALED); 310481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SSCALED); 311481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UINT); 312481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SINT); 313481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SFLOAT); 314481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_UINT); 315481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SINT); 316481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SFLOAT); 317481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_UINT); 318481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SINT); 319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SFLOAT); 320481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_UINT); 321481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SINT); 322481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SFLOAT); 323481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_UINT); 324481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SINT); 325481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SFLOAT); 326481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_UINT); 327481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SINT); 328481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SFLOAT); 329481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_UINT); 330481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SINT); 331481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SFLOAT); 332481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_UINT); 333481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SINT); 334481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SFLOAT); 335481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_UINT); 336481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SINT); 337481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SFLOAT); 338481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B10G11R11_UFLOAT_PACK32); 339481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(E5B9G9R9_UFLOAT_PACK32); 340481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM); 341481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(X8_D24_UNORM_PACK32); 342481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT); 343481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(S8_UINT); 344481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM_S8_UINT); 345481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D24_UNORM_S8_UINT); 346481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT_S8_UINT); 347481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_UNORM_BLOCK); 348481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_SRGB_BLOCK); 349481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_UNORM_BLOCK); 350481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_SRGB_BLOCK); 351481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_UNORM_BLOCK); 352481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_SRGB_BLOCK); 353481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_UNORM_BLOCK); 354481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_SNORM_BLOCK); 355481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_UNORM_BLOCK); 356481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_SNORM_BLOCK); 357481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_UFLOAT_BLOCK); 358481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_SFLOAT_BLOCK); 359481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_UNORM_BLOCK); 360481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_SRGB_BLOCK); 361481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8_UNORM_BLOCK); 362481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A1_UNORM_BLOCK); 363481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A8_UNORM_BLOCK); 364481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_UNORM_BLOCK); 365481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_SNORM_BLOCK); 366481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_UNORM_BLOCK); 367481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_SNORM_BLOCK); 368481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_UNORM_BLOCK); 369481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_SRGB_BLOCK); 370481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_UNORM_BLOCK); 371481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_SRGB_BLOCK); 372481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_UNORM_BLOCK); 373481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_SRGB_BLOCK); 374481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_UNORM_BLOCK); 375481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_SRGB_BLOCK); 376481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_UNORM_BLOCK); 377481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_SRGB_BLOCK); 378481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_UNORM_BLOCK); 379481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_SRGB_BLOCK); 380481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_UNORM_BLOCK); 381481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_SRGB_BLOCK); 382481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_UNORM_BLOCK); 383481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_SRGB_BLOCK); 384481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_UNORM_BLOCK); 385481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_SRGB_BLOCK); 386481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_UNORM_BLOCK); 387481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_SRGB_BLOCK); 388481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_UNORM_BLOCK); 389481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_SRGB_BLOCK); 390481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_UNORM_BLOCK); 391481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_SRGB_BLOCK); 392481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_UNORM_BLOCK); 393481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_SRGB_BLOCK); 394481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_UNORM_BLOCK); 395481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_SRGB_BLOCK); 396d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 397481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 398481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_FORMAT"; 399190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 400d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 401d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 402481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_init_formats(struct app_dev *dev) { 403382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat f; 4042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 4051f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (f = 0; f < VK_FORMAT_RANGE_SIZE; f++) { 406382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormat fmt = f; 4072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 408481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, 409481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dev->format_props[f]); 41046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 41146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 41246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 413481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, 414481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint32_t *patch) { 41518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *major = version >> 22; 41618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *minor = (version >> 12) & 0x3ff; 41718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *patch = version & 0xfff; 41818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 41918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 42018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_physical_device_layer_extensions( 421481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz struct app_gpu *gpu, char *layer_name, uint32_t *extension_count, 422481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkExtensionProperties **extension_properties) { 42318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 42418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 42518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 42618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 42718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 42818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 429481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, 430481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &ext_count, NULL); 43118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 43218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 43318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 43418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 43518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 43618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 437481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, 438481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &ext_count, ext_ptr); 43918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 44018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 44118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 44218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 44318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 44418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 44518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 446481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) { 447ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 4489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 44946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 450045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .queueCreateInfoCount = 0, 451045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .pQueueCreateInfos = NULL, 452a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 45318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 454a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledExtensionCount = 0, 45518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 45646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 4573c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 4583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Extensions to enable 45918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter static const char *known_extensions[] = { 46064070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott VK_KHR_SWAPCHAIN_EXTENSION_NAME, 4613c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 462426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 46318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t count = 0; 46418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Scan layers */ 46618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *device_layer_properties = NULL; 46718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers = NULL; 46818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 47074c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, NULL); 47118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 47218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 47318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layer_properties) { 47418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 47518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 47618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layer_properties = malloc(sizeof(VkLayerProperties) * count); 47718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layer_properties); 47818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 47918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layers) { 48018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layers); 48118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 48218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layers = malloc(sizeof(struct layer_extension_list) * count); 48318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layers); 48418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 485481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, 486481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz device_layer_properties); 48718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 4883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter assert(!err); 4893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 49018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layer_count = count; 49118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layers = device_layers; 49218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 49418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *src_info = &device_layer_properties[i]; 49518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *dst_info = &gpu->device_layers[i]; 496481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memcpy(&dst_info->layer_properties, src_info, 497481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sizeof(VkLayerProperties)); 49818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Save away layer extension info for report */ 50018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 501481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu, src_info->layerName, &dst_info->extension_count, 502481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dst_info->extension_properties); 5033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 50418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 50518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 50618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 507481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu, NULL, &gpu->device_extension_count, &gpu->device_extensions); 5083c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 5099e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 5109e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 51118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t enabled_extension_count = 0; 51267a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter uint32_t known_extension_count = ARRAY_SIZE(known_extensions); 51318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 51467a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter for (uint32_t i = 0; i < known_extension_count; i++) { 5151f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 extension_found = 0; 51618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t j = 0; j < gpu->device_extension_count; j++) { 51718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_prop = &gpu->device_extensions[j]; 5181f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu if (!strcmp(known_extensions[i], ext_prop->extensionName)) { 51918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 52018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extension_found = 1; 52118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter enabled_extension_count++; 5223c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 5233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 52418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!extension_found) { 52518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Cannot find extension: %s\n", known_extensions[i]); 526ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT); 52718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 5283c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 52946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 53046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 531045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.queueCreateInfoCount = gpu->queue_count; 532045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.pQueueCreateInfos = gpu->queue_reqs; 53346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 534a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn info.enabledLayerCount = 0; 53518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledLayerNames = NULL; 536a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn info.enabledExtensionCount = enabled_extension_count; 537481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz info.ppEnabledExtensionNames = (const char *const *)known_extensions; 5383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 53969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj); 5403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err) 5413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 54246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 54346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 544481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_destroy(struct app_dev *dev) { 54569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDevice(dev->obj, NULL); 54646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 54746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 548481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void 549481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzapp_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, 550481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkExtensionProperties **extension_properties) { 55118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 55218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 55318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 55418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 55518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 55618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 557481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, 558481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL); 55918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 56018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 56118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 56218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 56318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 56418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 565481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, 566481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ext_ptr); 56718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 56818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 56918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 57018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 57118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 57218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 57318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 574481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_create_instance(struct app_instance *inst) { 5753c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 5763c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 5773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 5781f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationName = APP_SHORT_NAME, 5791f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .applicationVersion = 1, 5803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 5813c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 582d3995c987ba7e47700ceb54535880e782c6b04c1Jon Ashburn .apiVersion = VK_API_VERSION_1_0, 5833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 5843c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstanceCreateInfo inst_info = { 5853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 5863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 5871f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationInfo = &app_info, 588a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 58918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 590a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledExtensionCount = 0, 59118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 5923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 59322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 5943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Global Extensions to enable 595aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott static char *known_extensions[] = { 59664070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott VK_KHR_SURFACE_EXTENSION_NAME, 597b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_ANDROID_KHR 598b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 599b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 600b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_MIR_KHR 601b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_MIR_SURFACE_EXTENSION_NAME, 602b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 603b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_WAYLAND_KHR 604b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, 605b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 606b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_WIN32_KHR 607b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_WIN32_SURFACE_EXTENSION_NAME, 608b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 609b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_XCB_KHR 610b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_XCB_SURFACE_EXTENSION_NAME, 611b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 612b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#ifdef VK_USE_PLATFORM_XLIB_KHR 613b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VK_KHR_XLIB_SURFACE_EXTENSION_NAME, 614b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif 61546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 616426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 6173c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count = 0; 61818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t count = 0; 61918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 62018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Scan layers */ 62118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *global_layer_properties = NULL; 62218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *global_layers = NULL; 62318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 62418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 62574c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter err = vkEnumerateInstanceLayerProperties(&count, NULL); 62618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 62718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 62818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (global_layer_properties) { 62918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layer_properties); 63018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 63118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter global_layer_properties = malloc(sizeof(VkLayerProperties) * count); 63218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(global_layer_properties); 63318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 63418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (global_layers) { 63518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layers); 63618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 63718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter global_layers = malloc(sizeof(struct layer_extension_list) * count); 63818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(global_layers); 6393c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 640481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = 641481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkEnumerateInstanceLayerProperties(&count, global_layer_properties); 64218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 6433536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis assert(!err); 6443536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis 64518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_layer_count = count; 64618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_layers = global_layers; 64718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 64818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst->global_layer_count; i++) { 64918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *src_info = &global_layer_properties[i]; 65018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *dst_info = &inst->global_layers[i]; 651481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memcpy(&dst_info->layer_properties, src_info, 652481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sizeof(VkLayerProperties)); 65318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 65418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Save away layer extension info for report */ 655481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_get_global_layer_extensions(src_info->layerName, 656481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dst_info->extension_count, 657481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dst_info->extension_properties); 6583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 65918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layer_properties); 66018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 66118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Collect global extensions */ 66218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_extension_count = 0; 663481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_get_global_layer_extensions(NULL, &inst->global_extension_count, 664481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &inst->global_extensions); 6653c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 6663c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) { 6671f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 extension_found = 0; 66818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t j = 0; j < inst->global_extension_count; j++) { 66918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_prop = &inst->global_extensions[j]; 6701f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu if (!strcmp(known_extensions[i], extension_prop->extensionName)) { 67118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 67218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extension_found = 1; 6733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter global_extension_count++; 6743c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 6753536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis } 67618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!extension_found) { 67718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Cannot find extension: %s\n", known_extensions[i]); 678ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT); 67918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 68046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 68146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 682a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn inst_info.enabledExtensionCount = global_extension_count; 683481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz inst_info.ppEnabledExtensionNames = (const char *const *)known_extensions; 68446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 685acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackCreateInfoEXT dbg_info; 686f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter memset(&dbg_info, 0, sizeof(dbg_info)); 687acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter dbg_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 688481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz dbg_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | 6895c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski VK_DEBUG_REPORT_WARNING_BIT_EXT | 6905c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 691f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter dbg_info.pfnCallback = dbg_callback; 692f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter inst_info.pNext = &dbg_info; 693f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 69469f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateInstance(&inst_info, NULL, &inst->instance); 6953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 6963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 6973c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 6983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 6993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 70046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 7013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 7023c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 703481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_destroy_instance(struct app_instance *inst) { 7043c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 70569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyInstance(inst->instance, NULL); 70646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 70746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 708481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, 709481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPhysicalDevice obj) { 710aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 71146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 71246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 71346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 71446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 71546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 716426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 71701d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 71846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 71946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 72001d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL); 72146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 722481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props = malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 723426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 72446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_props) 7258205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 726481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, 727481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props); 72846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 72946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 73046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 73146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_reqs) 7328205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 73346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 734481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float *queue_priorities = 735481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz malloc(gpu->queue_props[i].queueCount * sizeof(float)); 736481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memset(queue_priorities, 0, 737481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props[i].queueCount * sizeof(float)); 738ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 739ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].pNext = NULL; 740fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes gpu->queue_reqs[i].queueFamilyIndex = i; 741045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 742d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter gpu->queue_reqs[i].pQueuePriorities = queue_priorities; 74346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 74446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 74501d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 74646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 74701d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 748a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 74946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init(&gpu->dev, gpu); 75046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init_formats(&gpu->dev); 75146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 75246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 753481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_destroy(struct app_gpu *gpu) { 75446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_destroy(&gpu->dev); 7553c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 7562c0948342e626904289329dd3f0912b6714eac19Jon Ashburn 757d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->queue_count; i++) { 758481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz free((void *)gpu->queue_reqs[i].pQueuePriorities); 759d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter } 7602c0948342e626904289329dd3f0912b6714eac19Jon Ashburn free(gpu->queue_reqs); 76146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 76246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 76346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 764481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format off 765382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) 766d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 767382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 768190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 769190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 770382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 7714b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } features[3]; 772e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 773190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 7744b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].name = "linearTiling FormatFeatureFlags"; 7754b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].flags = props->linearTilingFeatures; 7764b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].name = "optimalTiling FormatFeatureFlags"; 7774b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].flags = props->optimalTilingFeatures; 7784b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].name = "bufferFeatures FormatFeatureFlags"; 7794b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].flags = props->bufferFeatures; 7804b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski 7814b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\nFORMAT_%s:", vk_format_string(fmt)); 7824b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski for (i = 0; i < ARRAY_SIZE(features); i++) { 7834b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t%s:", features[i].name); 7844b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski if (features[i].flags == 0) { 7854b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t\tNone"); 7864b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } else { 787bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn printf("%s%s%s%s%s%s%s%s%s%s%s%s%s", 7884b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), 7894b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), 7904b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), 7914b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), 7924b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), 7934b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), 794bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), 795bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), 796bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), 7974b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), 7984b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), 7994b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), 8004b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : "")); 8014b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } 802190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 8034b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n"); 804d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 805d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 806d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 807d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 808d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev) 809d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 810382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 811190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 8121f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (fmt = 0; fmt < VK_FORMAT_RANGE_SIZE; fmt++) { 8132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes app_dev_dump_format_props(dev, fmt); 814190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 815d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 816d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 817009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 818009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 819009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 820009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 821009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 822009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 823a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu) 824a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 825a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 826a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 827825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceFeatures:\n"); 828825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=========================\n"); 829825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 830825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); 831825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); 832825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\timageCubeArray = %u\n", features->imageCubeArray ); 833825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tindependentBlend = %u\n", features->independentBlend ); 834825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tgeometryShader = %u\n", features->geometryShader ); 835825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttessellationShader = %u\n", features->tessellationShader ); 836825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsampleRateShading = %u\n", features->sampleRateShading ); 837c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); 838825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlogicOp = %u\n", features->logicOp ); 839825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); 8400bdccbb2032f952395823664f82726a2da0e2c05Jon Ashburn printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); 841c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdepthClamp = %u\n", features->depthClamp ); 842825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); 8434291d8822ec2a685ef89ec2b210ff16857e25310Chia-I Wu printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); 844825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBounds = %u\n", features->depthBounds ); 845825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\twideLines = %u\n", features->wideLines ); 846825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlargePoints = %u\n", features->largePoints ); 847825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); 848825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); 849825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); 850481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); 851825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); 852fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tvertexSideEffects = %u\n", features->vertexPipelineStoresAndAtomics ); 853fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\ttessellationSideEffects = %u\n", features->fragmentStoresAndAtomics ); 854fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tgeometrySideEffects = %u\n", features->shaderTessellationAndGeometryPointSize ); 855825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); 856825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); 857825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); 858221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); 859221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); 860825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); 861825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); 862825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); 863825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); 864825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); 865825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); 866825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); 867825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt64 = %u\n", features->shaderInt64 ); 868825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt16 = %u\n", features->shaderInt16 ); 869825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); 870d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); 871825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\talphaToOne = %u\n", features->alphaToOne ); 8727dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tsparseBinding = %u\n", features->sparseBinding ); 873825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); 874825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); 875825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); 876825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); 877825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); 878825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); 879825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); 880825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); 881d507261fef1c6877aeaa636d0b684ecee0854e74Chia-I Wu printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); 8820717ed5c31632fcc0f7fc1e553b1e67ca03df2abJon Ashburn printf("\tiheritedQueries = %u\n", features->inheritedQueries ); 883a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 884a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 8857dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_sparse_props(const VkPhysicalDeviceSparseProperties *sparseProps) 886a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 8877dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 8887dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceSparseProperties:\n"); 8897dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t---------------------------------\n"); 8907dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 891481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyStandard2DBlockShape = %u\n", sparseProps->residencyStandard2DBlockShape ); 8927e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparseProps->residencyStandard2DMultisampleBlockShape); 893481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyStandard3DBlockShape = %u\n", sparseProps->residencyStandard3DBlockShape ); 894481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyAlignedMipSize = %u\n", sparseProps->residencyAlignedMipSize ); 895481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyNonResidentStrict = %u\n", sparseProps->residencyNonResidentStrict ); 8967dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski} 8977dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 8987dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_limits(const VkPhysicalDeviceLimits *limits) 8997dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski{ 9007dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceLimits:\n"); 9017dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t-----------------------\n"); 9027dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 9037dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxImageDimension1D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension1D ); 9047dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxImageDimension2D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension2D ); 9057dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxImageDimension3D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension3D ); 9067dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxImageDimensionCube = 0x%" PRIxLEAST32 "\n", limits->maxImageDimensionCube ); 9077dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxImageArrayLayers = 0x%" PRIxLEAST32 "\n", limits->maxImageArrayLayers ); 9087e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); 909481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); 910481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); 9117dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPushConstantsSize = 0x%" PRIxLEAST32 "\n", limits->maxPushConstantsSize ); 9127dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxMemoryAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxMemoryAllocationCount ); 91364a9b66fc6479923fe4a4457818cfe8ae2603ebcChia-I Wu printf("\t\tmaxSamplerAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxSamplerAllocationCount ); 9147dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); 915a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); 9167dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxBoundDescriptorSets = 0x%" PRIxLEAST32 "\n", limits->maxBoundDescriptorSets ); 9177dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPerStageDescriptorSamplers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSamplers ); 9187dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPerStageDescriptorUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorUniformBuffers ); 9197dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPerStageDescriptorStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageBuffers ); 9207dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPerStageDescriptorSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSampledImages ); 9217dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxPerStageDescriptorStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageImages ); 92231bba406f0b7efcede27717534d17d2ba1732078Chia-I Wu printf("\t\tmaxPerStageDescriptorInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorInputAttachments ); 923076be29e003296b3c846fbdbac62d583f4d81dd0Chia-I Wu printf("\t\tmaxPerStageResources = 0x%" PRIxLEAST32 "\n", limits->maxPerStageResources ); 9247dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDescriptorSetSamplers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSamplers ); 9257dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDescriptorSetUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffers ); 926a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tmaxDescriptorSetUniformBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffersDynamic ); 9277dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDescriptorSetStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffers ); 928a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tmaxDescriptorSetStorageBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffersDynamic ); 9297dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDescriptorSetSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSampledImages ); 9307dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDescriptorSetStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageImages ); 93131bba406f0b7efcede27717534d17d2ba1732078Chia-I Wu printf("\t\tmaxDescriptorSetInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetInputAttachments ); 9327dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputAttributes = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributes ); 933a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tmaxVertexInputBindings = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindings ); 9347dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); 9357dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); 9367dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxVertexOutputComponents ); 937481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxTessellationGenerationLevel = 0x%" PRIxLEAST32 "\n", limits->maxTessellationGenerationLevel ); 938c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationPatchSize = 0x%" PRIxLEAST32 "\n", limits->maxTessellationPatchSize ); 939c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationControlPerVertexInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexInputComponents ); 940c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationControlPerVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexOutputComponents); 941c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationControlPerPatchOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerPatchOutputComponents ); 942c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationControlTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlTotalOutputComponents ); 943c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationEvaluationInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationInputComponents ); 944c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter printf("\t\tmaxTessellationEvaluationOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationOutputComponents ); 9457dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxGeometryShaderInvocations = 0x%" PRIxLEAST32 "\n", limits->maxGeometryShaderInvocations ); 9467dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxGeometryInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryInputComponents ); 9477dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxGeometryOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputComponents ); 9487dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxGeometryOutputVertices = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputVertices ); 9497dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxGeometryTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryTotalOutputComponents ); 9507dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxFragmentInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxFragmentInputComponents ); 951c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\t\tmaxFragmentOutputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentOutputAttachments ); 952c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\t\tmaxFragmentDualSrcAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentDualSrcAttachments ); 9537dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxFragmentCombinedOutputResources = 0x%" PRIxLEAST32 "\n", limits->maxFragmentCombinedOutputResources ); 9547dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); 9557dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupCount[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[0] ); 9567dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupCount[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[1] ); 9577dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupCount[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[2] ); 9587dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupInvocations = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupInvocations ); 9597dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupSize[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[0] ); 9607dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupSize[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[1] ); 9617dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeWorkGroupSize[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[2] ); 9627dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tsubPixelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subPixelPrecisionBits ); 9637dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tsubTexelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subTexelPrecisionBits ); 9647dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmipmapPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->mipmapPrecisionBits ); 9657dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxDrawIndexedIndexValue = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndexedIndexValue ); 9668ca320fc115441df2344d062fc45477bc89f7875Chia-I Wu printf("\t\tmaxDrawIndirectCount = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndirectCount ); 9677dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); 9687dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); 9697dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxViewports = 0x%" PRIxLEAST32 "\n", limits->maxViewports ); 9707dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxViewportDimensions[0] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[0] ); 9717dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxViewportDimensions[1] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[1] ); 9727dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] ); 9737dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] ); 9747dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tviewportSubPixelBits = 0x%" PRIxLEAST32 "\n", limits->viewportSubPixelBits ); 9753ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); 9763ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); 9773ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); 9783ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); 9797dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminTexelOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset ); 9807dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxTexelOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset ); 9817dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset ); 9827dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset ); 9837dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset ); 9847dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset ); 9857dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tsubPixelInterpolationOffsetBits = 0x%" PRIxLEAST32 "\n", limits->subPixelInterpolationOffsetBits ); 9867dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxFramebufferWidth = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferWidth ); 9877dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxFramebufferHeight = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferHeight ); 9887dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxFramebufferLayers = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferLayers ); 9893138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tframebufferColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferColorSampleCounts ); 9903138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tframebufferDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferDepthSampleCounts ); 9913138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tframebufferStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferStencilSampleCounts ); 9927dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxColorAttachments = 0x%" PRIxLEAST32 "\n", limits->maxColorAttachments ); 9933138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tsampledImageColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageColorSampleCounts ); 9943138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tsampledImageDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageDepthSampleCounts ); 9953138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tsampledImageStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageStencilSampleCounts ); 9963138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tsampledImageIntegerSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageIntegerSampleCounts ); 9973138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu printf("\t\tstorageImageSampleCounts = 0x%" PRIxLEAST32 "\n", limits->storageImageSampleCounts ); 9987dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSampleMaskWords = 0x%" PRIxLEAST32 "\n", limits->maxSampleMaskWords ); 999fef7f0877d971c6e3467591da1128c8909fa2cedJon Ashburn printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); 1000c789f69f07b921211ca6929db9413598e9a574e7Chia-I Wu printf("\t\ttimestampPeriod = 0x%f\n", limits->timestampPeriod ); 10017dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxClipDistances = 0x%" PRIxLEAST32 "\n", limits->maxClipDistances ); 10027dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCullDistances ); 10037dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxCombinedClipAndCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCombinedClipAndCullDistances ); 10047dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); 10057dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); 10067dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); 10077dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] ); 10087dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity ); 10097dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity ); 10103c332106cb0750f6a5a34f58a2e0735635ee7e97Chia-I Wu printf("\t\tstrictLines = %u\n", limits->strictLines ); 1011a3939fcc66a34d14b3a473441b27d7e341515004Chia-I Wu printf("\t\tstandardSampleLocations = %u\n", limits->standardSampleLocations ); 1012ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyOffsetAlignment ); 1013ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyRowPitchAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyRowPitchAlignment ); 1014ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\tnonCoherentAtomSize = 0x%" PRIxLEAST64 "\n", limits->nonCoherentAtomSize ); 1015d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1016d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 101718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_gpu_dump_props(const struct app_gpu *gpu) 101818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 101918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkPhysicalDeviceProperties *props = &gpu->props; 102018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1021825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceProperties:\n"); 1022825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===========================\n"); 1023825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tapiVersion = %u\n", props->apiVersion); 1024825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdriverVersion = %u\n", props->driverVersion); 1025d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tvendorID = 0x%04x\n", props->vendorID); 1026d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tdeviceID = 0x%04x\n", props->deviceID); 1027825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); 1028825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdeviceName = %s\n", props->deviceName); 10297dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 10307dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski app_dump_limits(&gpu->props.limits); 10317dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski app_dump_sparse_props(&gpu->props.sparseProperties); 10327dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 103318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 103418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 1035481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format on 103618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1037481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void 1038481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzapp_dump_extensions(const char *indent, const char *layer_name, 1039481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const uint32_t extension_count, 1040481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const VkExtensionProperties *extension_properties) { 10413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 104218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (layer_name && (strlen(layer_name) > 0)) { 104318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s%s Extensions", indent, layer_name); 104418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } else { 104518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Extensions"); 10463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 104718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tcount = %d\n", extension_count); 1048481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (i = 0; i < extension_count; i++) { 104918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties const *ext_prop = &extension_properties[i]; 10503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 105118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s\t", indent); 1052481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%-32s: extension revision %2d\n", ext_prop->extensionName, 1053481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ext_prop->specVersion); 1054ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 1055ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 105618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1057ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 1058ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 1059481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) { 1060ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop const VkQueueFamilyProperties *props = &gpu->queue_props[id]; 1061190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1062825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkQueueFamilyProperties[%d]:\n", id); 1063825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("============================\n"); 1064b21a51a4aae758d8b8f622eb7ca363bb7896cb00Chia-I Wu printf("\tqueueFlags = %c%c%c\n", 1065481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', 1066481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.', 1067481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (props->queueFlags & VK_QUEUE_TRANSFER_BIT) ? 'D' : '.'); 1068481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tqueueCount = %u\n", props->queueCount); 1069481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\ttimestampValidBits = %u\n", props->timestampValidBits); 10700339bc575660f6a9e04905cccfd8964cf8a87621Chia-I Wu printf("\tminImageTransferGranularity = (%d, %d, %d)\n", 1071481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.width, 1072481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.height, 1073481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.depth); 107418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1075d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1076d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1077481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump_memory_props(const struct app_gpu *gpu) { 10788205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 1079d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1080825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceMemoryProperties:\n"); 1081825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=================================\n"); 1082825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 1083723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 1084723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypes[%u] : \n", i); 1085723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags); 1086723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 1087723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 1088481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 1089723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 1090723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeaps[%u] : \n", i); 1091481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", 1092481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (size_t)props->memoryHeaps[i].size); 1093723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 109418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1095d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1096d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1097481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump(const struct app_gpu *gpu) { 1098e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 1099190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1100825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Device Extensions and layers:\n"); 1101825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=============================\n"); 1102190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 1103190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_props(gpu); 1104190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1105481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("", "Device", gpu->device_extension_count, 1106481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->device_extensions); 110718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); 110818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Layers\tcount = %d\n", gpu->device_layer_count); 110918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 111018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 111118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 111218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list const *layer_info = &gpu->device_layers[i]; 111318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1114481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz extract_version(layer_info->layer_properties.specVersion, &major, 1115481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &minor, &patch); 1116481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, 1117481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz patch); 1118481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(layer_version, sizeof(layer_version), "%d", 1119481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_info->layer_properties.implementationVersion); 112018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 112118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->layer_properties.layerName, 1122481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (char *)layer_info->layer_properties.description, spec_version, 1123481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_version); 112418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1125481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("\t", layer_info->layer_properties.layerName, 112618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_count, 112718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_properties); 112818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 112918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 1130ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 1131190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 1132190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_queue_props(gpu, i); 1133190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1134190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1135190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_memory_props(gpu); 1136190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1137a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_features(gpu); 1138a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 1139190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_dev_dump(&gpu->dev); 1140d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1141d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1142a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1143a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Enlarges the console window to have a large scrollback size. 1144a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic void ConsoleEnlarge() { 1145a3b7170656404199592bb65040621772f299a7f3Hugo Landau HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 1146a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1147a3b7170656404199592bb65040621772f299a7f3Hugo Landau // make the console window bigger 1148a3b7170656404199592bb65040621772f299a7f3Hugo Landau CONSOLE_SCREEN_BUFFER_INFO csbi; 1149a3b7170656404199592bb65040621772f299a7f3Hugo Landau COORD bufferSize; 1150a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (GetConsoleScreenBufferInfo(consoleHandle, &csbi)) 1151a3b7170656404199592bb65040621772f299a7f3Hugo Landau { 1152a3b7170656404199592bb65040621772f299a7f3Hugo Landau bufferSize.X = csbi.dwSize.X + 30; 1153a3b7170656404199592bb65040621772f299a7f3Hugo Landau bufferSize.Y = 20000; 1154a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleScreenBufferSize(consoleHandle, bufferSize); 1155a3b7170656404199592bb65040621772f299a7f3Hugo Landau } 1156a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1157a3b7170656404199592bb65040621772f299a7f3Hugo Landau SMALL_RECT r; 1158a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Left = r.Top = 0; 1159a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Right = csbi.dwSize.X - 1 + 30; 1160a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Bottom = 50; 1161a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleWindowInfo(consoleHandle, true, &r); 1162a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1163a3b7170656404199592bb65040621772f299a7f3Hugo Landau // change the console window title 1164a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleTitle(TEXT(APP_SHORT_NAME)); 1165a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1166a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1167a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1168481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint main(int argc, char **argv) { 11697b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo unsigned int major, minor, patch; 11707b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo struct app_gpu gpus[MAX_GPUS]; 11718205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice objs[MAX_GPUS]; 1172e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t gpu_count, i; 1173382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 11743c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter struct app_instance inst; 1175190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1176a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1177a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (ConsoleIsExclusive()) 1178a3b7170656404199592bb65040621772f299a7f3Hugo Landau ConsoleEnlarge(); 1179a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1180a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1181f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn major = VK_API_VERSION_1_0 >> 22; 1182f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn minor = (VK_API_VERSION_1_0 >> 12) & 0x3ff; 1183f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn patch = VK_HEADER_VERSION & 0xfff; 11847b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo printf("===========\n"); 1185481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("VULKAN INFO\n"); 1186b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo printf("===========\n\n"); 1187ab5e3be206ad34b1d92a1552d546d32760c3bfb1Mark Lobodzinski printf("Vulkan API Version: %d.%d.%d\n\n", major, minor, patch); 1188b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo 11893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_create_instance(&inst); 119018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1191825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Instance Extensions and layers:\n"); 1192825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===============================\n"); 1193481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("", "Instance", inst.global_extension_count, 1194481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz inst.global_extensions); 1195825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1196825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Instance Layers\tcount = %d\n", inst.global_layer_count); 119718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst.global_layer_count; i++) { 119818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 119918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 1200481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkLayerProperties const *layer_prop = 1201481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &inst.global_layers[i].layer_properties; 120218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 120318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_prop->specVersion, &major, &minor, &patch); 1204481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, 1205481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz patch); 1206481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(layer_version, sizeof(layer_version), "%d", 1207481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_prop->implementationVersion); 120818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 1209481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_prop->layerName, (char *)layer_prop->description, 1210481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz spec_version, layer_version); 121118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 121218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("\t", 121318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].layer_properties.layerName, 121418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_count, 121518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_properties); 121618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 121729669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn 12183c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 121907b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (err) 122007b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn ERR_EXIT(err); 122107b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (gpu_count > MAX_GPUS) { 122218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo printf("Too many GPUS found \n"); 1223ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter ERR_EXIT(-1); 122407b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn } 12253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 1226190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (err) 1227190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu ERR_EXIT(err); 1228190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1229190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) { 1230190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_init(&gpus[i], i, objs[i]); 1231190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump(&gpus[i]); 1232190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n\n"); 1233190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1234190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1235190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) 1236190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_destroy(&gpus[i]); 1237190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 12383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_destroy_instance(&inst); 12390b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 1240ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 1241a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1242a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (ConsoleIsExclusive()) 124318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); 1244ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 1245a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1246a3b7170656404199592bb65040621772f299a7f3Hugo Landau return 0; 1247a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1248