vulkaninfo.c revision 54cf48a48c9e593f96d20a9abbdda0d48be906de
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 * 643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License"); 743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License. 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at 946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * http://www.apache.org/licenses/LICENSE-2.0 1146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software 1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS, 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License. 1796cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * 1896cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> 1996cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: David Pinedo <david@lunarg.com> 2096cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Mark Lobodzinski <mark@lunarg.com> 21a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay * Author: Rene Lindsay <rene@lunarg.com> 2246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu */ 2346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h> 24825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski#include <inttypes.h> 257fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdbool.h> 267fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdio.h> 277fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdlib.h> 287fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <string.h> 29d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 30ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 3118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h> 3218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h> 33b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott#endif // _WIN32 3464070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott 35a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef __linux__ 36a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#include <X11/Xutil.h> 37a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 38a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 39329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vulkan.h> 4046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 41481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define ERR(err) \ 42481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s:%d: failed with %s\n", __FILE__, __LINE__, \ 43481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vk_result_string(err)); 4446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32 4618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 477c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf 487c83aa210365e148877f0f3698292a1b509018ffIan Elliott 49a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Returns nonzero if the console is used only for this process. Will return 50a3b7170656404199592bb65040621772f299a7f3Hugo Landau// zero if another process (such as cmd.exe) is also attached. 51a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic int ConsoleIsExclusive(void) { 52a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD pids[2]; 53a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD num_pids = GetConsoleProcessList(pids, ARRAYSIZE(pids)); 54a3b7170656404199592bb65040621772f299a7f3Hugo Landau return num_pids <= 1; 55a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 57481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY \ 58481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz do { \ 597fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ConsoleIsExclusive()) \ 60481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz Sleep(INFINITE); \ 6118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 6218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 63481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY 6418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 6518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 66481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define ERR_EXIT(err) \ 67481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz do { \ 68481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR(err); \ 69481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz fflush(stdout); \ 70481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz WAIT_FOR_CONSOLE_DESTROY; \ 71481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz exit(-1); \ 72481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 7346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7422a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 7522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 7622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 7722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 7822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 7922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 8046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 8146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8 8346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 854e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 8646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu; 8846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev { 9046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_gpu *gpu; /* point back to the GPU */ 9146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 92382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 941f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkFormatProperties format_props[VK_FORMAT_RANGE_SIZE]; 9546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 9646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstruct layer_extension_list { 9818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties layer_properties; 9918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t extension_count; 10018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_properties; 10118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}; 10218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance { 104481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkInstance instance; 10518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t global_layer_count; 10618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *global_layers; 1073c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 1087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkExtensionProperties *global_extensions; // Instance Extensions 109a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay PFN_vkGetPhysicalDeviceSurfaceSupportKHR 1117fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay vkGetPhysicalDeviceSurfaceSupportKHR; 1127fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR 1137fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay vkGetPhysicalDeviceSurfaceCapabilitiesKHR; 1147fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay PFN_vkGetPhysicalDeviceSurfaceFormatsKHR 1157fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay vkGetPhysicalDeviceSurfaceFormatsKHR; 1167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay PFN_vkGetPhysicalDeviceSurfacePresentModesKHR 1177fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay vkGetPhysicalDeviceSurfacePresentModesKHR; 118a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 119a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkSurfaceKHR surface; 120a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int width, height; 121a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 122a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 1237fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay HINSTANCE hInstance; // Windows Instance 1247fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay HWND hWnd; // window handle 125a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 126a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 127a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 1287fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_connection_t *xcb_connection; 1297fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_screen_t *xcb_screen; 1307fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_window_t xcb_window; 131a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 132a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 133a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XLIB_KHR 1347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Display *xlib_display; 1357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Window xlib_window; 136a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 137a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1387fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_ANDROID_KHR // TODO 1397fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay ANativeWindow *window; 140a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 1413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 1423c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 14346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu { 144e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 1458205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 14646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1478205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 14846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 149e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 150ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop VkQueueFamilyProperties *queue_props; 151ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 15246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1538205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 154a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 1557dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski VkPhysicalDevice limits; 15646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 15718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t device_layer_count; 15818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers; 15918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1603c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 1613c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 16246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 16346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_dev dev; 16446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 16546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 166481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic VKAPI_ATTR VkBool32 VKAPI_CALL 167481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzdbg_callback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, 168481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint64_t srcObject, size_t location, int32_t msgCode, 169481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const char *pLayerPrefix, const char *pMsg, void *pUserData) { 170481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz char *message = (char *)malloc(strlen(pMsg) + 100); 171f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 172481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz assert(message); 173f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 174acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 175481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, 176481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 1775c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 178481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, 179481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 1805c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 181481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "INFO: [%s] Code %d : %s", pLayerPrefix, msgCode, 182481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 183acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 184481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, 185481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pMsg); 186f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter } 187f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 188481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s\n", message); 189f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter fflush(stdout); 190f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter free(message); 191f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 192f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter /* 193f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * false indicates that layer should not bail-out of an 194f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * API call that had validation failures. This may mean that the 195f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * app dies inside the driver due to invalid parameter(s). 196f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * That's what would happen without validation layers, so we'll 197f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * keep that behavior here. 198f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter */ 199f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter return false; 200f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter} 201f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 202481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_result_string(VkResult err) { 20346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 204481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 205481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case r: \ 206481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 207481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_SUCCESS); 208481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_NOT_READY); 209481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_TIMEOUT); 210481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_SET); 211481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_RESET); 212481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INITIALIZATION_FAILED); 213481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_HOST_MEMORY); 214481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 215481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_DEVICE_LOST); 216481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_LAYER_NOT_PRESENT); 217481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_EXTENSION_NOT_PRESENT); 218481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_MEMORY_MAP_FAILED); 219481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INCOMPATIBLE_DRIVER); 22046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 221481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 222481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_RESULT"; 22346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 22446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 225d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 226481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type) { 227190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 228481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 229481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case VK_PHYSICAL_DEVICE_TYPE_##r: \ 230481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 231481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(OTHER); 232481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(INTEGRATED_GPU); 233481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(DISCRETE_GPU); 234481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VIRTUAL_GPU); 235d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 236481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 237481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_DEVICE"; 238190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 239d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 240d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 241481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic const char *vk_format_string(VkFormat fmt) { 2422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 243481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define STR(r) \ 244481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case VK_FORMAT_##r: \ 245481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 246481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(UNDEFINED); 247481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4_UNORM_PACK8); 248481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4B4A4_UNORM_PACK16); 249481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B4G4R4A4_UNORM_PACK16); 250481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G6B5_UNORM_PACK16); 251481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G6R5_UNORM_PACK16); 252481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G5B5A1_UNORM_PACK16); 253481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G5R5A1_UNORM_PACK16); 254481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A1R5G5B5_UNORM_PACK16); 255481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UNORM); 256481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SNORM); 257481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_USCALED); 258481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SSCALED); 259481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UINT); 260481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SINT); 261481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SRGB); 262481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UNORM); 263481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SNORM); 264481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_USCALED); 265481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SSCALED); 266481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UINT); 267481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SINT); 268481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SRGB); 269481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UNORM); 270481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SNORM); 271481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_USCALED); 272481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SSCALED); 273481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UINT); 274481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SINT); 275481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SRGB); 276481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UNORM); 277481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SNORM); 278481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_USCALED); 279481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SSCALED); 280481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UINT); 281481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SINT); 282481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SRGB); 283481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UNORM); 284481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SNORM); 285481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_USCALED); 286481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SSCALED); 287481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UINT); 288481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SINT); 289481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SRGB); 290481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UNORM); 291481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SNORM); 292481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_USCALED); 293481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SSCALED); 294481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UINT); 295481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SINT); 296481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SRGB); 297481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UNORM_PACK32); 298481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SNORM_PACK32); 299481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_USCALED_PACK32); 300481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SSCALED_PACK32); 301481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UINT_PACK32); 302481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SINT_PACK32); 303481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SRGB_PACK32); 304481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UNORM_PACK32); 305481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SNORM_PACK32); 306481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_USCALED_PACK32); 307481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SSCALED_PACK32); 308481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UINT_PACK32); 309481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SINT_PACK32); 310481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UNORM_PACK32); 311481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SNORM_PACK32); 312481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_USCALED_PACK32); 313481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SSCALED_PACK32); 314481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UINT_PACK32); 315481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SINT_PACK32); 316481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UNORM); 317481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SNORM); 318481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_USCALED); 319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SSCALED); 320481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UINT); 321481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SINT); 322481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SFLOAT); 323481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UNORM); 324481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SNORM); 325481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_USCALED); 326481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SSCALED); 327481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UINT); 328481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SINT); 329481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SFLOAT); 330481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UNORM); 331481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SNORM); 332481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_USCALED); 333481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SSCALED); 334481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UINT); 335481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SINT); 336481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SFLOAT); 337481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UNORM); 338481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SNORM); 339481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_USCALED); 340481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SSCALED); 341481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UINT); 342481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SINT); 343481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SFLOAT); 344481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_UINT); 345481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SINT); 346481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SFLOAT); 347481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_UINT); 348481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SINT); 349481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SFLOAT); 350481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_UINT); 351481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SINT); 352481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SFLOAT); 353481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_UINT); 354481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SINT); 355481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SFLOAT); 356481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_UINT); 357481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SINT); 358481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SFLOAT); 359481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_UINT); 360481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SINT); 361481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SFLOAT); 362481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_UINT); 363481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SINT); 364481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SFLOAT); 365481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_UINT); 366481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SINT); 367481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SFLOAT); 368481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B10G11R11_UFLOAT_PACK32); 369481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(E5B9G9R9_UFLOAT_PACK32); 370481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM); 371481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(X8_D24_UNORM_PACK32); 372481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT); 373481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(S8_UINT); 374481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM_S8_UINT); 375481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D24_UNORM_S8_UINT); 376481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT_S8_UINT); 377481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_UNORM_BLOCK); 378481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_SRGB_BLOCK); 379481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_UNORM_BLOCK); 380481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_SRGB_BLOCK); 381481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_UNORM_BLOCK); 382481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_SRGB_BLOCK); 383481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_UNORM_BLOCK); 384481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_SNORM_BLOCK); 385481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_UNORM_BLOCK); 386481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_SNORM_BLOCK); 387481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_UFLOAT_BLOCK); 388481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_SFLOAT_BLOCK); 389481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_UNORM_BLOCK); 390481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_SRGB_BLOCK); 391481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8_UNORM_BLOCK); 392481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A1_UNORM_BLOCK); 393481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A8_UNORM_BLOCK); 394481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_UNORM_BLOCK); 395481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_SNORM_BLOCK); 396481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_UNORM_BLOCK); 397481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_SNORM_BLOCK); 398481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_UNORM_BLOCK); 399481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_SRGB_BLOCK); 400481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_UNORM_BLOCK); 401481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_SRGB_BLOCK); 402481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_UNORM_BLOCK); 403481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_SRGB_BLOCK); 404481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_UNORM_BLOCK); 405481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_SRGB_BLOCK); 406481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_UNORM_BLOCK); 407481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_SRGB_BLOCK); 408481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_UNORM_BLOCK); 409481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_SRGB_BLOCK); 410481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_UNORM_BLOCK); 411481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_SRGB_BLOCK); 412481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_UNORM_BLOCK); 413481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_SRGB_BLOCK); 414481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_UNORM_BLOCK); 415481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_SRGB_BLOCK); 416481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_UNORM_BLOCK); 417481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_SRGB_BLOCK); 418481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_UNORM_BLOCK); 419481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_SRGB_BLOCK); 420481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_UNORM_BLOCK); 421481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_SRGB_BLOCK); 422481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_UNORM_BLOCK); 423481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_SRGB_BLOCK); 424481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_UNORM_BLOCK); 425481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_SRGB_BLOCK); 426d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 427481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz default: 428481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return "UNKNOWN_FORMAT"; 429190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 430d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 431d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 432481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_init_formats(struct app_dev *dev) { 433382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat f; 4342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 4351f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (f = 0; f < VK_FORMAT_RANGE_SIZE; f++) { 436382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormat fmt = f; 4372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 438481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, 439481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dev->format_props[f]); 44046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 44146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 44246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 443481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, 444481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint32_t *patch) { 44518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *major = version >> 22; 44618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *minor = (version >> 12) & 0x3ff; 44718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *patch = version & 0xfff; 44818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 44918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 45018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_physical_device_layer_extensions( 451481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz struct app_gpu *gpu, char *layer_name, uint32_t *extension_count, 452481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkExtensionProperties **extension_properties) { 45318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 45418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 45518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 45618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 45718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 45818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 459481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, 460481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &ext_count, NULL); 46118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 46218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 46418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 46518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 46618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 467481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, 468481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &ext_count, ext_ptr); 46918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 47018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 47118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 47218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 47318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 47418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 47518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 476481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) { 477ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 4789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 47946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 480045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .queueCreateInfoCount = 0, 481045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .pQueueCreateInfos = NULL, 482a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 48318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 484a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledExtensionCount = 0, 48518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 48646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 4873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 488426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 48918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t count = 0; 49018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Scan layers */ 49218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *device_layer_properties = NULL; 49318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers = NULL; 49418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 49674c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, NULL); 49718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 49818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layer_properties) { 50018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 50118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 50218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layer_properties = malloc(sizeof(VkLayerProperties) * count); 50318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layer_properties); 50418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 50518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layers) { 50618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layers); 50718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 50818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layers = malloc(sizeof(struct layer_extension_list) * count); 50918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layers); 51018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 511481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, 512481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz device_layer_properties); 51318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 5143c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter assert(!err); 5153c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 51618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layer_count = count; 51718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layers = device_layers; 51818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 51918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 52018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *src_info = &device_layer_properties[i]; 52118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *dst_info = &gpu->device_layers[i]; 522481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memcpy(&dst_info->layer_properties, src_info, 523481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz sizeof(VkLayerProperties)); 52418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 52518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Save away layer extension info for report */ 52618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 527481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu, src_info->layerName, &dst_info->extension_count, 528481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &dst_info->extension_properties); 5293c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 53018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 53118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 53218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 533481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu, NULL, &gpu->device_extension_count, &gpu->device_extensions); 5343c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 5359e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 5369e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 53746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 538045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.queueCreateInfoCount = gpu->queue_count; 539045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.pQueueCreateInfos = gpu->queue_reqs; 54046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 541a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn info.enabledLayerCount = 0; 54218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledLayerNames = NULL; 5434ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.enabledExtensionCount = 0; 5444ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.ppEnabledExtensionNames = NULL; 5453c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 54669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj); 5473c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err) 5483c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 54946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 55046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 551481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_dev_destroy(struct app_dev *dev) { 55269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDevice(dev->obj, NULL); 55346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 55446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 555481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void 556481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzapp_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, 557481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkExtensionProperties **extension_properties) { 55818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 55918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 56018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 56118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 56218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 56318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 5647fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension count if the last parameter is NULL 5657fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, 566481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL); 56718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 56818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 56918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 57018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 57118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 57218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 5737fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension properties if the last parameter is not NULL 5747fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, 575481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ext_ptr); 57618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 57718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 57818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 57918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 58018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 58118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 5827fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay/* Gets a list of layer and instance extensions */ 5837fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsaystatic void app_get_instance_extensions(struct app_instance *inst) { 5847fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkResult U_ASSERT_ONLY err; 585a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5867fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t count = 0; 587a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5887fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Scan layers */ 5897fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *global_layer_properties = NULL; 5907fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay struct layer_extension_list *global_layers = NULL; 591a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5927fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay do { 5937fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkEnumerateInstanceLayerProperties(&count, NULL); 5947fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 595a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5967fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layer_properties) { 5977fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 5987fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 5997fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay global_layer_properties = malloc(sizeof(VkLayerProperties) * count); 6007fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layer_properties); 601a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layers) { 6037fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layers); 6047fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 6057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay global_layers = malloc(sizeof(struct layer_extension_list) * count); 6067fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layers); 607a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = 6097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay vkEnumerateInstanceLayerProperties(&count, global_layer_properties); 6107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } while (err == VK_INCOMPLETE); 6117fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 612a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6137fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layer_count = count; 6147fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layers = global_layers; 615a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (uint32_t i = 0; i < inst->global_layer_count; i++) { 6177fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *src_info = &global_layer_properties[i]; 6187fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay struct layer_extension_list *dst_info = &inst->global_layers[i]; 6197fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay memcpy(&dst_info->layer_properties, src_info, 6207fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sizeof(VkLayerProperties)); 621a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6227fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Save away layer extension info for report */ 6237fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Gets layer extensions, if first parameter is not NULL*/ 6247fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay app_get_global_layer_extensions(src_info->layerName, 6257fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay &dst_info->extension_count, 6267fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay &dst_info->extension_properties); 6277fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 6287fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 6297fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 6307fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Collect global extensions */ 6317fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_extension_count = 0; 6327fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Gets instance extensions, if no layer was specified in teh first 6337fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay * paramteter */ 6347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay app_get_global_layer_extensions(NULL, &inst->global_extension_count, 6357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay &inst->global_extensions); 636a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 637a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 638481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_create_instance(struct app_instance *inst) { 6397fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay app_get_instance_extensions(inst); 640a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6417fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//---Build a list of extensions to load--- 6427fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#define MAX_EXTENSIONS 4 6437fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t i = 0; 6447fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t ext_count = 0; 6457fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay const char *ext_names[MAX_EXTENSIONS]; // array of string pointers to 6467fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // extension names 6477fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (i = 0; (i < inst->global_extension_count); i++) { 6487fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay const char *found_name = inst->global_extensions[i].extensionName; 6497fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) 650e3382ac16bc50e271112504244fb79da31cd0919Rene Lindsay {ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME;} 651a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 652a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6537fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ext_count) 6547fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (i = 0; ((i < inst->global_extension_count) && 6557fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay (ext_count < MAX_EXTENSIONS)); 6567fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay i++) { 6577fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay const char *found_name = inst->global_extensions[i].extensionName; 6587fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 6597fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) 660e3382ac16bc50e271112504244fb79da31cd0919Rene Lindsay {ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;} 661a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 6627fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 6637fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) 664e3382ac16bc50e271112504244fb79da31cd0919Rene Lindsay {ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME;} 665a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 6667fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_XLIB_KHR 6677fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) 668e3382ac16bc50e271112504244fb79da31cd0919Rene Lindsay {ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;} 669a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 6707fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_ANDROID_KHR 6717fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) 672e3382ac16bc50e271112504244fb79da31cd0919Rene Lindsay {ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;} 673a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 6747fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 6757fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // If we don't find the KHR_SURFACE extension and at least one other 6767fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // device-specific extension, 6777fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // then give up on reporting presentable surface formats." 6787fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ext_count < 2) 6797fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay ext_count = 0; 680a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //---------------------------------------- 681a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 6833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 6843c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 6851f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationName = APP_SHORT_NAME, 6861f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .applicationVersion = 1, 6873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 6883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 689d3995c987ba7e47700ceb54535880e782c6b04c1Jon Ashburn .apiVersion = VK_API_VERSION_1_0, 6903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 691a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstanceCreateInfo inst_info = { 6933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 6943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 6951f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationInfo = &app_info, 696a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 69718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 6987fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay .enabledExtensionCount = ext_count, 699a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay .ppEnabledExtensionNames = ext_names, 7003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 70146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 702acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackCreateInfoEXT dbg_info; 703f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter memset(&dbg_info, 0, sizeof(dbg_info)); 704acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter dbg_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 705481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz dbg_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | 7065c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski VK_DEBUG_REPORT_WARNING_BIT_EXT | 7075c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 708f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter dbg_info.pfnCallback = dbg_callback; 709f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter inst_info.pNext = &dbg_info; 710f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 711a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 71269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateInstance(&inst_info, NULL, &inst->instance); 7133c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 7143c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 7153c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 7163c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 7173c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 71846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 719a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7207fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ext_count > 0) { 7217fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--Load Extensions-- 7227fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#define GET_INSTANCE_PROC_ADDR(ENTRYPOINT) \ 7237fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay { \ 7247fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->ENTRYPOINT = \ 7257fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay (void *)vkGetInstanceProcAddr(inst->instance, #ENTRYPOINT); \ 7267fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 7277fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceSupportKHR) 728a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) 7297fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceFormatsKHR) 730a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfacePresentModesKHR) 7317fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#undef GET_INSTANCE_PROC_ADDR 732a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 7333c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 7343c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 735a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 736a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 737481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_destroy_instance(struct app_instance *inst) { 7383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 73969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyInstance(inst->instance, NULL); 74046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 74146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 742481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, 743481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPhysicalDevice obj) { 744aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 74546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 74646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 74746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 74846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 74946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 750426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 75101d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 75246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 75346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 75401d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL); 75546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 756481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props = malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 757426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 75846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_props) 7598205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 760481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, 761481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props); 76246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 76346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 76446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 76546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_reqs) 7668205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 76746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 768481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float *queue_priorities = 769481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz malloc(gpu->queue_props[i].queueCount * sizeof(float)); 770481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memset(queue_priorities, 0, 771481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props[i].queueCount * sizeof(float)); 772ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 773ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].pNext = NULL; 774fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes gpu->queue_reqs[i].queueFamilyIndex = i; 775045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 776d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter gpu->queue_reqs[i].pQueuePriorities = queue_priorities; 77746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 77846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 77901d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 78046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 78101d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 782a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 78346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init(&gpu->dev, gpu); 78446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init_formats(&gpu->dev); 78546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 78646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 787481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_destroy(struct app_gpu *gpu) { 78846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_destroy(&gpu->dev); 7893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 7902c0948342e626904289329dd3f0912b6714eac19Jon Ashburn 791d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->queue_count; i++) { 792481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz free((void *)gpu->queue_reqs[i].pQueuePriorities); 793d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter } 7942c0948342e626904289329dd3f0912b6714eac19Jon Ashburn free(gpu->queue_reqs); 79546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 79646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 79746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 798481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format off 799a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 800a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 801a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 802a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//---------------------------Win32--------------------------- 803a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 804a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 805a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay// MS-Windows event handling function: 806a155d62f73c03dea7315ba34a7582239fdfc85d2Rene LindsayLRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 807a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay return (DefWindowProc(hWnd, uMsg, wParam, lParam)); 808a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 809a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 810a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_win32_window(struct app_instance *inst) { 811a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->hInstance = GetModuleHandle(NULL); 812a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 813a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WNDCLASSEX win_class; 814a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 815a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Initialize the window class structure: 816a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbSize = sizeof(WNDCLASSEX); 817a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.style = CS_HREDRAW | CS_VREDRAW; 818a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpfnWndProc = WndProc; 819a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbClsExtra = 0; 820a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbWndExtra = 0; 821a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hInstance = inst->hInstance; 822a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); 823a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hCursor = LoadCursor(NULL, IDC_ARROW); 824a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 825a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszMenuName = NULL; 826a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszClassName = APP_SHORT_NAME; 82754cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay win_class.hInstance = inst->hInstance; 828a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); 829a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Register window class: 830a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay if (!RegisterClassEx(&win_class)) { 831a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 83254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to register the window class!\n"); 833a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 834a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 835a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 836a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Create window with the registered class: 837a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay RECT wr = { 0, 0, inst->width, inst->height }; 838a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); 839a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->hWnd = CreateWindowEx(0, 840a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // class name 841a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // app name 842a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //WS_VISIBLE | WS_SYSMENU | 843a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WS_OVERLAPPEDWINDOW, // window style 844a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 100, 100, // x/y coords 845a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.right - wr.left, // width 846a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.bottom - wr.top, // height 847a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to parent 848a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to menu 849a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->hInstance, // hInstance 850a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL); // no extra parameters 851a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay if (!inst->hWnd) { 852a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 85354cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to create a window!\n"); 854a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 855a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 856a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 857a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 858a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 859a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_win32_surface(struct app_instance *inst, struct app_gpu *gpu) { 860a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 861a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkWin32SurfaceCreateInfoKHR createInfo; 862a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 863a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 864a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 865a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.hinstance = inst->hInstance; 866a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.hwnd = inst->hWnd; 8677fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 8687fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 869a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 870a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 871a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_destroy_win32_window(struct app_instance *inst) { 872a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay DestroyWindow(inst->hWnd); 873a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 874a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_WIN32_KHR 875a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 876a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 877a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_destroy_surface(struct app_instance *inst) { //same for all platforms 878a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vkDestroySurfaceKHR(inst->instance, inst->surface, NULL); 879a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 880a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 881a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XCB---------------------------- 88254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 883a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 884a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_xcb_window(struct app_instance *inst) { 885a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //--Init Connection-- 886a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay const xcb_setup_t *setup; 887a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_screen_iterator_t iter; 888a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int scr; 889a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 890a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xcb_connection = xcb_connect(NULL, &scr); 891a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay if (inst->xcb_connection == NULL) { 89254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("XCB failed to connect to the X server.\nExiting ...\n"); 893a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 894a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 895a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 896a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 897a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay setup = xcb_get_setup(inst->xcb_connection); 898a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay iter = xcb_setup_roots_iterator(setup); 899a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay while (scr-- > 0) 900a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_screen_next(&iter); 901a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 902a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xcb_screen = iter.data; 903a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //------------------- 904a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 905a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xcb_window = xcb_generate_id(inst->xcb_connection); 906a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_create_window(inst->xcb_connection, XCB_COPY_FROM_PARENT, inst->xcb_window, 907a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xcb_screen->root, 0, 0, inst->width, inst->height, 0, 908a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, 90954cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 0, NULL); 910a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 911a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); 912a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); 913a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay free(reply); 914a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 915a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 916a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_xcb_surface(struct app_instance *inst, struct app_gpu *gpu) { 917a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 918a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXcbSurfaceCreateInfoKHR xcb_createInfo; 919a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; 920a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.pNext = NULL; 921a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.flags = 0; 922a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.connection = inst->xcb_connection; 923a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.window = inst->xcb_window; 9247fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); 9257fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 926a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 927a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 928a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_destroy_xcb_window(struct app_instance *inst) { 929a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_destroy_window(inst->xcb_connection, inst->xcb_window); 930a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_disconnect(inst->xcb_connection); 931a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 932a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_XCB_KHR 933a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 934a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 935a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XLib--------------------------- 936a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XLIB_KHR 937a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_xlib_window(struct app_instance *inst) { 938a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_display = XOpenDisplay(NULL); 939a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay long visualMask = VisualScreenMask; 940a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int numberOfVisuals; 94154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 94254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay XVisualInfo vInfoTemplate={}; 943a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vInfoTemplate.screen = DefaultScreen(inst->xlib_display); 944a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XVisualInfo *visualInfo = XGetVisualInfo(inst->xlib_display, visualMask, 945a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay &vInfoTemplate, &numberOfVisuals); 946a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_window = XCreateWindow( 947a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), 0, 0, 948a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->width, inst->height, 0, visualInfo->depth, InputOutput, 94954cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay visualInfo->visual, 0, NULL); 950a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 951a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XFlush(inst->xlib_display); 952a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 953a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 954a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_create_xlib_surface(struct app_instance *inst, struct app_gpu *gpu) { 955a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 956a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXlibSurfaceCreateInfoKHR createInfo; 957a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; 958a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 959a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 960a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.dpy = inst->xlib_display; 961a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.window = inst->xlib_window; 9627fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 9637fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 964a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 965a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 966a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic void app_destroy_xlib_window(struct app_instance *inst) { 967a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XDestroyWindow(inst->xlib_display, inst->xlib_window); 968a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XCloseDisplay(inst->xlib_display); 969a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 970a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_XLIB_KHR 971a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 972a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 973a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsaystatic int app_dump_surface_formats(struct app_instance *inst, struct app_gpu *gpu){ 974a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Get the list of VkFormat's that are supported: 975a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 976a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay uint32_t formatCount=0; 9777fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, NULL); 9787fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 979a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkSurfaceFormatKHR *surfFormats = (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR)); 9807fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, surfFormats); 9817fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 982a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("Format count = %d\n",formatCount); 983a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay uint32_t i; 984a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay for(i=0;i<formatCount;i++) printf("\t%s\n",vk_format_string(surfFormats[i].format)); 985a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\n"); 986a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 987a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay return formatCount; 988a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 989a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 990382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) 991d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 992382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 993190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 994190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 995382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 9964b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } features[3]; 997e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 998190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 9994b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].name = "linearTiling FormatFeatureFlags"; 10004b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].flags = props->linearTilingFeatures; 10014b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].name = "optimalTiling FormatFeatureFlags"; 10024b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].flags = props->optimalTilingFeatures; 10034b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].name = "bufferFeatures FormatFeatureFlags"; 10044b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].flags = props->bufferFeatures; 10054b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski 10064b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\nFORMAT_%s:", vk_format_string(fmt)); 10074b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski for (i = 0; i < ARRAY_SIZE(features); i++) { 10084b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t%s:", features[i].name); 10094b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski if (features[i].flags == 0) { 10104b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t\tNone"); 10114b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } else { 10123c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 10133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), //0x0001 10143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), //0x0002 10153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), //0x0004 10163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), //0x0008 10173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), //0x0010 10183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), //0x0020 10193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : ""), //0x0040 10203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), //0x0080 10213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), //0x0100 10223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), //0x0200 10233c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), //0x0400 10243c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), //0x0800 10253c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), //0x1000 10263c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG" : "")); //0x2000 10274b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } 1028190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 10294b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n"); 1030d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1031d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1032d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1033d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 1034d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev) 1035d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1036382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 1037190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 10381f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (fmt = 0; fmt < VK_FORMAT_RANGE_SIZE; fmt++) { 10392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes app_dev_dump_format_props(dev, fmt); 1040190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1041d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1042d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1043009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 1044009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 1045009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 1046009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 1047009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 1048009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 1049a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu) 1050a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 1051a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 1052a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 1053825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceFeatures:\n"); 1054825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=========================\n"); 1055825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1056825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); 1057825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); 1058825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\timageCubeArray = %u\n", features->imageCubeArray ); 1059825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tindependentBlend = %u\n", features->independentBlend ); 1060825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tgeometryShader = %u\n", features->geometryShader ); 1061825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttessellationShader = %u\n", features->tessellationShader ); 1062825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsampleRateShading = %u\n", features->sampleRateShading ); 1063c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); 1064825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlogicOp = %u\n", features->logicOp ); 1065825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); 10660bdccbb2032f952395823664f82726a2da0e2c05Jon Ashburn printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); 1067c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdepthClamp = %u\n", features->depthClamp ); 1068825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); 10694291d8822ec2a685ef89ec2b210ff16857e25310Chia-I Wu printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); 1070825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBounds = %u\n", features->depthBounds ); 1071825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\twideLines = %u\n", features->wideLines ); 1072825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlargePoints = %u\n", features->largePoints ); 1073825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); 1074825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); 1075825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); 1076481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); 1077825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); 1078fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tvertexSideEffects = %u\n", features->vertexPipelineStoresAndAtomics ); 1079fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\ttessellationSideEffects = %u\n", features->fragmentStoresAndAtomics ); 1080fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tgeometrySideEffects = %u\n", features->shaderTessellationAndGeometryPointSize ); 1081825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); 1082825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); 1083825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); 1084221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); 1085221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); 1086825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); 1087825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); 1088825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); 1089825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); 1090825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); 1091825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); 1092825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); 1093825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt64 = %u\n", features->shaderInt64 ); 1094825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt16 = %u\n", features->shaderInt16 ); 1095825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); 1096d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); 1097825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\talphaToOne = %u\n", features->alphaToOne ); 10987dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tsparseBinding = %u\n", features->sparseBinding ); 1099825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); 1100825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); 1101825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); 1102825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); 1103825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); 1104825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); 1105825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); 1106825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); 1107d507261fef1c6877aeaa636d0b684ecee0854e74Chia-I Wu printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); 11080717ed5c31632fcc0f7fc1e553b1e67ca03df2abJon Ashburn printf("\tiheritedQueries = %u\n", features->inheritedQueries ); 1109a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 1110a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 11117dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_sparse_props(const VkPhysicalDeviceSparseProperties *sparseProps) 1112a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 11137dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 11147dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceSparseProperties:\n"); 11157dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t---------------------------------\n"); 11167dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1117481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyStandard2DBlockShape = %u\n", sparseProps->residencyStandard2DBlockShape ); 11187e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparseProps->residencyStandard2DMultisampleBlockShape); 1119481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyStandard3DBlockShape = %u\n", sparseProps->residencyStandard3DBlockShape ); 1120481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyAlignedMipSize = %u\n", sparseProps->residencyAlignedMipSize ); 1121481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tresidencyNonResidentStrict = %u\n", sparseProps->residencyNonResidentStrict ); 11227dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski} 11237dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 11247dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinskistatic void app_dump_limits(const VkPhysicalDeviceLimits *limits) 11257dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski{ 11267dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceLimits:\n"); 11277dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t-----------------------\n"); 11283c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension1D = %u\n", limits->maxImageDimension1D ); 11293c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension2D = %u\n", limits->maxImageDimension2D ); 11303c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension3D = %u\n", limits->maxImageDimension3D ); 11313c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimensionCube = %u\n", limits->maxImageDimensionCube ); 11323c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageArrayLayers = %u\n", limits->maxImageArrayLayers ); 11337e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); 1134481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); 1135481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); 11363c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPushConstantsSize = %u\n", limits->maxPushConstantsSize ); 11373c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxMemoryAllocationCount = %u\n", limits->maxMemoryAllocationCount ); 11383c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSamplerAllocationCount = %u\n", limits->maxSamplerAllocationCount ); 11397dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); 1140a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); 11413c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets ); 11423c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSamplers = %u\n", limits->maxPerStageDescriptorSamplers ); 11433c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorUniformBuffers = %u\n", limits->maxPerStageDescriptorUniformBuffers ); 11443c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageBuffers = %u\n", limits->maxPerStageDescriptorStorageBuffers ); 11453c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSampledImages = %u\n", limits->maxPerStageDescriptorSampledImages ); 11463c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageImages = %u\n", limits->maxPerStageDescriptorStorageImages ); 11473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorInputAttachments = %u\n", limits->maxPerStageDescriptorInputAttachments ); 11483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageResources = %u\n", limits->maxPerStageResources ); 11493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSamplers = %u\n", limits->maxDescriptorSetSamplers ); 11503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffers = %u\n", limits->maxDescriptorSetUniformBuffers ); 11513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffersDynamic = %u\n", limits->maxDescriptorSetUniformBuffersDynamic ); 11523c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffers = %u\n", limits->maxDescriptorSetStorageBuffers ); 11533c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffersDynamic = %u\n", limits->maxDescriptorSetStorageBuffersDynamic ); 11543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSampledImages = %u\n", limits->maxDescriptorSetSampledImages ); 11553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageImages = %u\n", limits->maxDescriptorSetStorageImages ); 11563c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetInputAttachments = %u\n", limits->maxDescriptorSetInputAttachments ); 11573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputAttributes = %u\n", limits->maxVertexInputAttributes ); 11583c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputBindings = %u\n", limits->maxVertexInputBindings ); 11597dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); 11607dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); 11613c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexOutputComponents = %u\n", limits->maxVertexOutputComponents ); 11623c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationGenerationLevel = %u\n", limits->maxTessellationGenerationLevel ); 11633c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationPatchSize = %u\n", limits->maxTessellationPatchSize ); 11643c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexInputComponents = %u\n", limits->maxTessellationControlPerVertexInputComponents ); 11653c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexOutputComponents = %u\n", limits->maxTessellationControlPerVertexOutputComponents); 11663c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerPatchOutputComponents = %u\n", limits->maxTessellationControlPerPatchOutputComponents ); 11673c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlTotalOutputComponents = %u\n", limits->maxTessellationControlTotalOutputComponents ); 11683c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationInputComponents = %u\n", limits->maxTessellationEvaluationInputComponents ); 11693c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationOutputComponents = %u\n", limits->maxTessellationEvaluationOutputComponents ); 11703c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryShaderInvocations = %u\n", limits->maxGeometryShaderInvocations ); 11713c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryInputComponents = %u\n", limits->maxGeometryInputComponents ); 11723c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputComponents = %u\n", limits->maxGeometryOutputComponents ); 11733c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputVertices = %u\n", limits->maxGeometryOutputVertices ); 11743c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryTotalOutputComponents = %u\n", limits->maxGeometryTotalOutputComponents ); 11753c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentInputComponents = %u\n", limits->maxFragmentInputComponents ); 11763c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentOutputAttachments = %u\n", limits->maxFragmentOutputAttachments ); 11773c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentDualSrcAttachments = %u\n", limits->maxFragmentDualSrcAttachments ); 11783c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentCombinedOutputResources = %u\n", limits->maxFragmentCombinedOutputResources ); 11797dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); 11803c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[0] = %u\n", limits->maxComputeWorkGroupCount[0] ); 11813c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[1] = %u\n", limits->maxComputeWorkGroupCount[1] ); 11823c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[2] = %u\n", limits->maxComputeWorkGroupCount[2] ); 11833c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations ); 11843c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[0] = %u\n", limits->maxComputeWorkGroupSize[0] ); 11853c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[1] = %u\n", limits->maxComputeWorkGroupSize[1] ); 11863c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[2] = %u\n", limits->maxComputeWorkGroupSize[2] ); 11873c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelPrecisionBits = %u\n", limits->subPixelPrecisionBits ); 11883c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubTexelPrecisionBits = %u\n", limits->subTexelPrecisionBits ); 11893c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmipmapPrecisionBits = %u\n", limits->mipmapPrecisionBits ); 11903c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndexedIndexValue = %u\n", limits->maxDrawIndexedIndexValue ); 11913c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndirectCount = %u\n", limits->maxDrawIndirectCount ); 11927dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); 11937dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); 11943c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewports = %u\n", limits->maxViewports ); 11953c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[0] = %u\n", limits->maxViewportDimensions[0] ); 11963c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[1] = %u\n", limits->maxViewportDimensions[1] ); 11977dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] ); 11987dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] ); 11993c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tviewportSubPixelBits = %u\n", limits->viewportSubPixelBits ); 12003ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); 12013ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); 12023ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); 12033ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); 12047dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminTexelOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset ); 12057dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxTexelOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset ); 12067dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset ); 12077dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset ); 12087dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset ); 12097dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset ); 12103c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelInterpolationOffsetBits = %u\n", limits->subPixelInterpolationOffsetBits ); 12113c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferWidth = %u\n", limits->maxFramebufferWidth ); 12123c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferHeight = %u\n", limits->maxFramebufferHeight ); 12133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferLayers = %u\n", limits->maxFramebufferLayers ); 12143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferColorSampleCounts = %u\n", limits->framebufferColorSampleCounts ); 12153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferDepthSampleCounts = %u\n", limits->framebufferDepthSampleCounts ); 12163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferStencilSampleCounts = %u\n", limits->framebufferStencilSampleCounts ); 12173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferNoAttachmentsSampleCounts = %u\n", limits->framebufferNoAttachmentsSampleCounts ); 12183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxColorAttachments = %u\n", limits->maxColorAttachments ); 12193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageColorSampleCounts = %u\n", limits->sampledImageColorSampleCounts ); 12203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageDepthSampleCounts = %u\n", limits->sampledImageDepthSampleCounts ); 12213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageStencilSampleCounts = %u\n", limits->sampledImageStencilSampleCounts ); 12223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageIntegerSampleCounts = %u\n", limits->sampledImageIntegerSampleCounts ); 12233c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tstorageImageSampleCounts = %u\n", limits->storageImageSampleCounts ); 12243c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSampleMaskWords = %u\n", limits->maxSampleMaskWords ); 1225fef7f0877d971c6e3467591da1128c8909fa2cedJon Ashburn printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); 12263c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\ttimestampPeriod = %f\n", limits->timestampPeriod ); 12273c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxClipDistances = %u\n", limits->maxClipDistances ); 12283c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCullDistances = %u\n", limits->maxCullDistances ); 12293c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCombinedClipAndCullDistances = %u\n", limits->maxCombinedClipAndCullDistances ); 12303c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tdiscreteQueuePriorities = %u\n", limits->discreteQueuePriorities ); 12317dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); 12327dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); 12337dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); 12347dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] ); 12357dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity ); 12367dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity ); 12373c332106cb0750f6a5a34f58a2e0735635ee7e97Chia-I Wu printf("\t\tstrictLines = %u\n", limits->strictLines ); 1238a3939fcc66a34d14b3a473441b27d7e341515004Chia-I Wu printf("\t\tstandardSampleLocations = %u\n", limits->standardSampleLocations ); 1239ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyOffsetAlignment ); 1240ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyRowPitchAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyRowPitchAlignment ); 1241ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\tnonCoherentAtomSize = 0x%" PRIxLEAST64 "\n", limits->nonCoherentAtomSize ); 1242d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1243d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 124418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_gpu_dump_props(const struct app_gpu *gpu) 124518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 124618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkPhysicalDeviceProperties *props = &gpu->props; 12473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t apiVersion=props->apiVersion; 12483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t major = VK_VERSION_MAJOR(apiVersion); 12493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t minor = VK_VERSION_MINOR(apiVersion); 12503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t patch = VK_VERSION_PATCH(apiVersion); 125118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1252825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceProperties:\n"); 1253825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===========================\n"); 12543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); 12553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n",props->driverVersion, props->driverVersion); 12563c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tvendorID = 0x%04x\n", props->vendorID); 12573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceID = 0x%04x\n", props->deviceID); 12583c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); 12593c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceName = %s\n", props->deviceName); 12607dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 12617dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski app_dump_limits(&gpu->props.limits); 12627dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski app_dump_sparse_props(&gpu->props.sparseProperties); 12637dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 126418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 126518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 1266481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format on 126718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1268481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void 1269481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzapp_dump_extensions(const char *indent, const char *layer_name, 1270481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const uint32_t extension_count, 1271481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const VkExtensionProperties *extension_properties) { 12723c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 127318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (layer_name && (strlen(layer_name) > 0)) { 127418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s%s Extensions", indent, layer_name); 127518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } else { 127618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Extensions"); 12773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 127818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tcount = %d\n", extension_count); 1279481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (i = 0; i < extension_count; i++) { 128018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties const *ext_prop = &extension_properties[i]; 12813c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 128218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s\t", indent); 1283481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%-32s: extension revision %2d\n", ext_prop->extensionName, 1284481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ext_prop->specVersion); 1285ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 1286ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 128718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1288ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 1289ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 1290481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) { 1291ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop const VkQueueFamilyProperties *props = &gpu->queue_props[id]; 1292190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1293825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkQueueFamilyProperties[%d]:\n", id); 1294a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("===========================\n"); 12957fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay char *sep = ""; // separator character 1296a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\tqueueFlags = "); 12977fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { 12987fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("GRAPHICS"); 12997fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13007fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13017fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { 13027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sCOMPUTE", sep); 13037fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13047fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { 13067fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sTRANSFER", sep); 13077fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { 13107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sSPARSE", sep); 13117fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 1312a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\n"); 1313a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1314481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tqueueCount = %u\n", props->queueCount); 1315481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\ttimestampValidBits = %u\n", props->timestampValidBits); 13160339bc575660f6a9e04905cccfd8964cf8a87621Chia-I Wu printf("\tminImageTransferGranularity = (%d, %d, %d)\n", 1317481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.width, 1318481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.height, 1319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz props->minImageTransferGranularity.depth); 132018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1321d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1322d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1323481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump_memory_props(const struct app_gpu *gpu) { 13248205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 1325d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1326825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceMemoryProperties:\n"); 1327825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=================================\n"); 1328825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 1329723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 1330723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypes[%u] : \n", i); 1331723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 13327fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", 13337fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay props->memoryTypes[i].propertyFlags); 13347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 13357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // Print each named flag, if it is set. 13367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkFlags flags = props->memoryTypes[i].propertyFlags; 13377fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#define PRINT_FLAG(FLAG) \ 13387fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (flags & FLAG) \ 13397fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("\t\t\t" #FLAG "\n"); 13403c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) 13413c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) 13423c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) 13433c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_CACHED_BIT) 13443c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) 13457fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#undef PRINT_FLAG 1346723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 13473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\n"); 1348481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 1349723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 1350723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeaps[%u] : \n", i); 13513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const VkDeviceSize memSize = props->memoryHeaps[i].size; 13527fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER 13537fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay " (0x%" PRIxLEAST64 ")\n", 13543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay (size_t)memSize, memSize); 13553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 13567fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkMemoryHeapFlags heapFlags = props->memoryHeaps[i].flags; 13573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tflags: \n\t\t\t"); 13587fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf((heapFlags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) 13597fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" 13607fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay : "None\n"); 1361723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 136218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1363d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1364d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1365481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void app_gpu_dump(const struct app_gpu *gpu) { 1366e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 1367190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1368825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Device Extensions and layers:\n"); 1369825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=============================\n"); 1370190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 1371190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_props(gpu); 1372190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1373481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("", "Device", gpu->device_extension_count, 1374481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->device_extensions); 137518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); 137618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Layers\tcount = %d\n", gpu->device_layer_count); 137718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 137818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 137918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 138018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list const *layer_info = &gpu->device_layers[i]; 138118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1382481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz extract_version(layer_info->layer_properties.specVersion, &major, 1383481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &minor, &patch); 1384481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, 1385481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz patch); 1386481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(layer_version, sizeof(layer_version), "%d", 1387481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_info->layer_properties.implementationVersion); 138818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 138918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->layer_properties.layerName, 1390481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (char *)layer_info->layer_properties.description, spec_version, 1391481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_version); 139218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1393481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("\t", layer_info->layer_properties.layerName, 139418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_count, 139518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_properties); 139618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 139718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 1398ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 1399190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 1400190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_queue_props(gpu, i); 1401190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1402190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1403190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_memory_props(gpu); 1404190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1405a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_features(gpu); 1406a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 1407190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_dev_dump(&gpu->dev); 1408d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1409d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1410a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1411a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Enlarges the console window to have a large scrollback size. 1412a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic void ConsoleEnlarge() { 1413a3b7170656404199592bb65040621772f299a7f3Hugo Landau HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 1414a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1415a3b7170656404199592bb65040621772f299a7f3Hugo Landau // make the console window bigger 1416a3b7170656404199592bb65040621772f299a7f3Hugo Landau CONSOLE_SCREEN_BUFFER_INFO csbi; 1417a3b7170656404199592bb65040621772f299a7f3Hugo Landau COORD bufferSize; 14187fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (GetConsoleScreenBufferInfo(consoleHandle, &csbi)) { 1419a3b7170656404199592bb65040621772f299a7f3Hugo Landau bufferSize.X = csbi.dwSize.X + 30; 1420a3b7170656404199592bb65040621772f299a7f3Hugo Landau bufferSize.Y = 20000; 1421a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleScreenBufferSize(consoleHandle, bufferSize); 1422a3b7170656404199592bb65040621772f299a7f3Hugo Landau } 1423a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1424a3b7170656404199592bb65040621772f299a7f3Hugo Landau SMALL_RECT r; 1425a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Left = r.Top = 0; 1426a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Right = csbi.dwSize.X - 1 + 30; 1427a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Bottom = 50; 1428a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleWindowInfo(consoleHandle, true, &r); 1429a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1430a3b7170656404199592bb65040621772f299a7f3Hugo Landau // change the console window title 1431a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleTitle(TEXT(APP_SHORT_NAME)); 1432a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1433a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1434a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1435481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint main(int argc, char **argv) { 14367b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo unsigned int major, minor, patch; 14377b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo struct app_gpu gpus[MAX_GPUS]; 14388205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice objs[MAX_GPUS]; 1439e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t gpu_count, i; 1440382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 14413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter struct app_instance inst; 1442190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1443a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1444a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (ConsoleIsExclusive()) 1445a3b7170656404199592bb65040621772f299a7f3Hugo Landau ConsoleEnlarge(); 1446a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1447a3b7170656404199592bb65040621772f299a7f3Hugo Landau 14483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay major = VK_VERSION_MAJOR(VK_API_VERSION_1_0); 14493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay minor = VK_VERSION_MINOR(VK_API_VERSION_1_0); 14503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay patch = VK_VERSION_PATCH(VK_HEADER_VERSION); 14513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 14527b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo printf("===========\n"); 1453481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("VULKAN INFO\n"); 1454b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo printf("===========\n\n"); 1455ab5e3be206ad34b1d92a1552d546d32760c3bfb1Mark Lobodzinski printf("Vulkan API Version: %d.%d.%d\n\n", major, minor, patch); 1456b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo 14573c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_create_instance(&inst); 145818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1459825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Instance Extensions and layers:\n"); 1460825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===============================\n"); 1461481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz app_dump_extensions("", "Instance", inst.global_extension_count, 1462481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz inst.global_extensions); 1463825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1464825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("Instance Layers\tcount = %d\n", inst.global_layer_count); 146518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst.global_layer_count; i++) { 146618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 146718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 1468481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkLayerProperties const *layer_prop = 1469481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &inst.global_layers[i].layer_properties; 147018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 147118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_prop->specVersion, &major, &minor, &patch); 1472481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, 1473481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz patch); 1474481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz snprintf(layer_version, sizeof(layer_version), "%d", 1475481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_prop->implementationVersion); 147618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 1477481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz layer_prop->layerName, (char *)layer_prop->description, 1478481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz spec_version, layer_version); 147918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 148018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("\t", 148118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].layer_properties.layerName, 148218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_count, 148318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_properties); 148418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 148529669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn 14863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 148707b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (err) 148807b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn ERR_EXIT(err); 148907b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (gpu_count > MAX_GPUS) { 149018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo printf("Too many GPUS found \n"); 1491ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter ERR_EXIT(-1); 149207b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn } 14933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 1494190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (err) 1495190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu ERR_EXIT(err); 1496190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1497190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) { 1498190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_init(&gpus[i], i, objs[i]); 1499190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump(&gpus[i]); 1500190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n\n"); 1501190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1502190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1503a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("Presentable Surface formats:\n"); 1504a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("============================\n"); 15057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.width = 256; 15067fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.height = 256; 15077fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay int formatCount = 0; 1508a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 15097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--WIN32-- 1510a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 1511a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_create_win32_window(&inst); 1512a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay for (i = 0; i < gpu_count; i++) { 1513a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_create_win32_surface(&inst, &gpus[i]); 1514a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 1515a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("Surface type : %s\n", VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 15167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay formatCount += app_dump_surface_formats(&inst, &gpus[i]); 1517a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_surface(&inst); 1518a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1519a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_win32_window(&inst); 1520a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 15217fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XCB-- 1522a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 1523a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_create_xcb_window(&inst); 15247fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (i = 0; i < gpu_count; i++) { 15257fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay app_create_xcb_surface(&inst, &gpus[i]); 1526a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 15277fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("Surface type : %s\n", VK_KHR_XCB_SURFACE_EXTENSION_NAME); 15287fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay formatCount += app_dump_surface_formats(&inst, &gpus[i]); 1529a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_surface(&inst); 1530a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1531a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_xcb_window(&inst); 1532a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 15337fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XLIB-- 1534a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XLIB_KHR 1535a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_create_xlib_window(&inst); 15367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (i = 0; i < gpu_count; i++) { 15377fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay app_create_xlib_surface(&inst, &gpus[i]); 1538a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 15397fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("Surface type : %s\n", VK_KHR_XLIB_SURFACE_EXTENSION_NAME); 15407fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay formatCount += app_dump_surface_formats(&inst, &gpus[i]); 1541a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_surface(&inst); 1542a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1543a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay app_destroy_xlib_window(&inst); 1544a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 15457fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // TODO: Android / Wayland / MIR 15467fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (!formatCount) 15477fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("None found\n"); 1548a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //--------- 1549a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1550190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) 1551190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_destroy(&gpus[i]); 1552190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 15533c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_destroy_instance(&inst); 15540b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 1555ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 1556a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1557a3b7170656404199592bb65040621772f299a7f3Hugo Landau if (ConsoleIsExclusive()) 155818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); 1559ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 1560a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1561a3b7170656404199592bb65040621772f299a7f3Hugo Landau return 0; 1562a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1563