vulkaninfo.c revision 55016b83baf512e5590d4ed265081fa33eb4d4ff
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 */ 23bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 24bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#ifdef __GNUC__ 25bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#ifndef _POSIX_C_SOURCE 26bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define _POSIX_C_SOURCE 200809L 27bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#endif 28bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#else 29bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define strndup(p, n) strdup(p) 30bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#endif 31bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 3246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h> 33825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski#include <inttypes.h> 347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdbool.h> 357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdio.h> 367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdlib.h> 377fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <string.h> 38d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 39ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 4018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h> 4118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h> 42cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#endif // _WIN32 4364070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott 44787b627282489b56b4ed111f152008fe66d33488Mun Gwan-gyeong#if defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR) 45a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#include <X11/Xutil.h> 46a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 47a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 480394191ea288611bb919194d46fde101947df54aTony Barbour#if defined(VK_USE_PLATFORM_MIR_KHR) 490394191ea288611bb919194d46fde101947df54aTony Barbour#warning "Vulkaninfo does not have code for Mir at this time" 500394191ea288611bb919194d46fde101947df54aTony Barbour#endif 510394191ea288611bb919194d46fde101947df54aTony Barbour 52329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vulkan.h> 5346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 54bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski#define ERR(err) printf("%s:%d: failed with %s\n", __FILE__, __LINE__, VkResultString(err)); 5546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32 5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 587c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf 59bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define strdup _strdup 607c83aa210365e148877f0f3698292a1b509018ffIan Elliott 61a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Returns nonzero if the console is used only for this process. Will return 62a3b7170656404199592bb65040621772f299a7f3Hugo Landau// zero if another process (such as cmd.exe) is also attached. 63a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic int ConsoleIsExclusive(void) { 64a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD pids[2]; 65a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD num_pids = GetConsoleProcessList(pids, ARRAYSIZE(pids)); 66a3b7170656404199592bb65040621772f299a7f3Hugo Landau return num_pids <= 1; 67a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 6818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 69cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define WAIT_FOR_CONSOLE_DESTROY \ 70cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 71cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) Sleep(INFINITE); \ 7218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 7318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 74481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY 7518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 7618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 77cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define ERR_EXIT(err) \ 78cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 79cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ERR(err); \ 80cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski fflush(stdout); \ 81cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski WAIT_FOR_CONSOLE_DESTROY; \ 82cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski exit(-1); \ 83481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 8446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 8622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 8722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 8822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 8922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 9022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 9146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 9246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 944e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 9546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 96f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppGpu; 9746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 98f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppDev { 99f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppGpu *gpu; /* point back to the GPU */ 10046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 101382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 10246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1031f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkFormatProperties format_props[VK_FORMAT_RANGE_SIZE]; 10446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 10546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 106f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct LayerExtensionList { 10718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties layer_properties; 10818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t extension_count; 10918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_properties; 11018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}; 11118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 112f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppInstance { 113481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkInstance instance; 11418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t global_layer_count; 115f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *global_layers; 1163c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 117cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski VkExtensionProperties *global_extensions; // Instance Extensions 118a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 119bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; 120bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; 121bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; 122bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; 123a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 124a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkSurfaceKHR surface; 125a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int width, height; 126a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 127a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 128cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HINSTANCE h_instance; // Windows Instance 129cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HWND h_wnd; // window handle 130b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 1317fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_connection_t *xcb_connection; 1327fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_screen_t *xcb_screen; 1337fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_window_t xcb_window; 134b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 1357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Display *xlib_display; 1367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Window xlib_window; 137cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#elif VK_USE_PLATFORM_ANDROID_KHR // TODO 1387fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay ANativeWindow *window; 139a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 1403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 1413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 142f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppGpu { 143e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 1448205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 14546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1468205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 14746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 148e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 149ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop VkQueueFamilyProperties *queue_props; 150ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 15146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1528205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 153a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 1547dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski VkPhysicalDevice limits; 15546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1563c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 1573c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 15846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 159f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppDev dev; 16046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 16146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 162bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic VKAPI_ATTR VkBool32 VKAPI_CALL DbgCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, 163bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg, 164bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski void *pUserData) { 165481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz char *message = (char *)malloc(strlen(pMsg) + 100); 166f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 167481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz assert(message); 168f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 169acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 170bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 1715c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 172bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 1735c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 174bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "INFO: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 175acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 176bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 177f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter } 178f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 179481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s\n", message); 180f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter fflush(stdout); 181f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter free(message); 182f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 183f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter /* 184f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * false indicates that layer should not bail-out of an 185f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * API call that had validation failures. This may mean that the 186f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * app dies inside the driver due to invalid parameter(s). 187f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * That's what would happen without validation layers, so we'll 188f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * keep that behavior here. 189f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter */ 190f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter return false; 191f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter} 192f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 193f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkResultString(VkResult err) { 19446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 195cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 196cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case r: \ 197481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 198481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_SUCCESS); 199481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_NOT_READY); 200481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_TIMEOUT); 201481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_SET); 202481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_RESET); 203481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INITIALIZATION_FAILED); 204481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_HOST_MEMORY); 205481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 206481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_DEVICE_LOST); 207481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_LAYER_NOT_PRESENT); 208481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_EXTENSION_NOT_PRESENT); 209481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_MEMORY_MAP_FAILED); 210481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INCOMPATIBLE_DRIVER); 21146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 212cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 213cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_RESULT"; 21446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 21546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 216d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 217f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkPhysicalDeviceTypeString(VkPhysicalDeviceType type) { 218190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 219cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 220cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_PHYSICAL_DEVICE_TYPE_##r: \ 221481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 222481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(OTHER); 223481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(INTEGRATED_GPU); 224481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(DISCRETE_GPU); 225481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VIRTUAL_GPU); 22655016b83baf512e5590d4ed265081fa33eb4d4ffChris Forbes STR(CPU); 227d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 228cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 229cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_DEVICE"; 230190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 231d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 232d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 233f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkFormatString(VkFormat fmt) { 2342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 235cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 236cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_FORMAT_##r: \ 237481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 238481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(UNDEFINED); 239481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4_UNORM_PACK8); 240481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4B4A4_UNORM_PACK16); 241481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B4G4R4A4_UNORM_PACK16); 242481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G6B5_UNORM_PACK16); 243481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G6R5_UNORM_PACK16); 244481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G5B5A1_UNORM_PACK16); 245481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G5R5A1_UNORM_PACK16); 246481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A1R5G5B5_UNORM_PACK16); 247481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UNORM); 248481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SNORM); 249481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_USCALED); 250481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SSCALED); 251481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UINT); 252481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SINT); 253481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SRGB); 254481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UNORM); 255481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SNORM); 256481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_USCALED); 257481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SSCALED); 258481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UINT); 259481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SINT); 260481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SRGB); 261481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UNORM); 262481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SNORM); 263481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_USCALED); 264481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SSCALED); 265481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UINT); 266481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SINT); 267481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SRGB); 268481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UNORM); 269481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SNORM); 270481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_USCALED); 271481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SSCALED); 272481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UINT); 273481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SINT); 274481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SRGB); 275481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UNORM); 276481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SNORM); 277481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_USCALED); 278481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SSCALED); 279481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UINT); 280481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SINT); 281481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SRGB); 282481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UNORM); 283481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SNORM); 284481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_USCALED); 285481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SSCALED); 286481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UINT); 287481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SINT); 288481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SRGB); 289481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UNORM_PACK32); 290481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SNORM_PACK32); 291481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_USCALED_PACK32); 292481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SSCALED_PACK32); 293481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UINT_PACK32); 294481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SINT_PACK32); 295481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SRGB_PACK32); 296481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UNORM_PACK32); 297481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SNORM_PACK32); 298481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_USCALED_PACK32); 299481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SSCALED_PACK32); 300481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UINT_PACK32); 301481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SINT_PACK32); 302481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UNORM_PACK32); 303481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SNORM_PACK32); 304481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_USCALED_PACK32); 305481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SSCALED_PACK32); 306481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UINT_PACK32); 307481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SINT_PACK32); 308481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UNORM); 309481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SNORM); 310481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_USCALED); 311481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SSCALED); 312481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UINT); 313481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SINT); 314481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SFLOAT); 315481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UNORM); 316481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SNORM); 317481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_USCALED); 318481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SSCALED); 319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UINT); 320481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SINT); 321481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SFLOAT); 322481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UNORM); 323481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SNORM); 324481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_USCALED); 325481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SSCALED); 326481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UINT); 327481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SINT); 328481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SFLOAT); 329481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UNORM); 330481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SNORM); 331481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_USCALED); 332481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SSCALED); 333481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UINT); 334481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SINT); 335481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SFLOAT); 336481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_UINT); 337481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SINT); 338481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SFLOAT); 339481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_UINT); 340481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SINT); 341481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SFLOAT); 342481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_UINT); 343481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SINT); 344481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SFLOAT); 345481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_UINT); 346481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SINT); 347481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SFLOAT); 348481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_UINT); 349481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SINT); 350481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SFLOAT); 351481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_UINT); 352481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SINT); 353481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SFLOAT); 354481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_UINT); 355481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SINT); 356481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SFLOAT); 357481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_UINT); 358481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SINT); 359481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SFLOAT); 360481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B10G11R11_UFLOAT_PACK32); 361481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(E5B9G9R9_UFLOAT_PACK32); 362481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM); 363481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(X8_D24_UNORM_PACK32); 364481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT); 365481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(S8_UINT); 366481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM_S8_UINT); 367481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D24_UNORM_S8_UINT); 368481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT_S8_UINT); 369481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_UNORM_BLOCK); 370481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_SRGB_BLOCK); 371481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_UNORM_BLOCK); 372481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_SRGB_BLOCK); 373481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_UNORM_BLOCK); 374481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_SRGB_BLOCK); 375481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_UNORM_BLOCK); 376481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_SNORM_BLOCK); 377481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_UNORM_BLOCK); 378481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_SNORM_BLOCK); 379481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_UFLOAT_BLOCK); 380481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_SFLOAT_BLOCK); 381481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_UNORM_BLOCK); 382481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_SRGB_BLOCK); 383481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8_UNORM_BLOCK); 384481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A1_UNORM_BLOCK); 385481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A8_UNORM_BLOCK); 386481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_UNORM_BLOCK); 387481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_SNORM_BLOCK); 388481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_UNORM_BLOCK); 389481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_SNORM_BLOCK); 390481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_UNORM_BLOCK); 391481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_SRGB_BLOCK); 392481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_UNORM_BLOCK); 393481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_SRGB_BLOCK); 394481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_UNORM_BLOCK); 395481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_SRGB_BLOCK); 396481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_UNORM_BLOCK); 397481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_SRGB_BLOCK); 398481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_UNORM_BLOCK); 399481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_SRGB_BLOCK); 400481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_UNORM_BLOCK); 401481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_SRGB_BLOCK); 402481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_UNORM_BLOCK); 403481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_SRGB_BLOCK); 404481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_UNORM_BLOCK); 405481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_SRGB_BLOCK); 406481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_UNORM_BLOCK); 407481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_SRGB_BLOCK); 408481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_UNORM_BLOCK); 409481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_SRGB_BLOCK); 410481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_UNORM_BLOCK); 411481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_SRGB_BLOCK); 412481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_UNORM_BLOCK); 413481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_SRGB_BLOCK); 414481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_UNORM_BLOCK); 415481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_SRGB_BLOCK); 416481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_UNORM_BLOCK); 417481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_SRGB_BLOCK); 418d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 419cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 420cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_FORMAT"; 421190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 422d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 423bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WIN32_KHR) 424f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkPresentModeString(VkPresentModeKHR mode) { 4257b3aadea3a889f1e04529f50649124277a47db46joey-lunarg switch (mode) { 426cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 427cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_PRESENT_MODE_##r: \ 4287b3aadea3a889f1e04529f50649124277a47db46joey-lunarg return #r 4297b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(IMMEDIATE_KHR); 4307b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(MAILBOX_KHR); 4317b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(FIFO_KHR); 4327b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(FIFO_RELAXED_KHR); 4337b3aadea3a889f1e04529f50649124277a47db46joey-lunarg#undef STR 434cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 435cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_FORMAT"; 4367b3aadea3a889f1e04529f50649124277a47db46joey-lunarg } 4377b3aadea3a889f1e04529f50649124277a47db46joey-lunarg} 438b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#endif 4397b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 440f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevInitFormats(struct AppDev *dev) { 441382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat f; 4422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 4431f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (f = 0; f < VK_FORMAT_RANGE_SIZE; f++) { 444382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormat fmt = f; 4452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 446bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, &dev->format_props[f]); 44746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 44846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 44946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 450bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void ExtractVersion(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch) { 45118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *major = version >> 22; 45218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *minor = (version >> 12) & 0x3ff; 45318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *patch = version & 0xfff; 45418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 45518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 456bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppGetPhysicalDeviceLayerExtensions(struct AppGpu *gpu, char *layer_name, uint32_t *extension_count, 457bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski VkExtensionProperties **extension_properties) { 45818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 45918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 46018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 46118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 46318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 464bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, NULL); 46518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 46618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 46818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 46918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 47018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 471bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, ext_ptr); 47218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 47318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 47418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 47518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 47618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 47718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 47818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 479f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevInit(struct AppDev *dev, struct AppGpu *gpu) { 480ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 4819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 48246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 4838173093c7d5db4415108a25e24fd0c07d7209f20Tony Barbour .flags = 0, 484045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .queueCreateInfoCount = 0, 485045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .pQueueCreateInfos = NULL, 486a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 48718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 488a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledExtensionCount = 0, 48918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 49046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 4913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 492426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 4939652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // Device extensions 494bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetPhysicalDeviceLayerExtensions(gpu, NULL, &gpu->device_extension_count, &gpu->device_extensions); 4953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 4969e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 4979e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 49846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 499045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.queueCreateInfoCount = gpu->queue_count; 500045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.pQueueCreateInfos = gpu->queue_reqs; 50146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 502a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn info.enabledLayerCount = 0; 50318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledLayerNames = NULL; 5044ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.enabledExtensionCount = 0; 5054ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.ppEnabledExtensionNames = NULL; 5063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 50769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj); 508cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 50946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 51046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 511f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevDestroy(struct AppDev *dev) { 512c7e3fbda0891c48fb667f645d40d495be48f3fe8Tony Barbour vkDeviceWaitIdle(dev->obj); 51369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDevice(dev->obj, NULL); 51446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 51546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 516bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppGetGlobalLayerExtensions(char *layer_name, uint32_t *extension_count, VkExtensionProperties **extension_properties) { 51718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 51818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 51918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 52018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 52118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 52218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 5237fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension count if the last parameter is NULL 524bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, NULL); 52518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 52618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 52718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 52818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 52918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 53018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 5317fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension properties if the last parameter is not NULL 532bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, ext_ptr); 53318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 53418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 53518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 53618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 53718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 53818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 5397fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay/* Gets a list of layer and instance extensions */ 540f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGetInstanceExtensions(struct AppInstance *inst) { 5417fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkResult U_ASSERT_ONLY err; 542a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5437fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t count = 0; 544a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5457fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Scan layers */ 5467fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *global_layer_properties = NULL; 547f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *global_layers = NULL; 548a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5497fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay do { 5507fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkEnumerateInstanceLayerProperties(&count, NULL); 5517fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 552a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5537fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layer_properties) { 5547fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 5557fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 5567fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay global_layer_properties = malloc(sizeof(VkLayerProperties) * count); 5577fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layer_properties); 558a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5597fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layers) { 5607fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layers); 5617fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 562f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg global_layers = malloc(sizeof(struct LayerExtensionList) * count); 5637fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layers); 564a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 565bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties); 5667fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } while (err == VK_INCOMPLETE); 5677fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 568a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5697fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layer_count = count; 5707fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layers = global_layers; 571a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5727fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (uint32_t i = 0; i < inst->global_layer_count; i++) { 5737fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *src_info = &global_layer_properties[i]; 574f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *dst_info = &inst->global_layers[i]; 575bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties)); 576a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 577cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Save away layer extension info for report 578cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Gets layer extensions, if first parameter is not NULL 579bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetGlobalLayerExtensions(src_info->layerName, &dst_info->extension_count, &dst_info->extension_properties); 5807fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 5817fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 5827fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 583cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Collect global extensions 5847fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_extension_count = 0; 5859652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // Gets instance extensions, if no layer was specified in the first 5869652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // paramteter 587bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetGlobalLayerExtensions(NULL, &inst->global_extension_count, &inst->global_extensions); 588a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 589a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 590f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateInstance(struct AppInstance *inst) { 591f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGetInstanceExtensions(inst); 592a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 5937fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//---Build a list of extensions to load--- 5947fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#define MAX_EXTENSIONS 4 5957fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t i = 0; 5967fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t ext_count = 0; 597cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski const char *ext_names[MAX_EXTENSIONS]; // array of string pointers to 598cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski // extension names 5997fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (i = 0; (i < inst->global_extension_count); i++) { 6007fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay const char *found_name = inst->global_extensions[i].extensionName; 6019652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) { 6029652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME; 6039652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 604a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 605a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 606cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WAYLAND_KHR) || \ 607bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski defined(VK_USE_PLATFORM_WIN32_KHR) || defined(VK_USE_PLATFORM_ANDROID_KHR) 6087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ext_count) 609bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski for (i = 0; ((i < inst->global_extension_count) && (ext_count < MAX_EXTENSIONS)); i++) { 6107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay const char *found_name = inst->global_extensions[i].extensionName; 6117fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 6129652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay if (!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) { 6139652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; 6149652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 615b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 6169652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) { 6179652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; 6189652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 619b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 6209652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) { 6219652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; 6229652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 623b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_WAYLAND_KHR 624b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour if (!strcmp(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, found_name)) { 625b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour ext_names[ext_count++] = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME; 626b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour } 627b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_ANDROID_KHR 6289652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) { 6299652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; 6309652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 631a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 6327fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 633fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 6347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // If we don't find the KHR_SURFACE extension and at least one other 6357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // device-specific extension, 6367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // then give up on reporting presentable surface formats." 637cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ext_count < 2) ext_count = 0; 638a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //---------------------------------------- 639a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 6413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 6423c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 6431f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationName = APP_SHORT_NAME, 6441f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .applicationVersion = 1, 6453c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 6463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 647d3995c987ba7e47700ceb54535880e782c6b04c1Jon Ashburn .apiVersion = VK_API_VERSION_1_0, 6483c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 649a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstanceCreateInfo inst_info = { 6513c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 6523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 6531f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationInfo = &app_info, 654a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 65518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 6567fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay .enabledExtensionCount = ext_count, 657a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay .ppEnabledExtensionNames = ext_names, 6583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 65946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 660acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackCreateInfoEXT dbg_info; 661f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter memset(&dbg_info, 0, sizeof(dbg_info)); 662acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter dbg_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 663bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski dbg_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 664f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg dbg_info.pfnCallback = DbgCallback; 665f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter inst_info.pNext = &dbg_info; 666f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 667a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 66869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateInstance(&inst_info, NULL, &inst->instance); 6693c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 6703c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 6713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 6723c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 6733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 67446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 675a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 6767fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (ext_count > 0) { 6777fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--Load Extensions-- 678cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define GET_INSTANCE_PROC_ADDR(ENTRYPOINT) \ 679bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski { inst->ENTRYPOINT = (void *)vkGetInstanceProcAddr(inst->instance, #ENTRYPOINT); } 6807fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceSupportKHR) 681a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) 6827fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceFormatsKHR) 683a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfacePresentModesKHR) 6847fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#undef GET_INSTANCE_PROC_ADDR 685a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 6863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 6873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 688a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 689a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 690f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyInstance(struct AppInstance *inst) { 6913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 69269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyInstance(inst->instance, NULL); 69346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 69446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 695bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppGpuInit(struct AppGpu *gpu, uint32_t id, VkPhysicalDevice obj) { 696aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 69746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 69846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 69946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 70046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 70146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 702426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 70301d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 70446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 70546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 70601d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL); 70746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 708481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props = malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 709426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 710cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpu->queue_props) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 711bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, gpu->queue_props); 71246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 71346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 71446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 715cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpu->queue_reqs) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 71646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 717bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); 718cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!queue_priorities) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 719bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); 720ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 721ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].pNext = NULL; 7228173093c7d5db4415108a25e24fd0c07d7209f20Tony Barbour gpu->queue_reqs[i].flags = 0; 723fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes gpu->queue_reqs[i].queueFamilyIndex = i; 724045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 725d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter gpu->queue_reqs[i].pQueuePriorities = queue_priorities; 72646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 72746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 72801d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 72946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 73001d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 731a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 732f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevInit(&gpu->dev, gpu); 733f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevInitFormats(&gpu->dev); 73446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 73546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 736f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDestroy(struct AppGpu *gpu) { 737f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDestroy(&gpu->dev); 7383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 7392c0948342e626904289329dd3f0912b6714eac19Jon Ashburn 740d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->queue_count; i++) { 741481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz free((void *)gpu->queue_reqs[i].pQueuePriorities); 742d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter } 7432c0948342e626904289329dd3f0912b6714eac19Jon Ashburn free(gpu->queue_reqs); 74446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 74546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 74646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 747481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format off 748a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 749a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 750a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 751a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//---------------------------Win32--------------------------- 752a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 753a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 754a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay// MS-Windows event handling function: 755a155d62f73c03dea7315ba34a7582239fdfc85d2Rene LindsayLRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 756a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay return (DefWindowProc(hWnd, uMsg, wParam, lParam)); 757a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 758a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 759f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateWin32Window(struct AppInstance *inst) { 760f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_instance = GetModuleHandle(NULL); 761a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 762a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WNDCLASSEX win_class; 763a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 764a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Initialize the window class structure: 765a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbSize = sizeof(WNDCLASSEX); 766a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.style = CS_HREDRAW | CS_VREDRAW; 767a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpfnWndProc = WndProc; 768a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbClsExtra = 0; 769a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbWndExtra = 0; 770f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg win_class.hInstance = inst->h_instance; 771a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); 772a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hCursor = LoadCursor(NULL, IDC_ARROW); 773a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 774a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszMenuName = NULL; 775a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszClassName = APP_SHORT_NAME; 776f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg win_class.hInstance = inst->h_instance; 777a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); 778a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Register window class: 779a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay if (!RegisterClassEx(&win_class)) { 780a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 78154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to register the window class!\n"); 782a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 783a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 784a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 785a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Create window with the registered class: 786a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay RECT wr = { 0, 0, inst->width, inst->height }; 787a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); 788f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_wnd = CreateWindowEx(0, 789a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // class name 790a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // app name 791a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //WS_VISIBLE | WS_SYSMENU | 792a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WS_OVERLAPPEDWINDOW, // window style 793a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 100, 100, // x/y coords 794a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.right - wr.left, // width 795a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.bottom - wr.top, // height 796a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to parent 797a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to menu 798f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_instance, // hInstance 799a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL); // no extra parameters 800f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg if (!inst->h_wnd) { 801a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 80254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to create a window!\n"); 803a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 804a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 805a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 806a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 807a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 808f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateWin32Surface(struct AppInstance *inst) { 809a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 810a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkWin32SurfaceCreateInfoKHR createInfo; 811a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 812a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 813a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 814f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg createInfo.hinstance = inst->h_instance; 815f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg createInfo.hwnd = inst->h_wnd; 8167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 8177fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 818a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 819a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 820f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyWin32Window(struct AppInstance *inst) { 821f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg DestroyWindow(inst->h_wnd); 822a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 823a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_WIN32_KHR 824a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 825a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 826b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || \ 827b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour defined(VK_USE_PLATFORM_XLIB_KHR) || \ 828fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz defined(VK_USE_PLATFORM_WIN32_KHR) 829f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroySurface(struct AppInstance *inst) { //same for all platforms 830a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vkDestroySurfaceKHR(inst->instance, inst->surface, NULL); 831a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 832fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 833a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 834a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XCB---------------------------- 83554cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 836a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 837f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXcbWindow(struct AppInstance *inst) { 838ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski //--Init Connection-- 839ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski const xcb_setup_t *setup; 840ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_screen_iterator_t iter; 841ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski int scr; 842ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 843ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_connection = xcb_connect(NULL, &scr); 844ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski if (inst->xcb_connection == NULL) { 845ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski printf("XCB failed to connect to the X server.\nExiting ...\n"); 846ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski fflush(stdout); 847ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski exit(1); 848ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 849ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 850c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses int conn_error = xcb_connection_has_error(inst->xcb_connection); 851c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses if (conn_error) { 852c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses printf("XCB failed to connect to the X server due to error:%d.\nExiting ...\n", conn_error); 853c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses fflush(stdout); 854c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses exit(1); 855c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses } 856c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses 857ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski setup = xcb_get_setup(inst->xcb_connection); 858ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski iter = xcb_setup_roots_iterator(setup); 859ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski while (scr-- > 0) { 860ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_screen_next(&iter); 861ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 862ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 863ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_screen = iter.data; 864ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski //------------------- 865ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 866ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_window = xcb_generate_id(inst->xcb_connection); 867ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_create_window(inst->xcb_connection, XCB_COPY_FROM_PARENT, inst->xcb_window, 868ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_screen->root, 0, 0, inst->width, inst->height, 0, 869ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, 870ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 0, NULL); 871ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 872ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); 873ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); 874ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski free(reply); 875a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 876a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 877f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXcbSurface(struct AppInstance *inst) { 878a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 879a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXcbSurfaceCreateInfoKHR xcb_createInfo; 880a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; 881a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.pNext = NULL; 882a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.flags = 0; 883a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.connection = inst->xcb_connection; 884a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.window = inst->xcb_window; 8857fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); 8867fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 887a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 888a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 889f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyXcbWindow(struct AppInstance *inst) { 890a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_destroy_window(inst->xcb_connection, inst->xcb_window); 891a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_disconnect(inst->xcb_connection); 892a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 893b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour//VK_USE_PLATFORM_XCB_KHR 894a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 895a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 896a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XLib--------------------------- 897b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 898f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXlibWindow(struct AppInstance *inst) { 899a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay long visualMask = VisualScreenMask; 900a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int numberOfVisuals; 90154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 902600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz inst->xlib_display = XOpenDisplay(NULL); 903600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz if (inst->xlib_display == NULL) { 904600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz printf("XLib failed to connect to the X server.\nExiting ...\n"); 905600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz fflush(stdout); 906600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz exit(1); 907600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz } 908f231a17a49b329c79ef12bc55fde9bdc893372dcAwais Belal 90954cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay XVisualInfo vInfoTemplate={}; 910a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vInfoTemplate.screen = DefaultScreen(inst->xlib_display); 911a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XVisualInfo *visualInfo = XGetVisualInfo(inst->xlib_display, visualMask, 912a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay &vInfoTemplate, &numberOfVisuals); 913a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_window = XCreateWindow( 914a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), 0, 0, 915a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->width, inst->height, 0, visualInfo->depth, InputOutput, 91654cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay visualInfo->visual, 0, NULL); 917a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 918aad516ebcb8e220a5770b7802f241c933a920c56Rene Lindsay XSync(inst->xlib_display,false); 919a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 920a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 921f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXlibSurface(struct AppInstance *inst) { 922a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 923a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXlibSurfaceCreateInfoKHR createInfo; 924a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; 925a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 926a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 927a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.dpy = inst->xlib_display; 928a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.window = inst->xlib_window; 9297fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 9307fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 931a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 932a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 933f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyXlibWindow(struct AppInstance *inst) { 934a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XDestroyWindow(inst->xlib_display, inst->xlib_window); 935a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XCloseDisplay(inst->xlib_display); 936a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 937a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_XLIB_KHR 938a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 939a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 940b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || \ 941b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour defined(VK_USE_PLATFORM_XLIB_KHR) || \ 942fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz defined(VK_USE_PLATFORM_WIN32_KHR) 943f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic int AppDumpSurfaceFormats(struct AppInstance *inst, struct AppGpu *gpu){ 944a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Get the list of VkFormat's that are supported: 945ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski VkResult U_ASSERT_ONLY err; 946f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg uint32_t format_count = 0; 947f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &format_count, NULL); 948ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski assert(!err); 949ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 950f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkSurfaceFormatKHR *surf_formats = (VkSurfaceFormatKHR *)malloc(format_count * sizeof(VkSurfaceFormatKHR)); 951242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz if (!surf_formats) 952242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 953f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &format_count, surf_formats); 954ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski assert(!err); 955f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("Formats:\t\tcount = %d\n", format_count); 956ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 957f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg for (uint32_t i = 0; i < format_count; i++) { 958f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t%s\n", VkFormatString(surf_formats[i].format)); 959ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 960ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski fflush(stdout); 961f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg return format_count; 962a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 9637b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 964f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic int AppDumpSurfacePresentModes(struct AppInstance *inst, struct AppGpu *gpu) { 9657b3aadea3a889f1e04529f50649124277a47db46joey-lunarg // Get the list of VkPresentMode's that are supported: 9667b3aadea3a889f1e04529f50649124277a47db46joey-lunarg VkResult U_ASSERT_ONLY err; 967f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg uint32_t present_mode_count = 0; 968f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->obj, inst->surface, &present_mode_count, NULL); 9697b3aadea3a889f1e04529f50649124277a47db46joey-lunarg assert(!err); 9707b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 971f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkPresentModeKHR *surf_present_modes = (VkPresentModeKHR *)malloc(present_mode_count * sizeof(VkPresentInfoKHR)); 972242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz if (!surf_present_modes) 973242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 974f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->obj, inst->surface, &present_mode_count, surf_present_modes); 9757b3aadea3a889f1e04529f50649124277a47db46joey-lunarg assert(!err); 976f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("Present Modes:\t\tcount = %d\n", present_mode_count); 9777b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 978f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg for (uint32_t i = 0; i < present_mode_count; i++) { 979f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t%s\n", VkPresentModeString(surf_present_modes[i])); 9807b3aadea3a889f1e04529f50649124277a47db46joey-lunarg } 9817b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("\n"); 9827b3aadea3a889f1e04529f50649124277a47db46joey-lunarg fflush(stdout); 983f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg return present_mode_count; 9847b3aadea3a889f1e04529f50649124277a47db46joey-lunarg} 985fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 986a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 987f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevDumpFormatProps(const struct AppDev *dev, VkFormat fmt) 988d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 989382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 990190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 991190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 992382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 9934b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } features[3]; 994190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 9954b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].name = "linearTiling FormatFeatureFlags"; 9964b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].flags = props->linearTilingFeatures; 9974b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].name = "optimalTiling FormatFeatureFlags"; 9984b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].flags = props->optimalTilingFeatures; 9994b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].name = "bufferFeatures FormatFeatureFlags"; 10004b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].flags = props->bufferFeatures; 10014b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski 1002f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\nFORMAT_%s:", VkFormatString(fmt)); 1003ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski for (uint32_t i = 0; i < ARRAY_SIZE(features); i++) { 10044b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t%s:", features[i].name); 10054b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski if (features[i].flags == 0) { 10064b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t\tNone"); 10074b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } else { 10083c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 10093c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), //0x0001 10103c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), //0x0002 10113c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), //0x0004 10123c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), //0x0008 10133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), //0x0010 10143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), //0x0020 10153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : ""), //0x0040 10163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), //0x0080 10173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), //0x0100 10183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), //0x0200 10193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), //0x0400 10203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), //0x0800 10213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), //0x1000 10223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene 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 10234b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } 1024190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 10254b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n"); 1026d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1027d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1028d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1029d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 1030f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargAppDevDump(const struct AppDev *dev) 1031d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1032785034443420fe897a68fa78f2a72edb1a91dd53Rene Lindsay printf("Format Properties:\n"); 1033785034443420fe897a68fa78f2a72edb1a91dd53Rene Lindsay printf("=================="); 1034382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 1035190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 10361f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (fmt = 0; fmt < VK_FORMAT_RANGE_SIZE; fmt++) { 1037f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDumpFormatProps(dev, fmt); 1038190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1039d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1040d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1041009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 1042009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 1043009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 1044009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 1045009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 1046009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 1047f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpFeatures(const struct AppGpu *gpu) 1048a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 1049a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 1050a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 1051825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceFeatures:\n"); 1052825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=========================\n"); 1053825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1054825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); 1055825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); 1056825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\timageCubeArray = %u\n", features->imageCubeArray ); 1057825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tindependentBlend = %u\n", features->independentBlend ); 1058825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tgeometryShader = %u\n", features->geometryShader ); 1059825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttessellationShader = %u\n", features->tessellationShader ); 1060825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsampleRateShading = %u\n", features->sampleRateShading ); 1061c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); 1062825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlogicOp = %u\n", features->logicOp ); 1063825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); 10640bdccbb2032f952395823664f82726a2da0e2c05Jon Ashburn printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); 1065c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdepthClamp = %u\n", features->depthClamp ); 1066825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); 10674291d8822ec2a685ef89ec2b210ff16857e25310Chia-I Wu printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); 1068825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBounds = %u\n", features->depthBounds ); 1069825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\twideLines = %u\n", features->wideLines ); 1070825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlargePoints = %u\n", features->largePoints ); 1071825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); 1072825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); 1073825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); 1074481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); 1075825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); 1076fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tvertexSideEffects = %u\n", features->vertexPipelineStoresAndAtomics ); 1077fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\ttessellationSideEffects = %u\n", features->fragmentStoresAndAtomics ); 1078fd4bfc47a43f0f85b30f61d2f128a714c4bae326Chia-I Wu printf("\tgeometrySideEffects = %u\n", features->shaderTessellationAndGeometryPointSize ); 1079825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); 1080825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); 1081825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); 1082221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); 1083221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); 1084825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); 1085825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); 1086825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); 1087825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); 1088825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); 1089825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); 1090825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); 1091825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt64 = %u\n", features->shaderInt64 ); 1092825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt16 = %u\n", features->shaderInt16 ); 1093825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); 1094d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); 1095825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\talphaToOne = %u\n", features->alphaToOne ); 10967dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tsparseBinding = %u\n", features->sparseBinding ); 1097825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); 1098825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); 1099825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); 1100825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); 1101825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); 1102825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); 1103825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); 1104825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); 1105d507261fef1c6877aeaa636d0b684ecee0854e74Chia-I Wu printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); 1106c1838401aa9dcc84b54ef2d63e25cf5aacb8ebfeKarl Schultz printf("\tinheritedQueries = %u\n", features->inheritedQueries ); 1107a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 1108a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 1109f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDumpSparseProps(const VkPhysicalDeviceSparseProperties *sparse_props) 1110a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 11117dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 11127dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceSparseProperties:\n"); 11137dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t---------------------------------\n"); 11147dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1115f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard2DBlockShape = %u\n", sparse_props->residencyStandard2DBlockShape ); 1116f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparse_props->residencyStandard2DMultisampleBlockShape); 1117f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard3DBlockShape = %u\n", sparse_props->residencyStandard3DBlockShape ); 1118f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyAlignedMipSize = %u\n", sparse_props->residencyAlignedMipSize ); 1119f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyNonResidentStrict = %u\n", sparse_props->residencyNonResidentStrict ); 11207dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski} 11217dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1122f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDumpLimits(const VkPhysicalDeviceLimits *limits) 11237dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski{ 11247dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceLimits:\n"); 11257dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t-----------------------\n"); 11263c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension1D = %u\n", limits->maxImageDimension1D ); 11273c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension2D = %u\n", limits->maxImageDimension2D ); 11283c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension3D = %u\n", limits->maxImageDimension3D ); 11293c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimensionCube = %u\n", limits->maxImageDimensionCube ); 11303c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageArrayLayers = %u\n", limits->maxImageArrayLayers ); 11317e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); 1132481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); 1133481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); 11343c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPushConstantsSize = %u\n", limits->maxPushConstantsSize ); 11353c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxMemoryAllocationCount = %u\n", limits->maxMemoryAllocationCount ); 11363c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSamplerAllocationCount = %u\n", limits->maxSamplerAllocationCount ); 11377dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); 1138a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); 11393c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets ); 11403c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSamplers = %u\n", limits->maxPerStageDescriptorSamplers ); 11413c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorUniformBuffers = %u\n", limits->maxPerStageDescriptorUniformBuffers ); 11423c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageBuffers = %u\n", limits->maxPerStageDescriptorStorageBuffers ); 11433c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSampledImages = %u\n", limits->maxPerStageDescriptorSampledImages ); 11443c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageImages = %u\n", limits->maxPerStageDescriptorStorageImages ); 11453c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorInputAttachments = %u\n", limits->maxPerStageDescriptorInputAttachments ); 11463c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageResources = %u\n", limits->maxPerStageResources ); 11473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSamplers = %u\n", limits->maxDescriptorSetSamplers ); 11483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffers = %u\n", limits->maxDescriptorSetUniformBuffers ); 11493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffersDynamic = %u\n", limits->maxDescriptorSetUniformBuffersDynamic ); 11503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffers = %u\n", limits->maxDescriptorSetStorageBuffers ); 11513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffersDynamic = %u\n", limits->maxDescriptorSetStorageBuffersDynamic ); 11523c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSampledImages = %u\n", limits->maxDescriptorSetSampledImages ); 11533c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageImages = %u\n", limits->maxDescriptorSetStorageImages ); 11543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetInputAttachments = %u\n", limits->maxDescriptorSetInputAttachments ); 11553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputAttributes = %u\n", limits->maxVertexInputAttributes ); 11563c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputBindings = %u\n", limits->maxVertexInputBindings ); 11577dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); 11587dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); 11593c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexOutputComponents = %u\n", limits->maxVertexOutputComponents ); 11603c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationGenerationLevel = %u\n", limits->maxTessellationGenerationLevel ); 11613c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationPatchSize = %u\n", limits->maxTessellationPatchSize ); 11623c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexInputComponents = %u\n", limits->maxTessellationControlPerVertexInputComponents ); 11633c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexOutputComponents = %u\n", limits->maxTessellationControlPerVertexOutputComponents); 11643c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerPatchOutputComponents = %u\n", limits->maxTessellationControlPerPatchOutputComponents ); 11653c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlTotalOutputComponents = %u\n", limits->maxTessellationControlTotalOutputComponents ); 11663c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationInputComponents = %u\n", limits->maxTessellationEvaluationInputComponents ); 11673c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationOutputComponents = %u\n", limits->maxTessellationEvaluationOutputComponents ); 11683c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryShaderInvocations = %u\n", limits->maxGeometryShaderInvocations ); 11693c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryInputComponents = %u\n", limits->maxGeometryInputComponents ); 11703c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputComponents = %u\n", limits->maxGeometryOutputComponents ); 11713c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputVertices = %u\n", limits->maxGeometryOutputVertices ); 11723c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryTotalOutputComponents = %u\n", limits->maxGeometryTotalOutputComponents ); 11733c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentInputComponents = %u\n", limits->maxFragmentInputComponents ); 11743c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentOutputAttachments = %u\n", limits->maxFragmentOutputAttachments ); 11753c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentDualSrcAttachments = %u\n", limits->maxFragmentDualSrcAttachments ); 11763c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentCombinedOutputResources = %u\n", limits->maxFragmentCombinedOutputResources ); 11777dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); 11783c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[0] = %u\n", limits->maxComputeWorkGroupCount[0] ); 11793c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[1] = %u\n", limits->maxComputeWorkGroupCount[1] ); 11803c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[2] = %u\n", limits->maxComputeWorkGroupCount[2] ); 11813c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations ); 11823c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[0] = %u\n", limits->maxComputeWorkGroupSize[0] ); 11833c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[1] = %u\n", limits->maxComputeWorkGroupSize[1] ); 11843c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[2] = %u\n", limits->maxComputeWorkGroupSize[2] ); 11853c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelPrecisionBits = %u\n", limits->subPixelPrecisionBits ); 11863c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubTexelPrecisionBits = %u\n", limits->subTexelPrecisionBits ); 11873c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmipmapPrecisionBits = %u\n", limits->mipmapPrecisionBits ); 11883c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndexedIndexValue = %u\n", limits->maxDrawIndexedIndexValue ); 11893c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndirectCount = %u\n", limits->maxDrawIndirectCount ); 11907dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); 11917dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); 11923c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewports = %u\n", limits->maxViewports ); 11933c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[0] = %u\n", limits->maxViewportDimensions[0] ); 11943c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[1] = %u\n", limits->maxViewportDimensions[1] ); 11958a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tviewportBoundsRange[0] =%13f\n", limits->viewportBoundsRange[0] ); 11968a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tviewportBoundsRange[1] =%13f\n", limits->viewportBoundsRange[1] ); 11973c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tviewportSubPixelBits = %u\n", limits->viewportSubPixelBits ); 11983ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); 11993ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); 12003ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); 12013ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); 12028a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminTexelOffset =%3d\n", limits->minTexelOffset ); 12038a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxTexelOffset =%3d\n", limits->maxTexelOffset ); 12048a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminTexelGatherOffset =%3d\n", limits->minTexelGatherOffset ); 12058a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxTexelGatherOffset =%3d\n", limits->maxTexelGatherOffset ); 12068a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminInterpolationOffset =%9f\n", limits->minInterpolationOffset ); 12078a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxInterpolationOffset =%9f\n", limits->maxInterpolationOffset ); 12083c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelInterpolationOffsetBits = %u\n", limits->subPixelInterpolationOffsetBits ); 12093c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferWidth = %u\n", limits->maxFramebufferWidth ); 12103c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferHeight = %u\n", limits->maxFramebufferHeight ); 12113c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferLayers = %u\n", limits->maxFramebufferLayers ); 12123c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferColorSampleCounts = %u\n", limits->framebufferColorSampleCounts ); 12133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferDepthSampleCounts = %u\n", limits->framebufferDepthSampleCounts ); 12143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferStencilSampleCounts = %u\n", limits->framebufferStencilSampleCounts ); 12153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferNoAttachmentsSampleCounts = %u\n", limits->framebufferNoAttachmentsSampleCounts ); 12163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxColorAttachments = %u\n", limits->maxColorAttachments ); 12173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageColorSampleCounts = %u\n", limits->sampledImageColorSampleCounts ); 12183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageDepthSampleCounts = %u\n", limits->sampledImageDepthSampleCounts ); 12193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageStencilSampleCounts = %u\n", limits->sampledImageStencilSampleCounts ); 12203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageIntegerSampleCounts = %u\n", limits->sampledImageIntegerSampleCounts ); 12213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tstorageImageSampleCounts = %u\n", limits->storageImageSampleCounts ); 12223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSampleMaskWords = %u\n", limits->maxSampleMaskWords ); 1223fef7f0877d971c6e3467591da1128c8909fa2cedJon Ashburn printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); 12243c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\ttimestampPeriod = %f\n", limits->timestampPeriod ); 12253c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxClipDistances = %u\n", limits->maxClipDistances ); 12263c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCullDistances = %u\n", limits->maxCullDistances ); 12273c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCombinedClipAndCullDistances = %u\n", limits->maxCombinedClipAndCullDistances ); 12283c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tdiscreteQueuePriorities = %u\n", limits->discreteQueuePriorities ); 12297dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); 12307dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); 12317dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); 12327dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] ); 12337dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity ); 12347dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity ); 12353c332106cb0750f6a5a34f58a2e0735635ee7e97Chia-I Wu printf("\t\tstrictLines = %u\n", limits->strictLines ); 1236a3939fcc66a34d14b3a473441b27d7e341515004Chia-I Wu printf("\t\tstandardSampleLocations = %u\n", limits->standardSampleLocations ); 1237ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyOffsetAlignment ); 1238ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyRowPitchAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyRowPitchAlignment ); 1239ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\tnonCoherentAtomSize = 0x%" PRIxLEAST64 "\n", limits->nonCoherentAtomSize ); 1240d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1241d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1242f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpProps(const struct AppGpu *gpu) 124318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 124418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkPhysicalDeviceProperties *props = &gpu->props; 12453c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t apiVersion=props->apiVersion; 12463c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t major = VK_VERSION_MAJOR(apiVersion); 12473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t minor = VK_VERSION_MINOR(apiVersion); 12483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t patch = VK_VERSION_PATCH(apiVersion); 124918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1250825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceProperties:\n"); 1251825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===========================\n"); 12523c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); 12533c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n",props->driverVersion, props->driverVersion); 12543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tvendorID = 0x%04x\n", props->vendorID); 12553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceID = 0x%04x\n", props->deviceID); 1256f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props->deviceType)); 12573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceName = %s\n", props->deviceName); 12587dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1259f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpLimits(&gpu->props.limits); 1260f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpSparseProps(&gpu->props.sparseProperties); 12617dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 126218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 126318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 1264481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format on 126518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1266bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppDumpExtensions(const char *indent, const char *layer_name, const uint32_t extension_count, 1267bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski const VkExtensionProperties *extension_properties) { 12683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 126918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (layer_name && (strlen(layer_name) > 0)) { 127018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s%s Extensions", indent, layer_name); 127118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } else { 1272cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("%sExtensions", indent); 12733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 127418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tcount = %d\n", extension_count); 1275481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (i = 0; i < extension_count; i++) { 127618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties const *ext_prop = &extension_properties[i]; 12773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 127818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s\t", indent); 1279bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("%-36s: extension revision %2d\n", ext_prop->extensionName, ext_prop->specVersion); 1280ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 128118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1282ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 1283ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 1284bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WIN32_KHR) 12859652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay// Returns true if the named extension is in the list of extensions. 1286bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic bool HasExtension(const char *extension_name, const uint32_t extension_count, 1287bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski const VkExtensionProperties *extension_properties) { 12889652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay for (uint32_t i = 0; i < extension_count; i++) { 1289cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!strcmp(extension_name, extension_properties[i].extensionName)) return true; 12909652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 12919652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay return false; 12929652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay} 1293fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 12949652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay 1295f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id) { 1296ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop const VkQueueFamilyProperties *props = &gpu->queue_props[id]; 1297190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1298825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkQueueFamilyProperties[%d]:\n", id); 1299a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("===========================\n"); 1300cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski char *sep = ""; // separator character 1301a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\tqueueFlags = "); 13027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { 13037fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("GRAPHICS"); 13047fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13067fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { 13077fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sCOMPUTE", sep); 13087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { 13117fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sTRANSFER", sep); 13127fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 13137fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 13147fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { 13157fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sSPARSE", sep); 13167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 1317a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\n"); 1318a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tqueueCount = %u\n", props->queueCount); 1320481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\ttimestampValidBits = %u\n", props->timestampValidBits); 1321bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props->minImageTransferGranularity.width, 1322bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); 132318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1324d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1325d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1326bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// This prints a number of bytes in a human-readable format according to prefixes of the International System of Quantities (ISQ), 1327bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// defined in ISO/IEC 80000. The prefixes used here are not SI prefixes, but rather the binary prefixes based on powers of 1024 1328bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// (kibi-, mebi-, gibi- etc.). 1329bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define kBufferSize 32 1330bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1331bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markusstatic char *HumanReadable(const size_t sz) { 1332bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus const char prefixes[] = "KMGTPEZY"; 1333bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char buf[kBufferSize]; 1334bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus int which = -1; 1335bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus double result = (double)sz; 1336bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus while (result > 1024 && which < 7) { 1337bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus result /= 1024; 1338bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus ++which; 1339bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus } 1340bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1341bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char unit[] = "\0i"; 1342bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus if (which >= 0) { 1343bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus unit[0] = prefixes[which]; 1344bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus } 1345bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus snprintf(buf, kBufferSize, "%.2f %sB", result, unit); 1346bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus return strndup(buf, kBufferSize); 1347bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus} 1348bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1349f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpMemoryProps(const struct AppGpu *gpu) { 13508205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 1351d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1352825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceMemoryProperties:\n"); 1353825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=================================\n"); 1354825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 1355723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 1356d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\tmemoryTypes[%u] :\n", i); 1357723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 1358bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); 13597fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 13607fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // Print each named flag, if it is set. 13617fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkFlags flags = props->memoryTypes[i].propertyFlags; 1362cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define PRINT_FLAG(FLAG) \ 1363cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (flags & FLAG) printf("\t\t\t" #FLAG "\n"); 13643c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) 13653c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) 13663c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) 13673c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_CACHED_BIT) 13683c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) 13697fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#undef PRINT_FLAG 1370723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 13713c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\n"); 1372481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 1373723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 1374d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\tmemoryHeaps[%u] :\n", i); 13753c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const VkDeviceSize memSize = props->memoryHeaps[i].size; 1376bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char *mem_size_human_readable = HumanReadable((const size_t)memSize); 1377bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER " (0x%" PRIxLEAST64 ") (%s)\n", (size_t)memSize, memSize, 1378bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus mem_size_human_readable); 1379bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus free(mem_size_human_readable); 13803c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 1381f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkMemoryHeapFlags heap_flags = props->memoryHeaps[i].flags; 1382d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\t\tflags:\n\t\t\t"); 1383bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf((heap_flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" : "None\n"); 1384723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 138518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1386d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1387d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1388f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDump(const struct AppGpu *gpu) { 1389e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 1390190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1391cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\nDevice Properties and Extensions :\n"); 13929652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("==================================\n"); 1393190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 1394f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpProps(gpu); 1395190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1396bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("", "Device", gpu->device_extension_count, gpu->device_extensions); 139718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); 1398190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 1399f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpQueueProps(gpu, i); 1400190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1401190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1402f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpMemoryProps(gpu); 1403190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1404f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpFeatures(gpu); 1405a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 1406f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDump(&gpu->dev); 1407d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1408d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1409a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1410a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Enlarges the console window to have a large scrollback size. 1411a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic void ConsoleEnlarge() { 1412f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE); 1413a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1414a3b7170656404199592bb65040621772f299a7f3Hugo Landau // make the console window bigger 1415a3b7170656404199592bb65040621772f299a7f3Hugo Landau CONSOLE_SCREEN_BUFFER_INFO csbi; 1416f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg COORD buffer_size; 1417f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg if (GetConsoleScreenBufferInfo(console_handle, &csbi)) { 1418f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg buffer_size.X = csbi.dwSize.X + 30; 1419f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg buffer_size.Y = 20000; 1420f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg SetConsoleScreenBufferSize(console_handle, buffer_size); 1421a3b7170656404199592bb65040621772f299a7f3Hugo Landau } 1422a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1423a3b7170656404199592bb65040621772f299a7f3Hugo Landau SMALL_RECT r; 1424a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Left = r.Top = 0; 1425a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Right = csbi.dwSize.X - 1 + 30; 1426a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Bottom = 50; 1427f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg SetConsoleWindowInfo(console_handle, true, &r); 1428a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1429a3b7170656404199592bb65040621772f299a7f3Hugo Landau // change the console window title 1430a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleTitle(TEXT(APP_SHORT_NAME)); 1431a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1432a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1433a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1434481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint main(int argc, char **argv) { 14359784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t vulkan_major, vulkan_minor, vulkan_patch; 1436242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz struct AppGpu *gpus; 1437242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz VkPhysicalDevice *objs; 14389784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t gpu_count; 1439382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 1440f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppInstance inst; 1441190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1442a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1443cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) ConsoleEnlarge(); 1444a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1445a3b7170656404199592bb65040621772f299a7f3Hugo Landau 14469784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_major = VK_VERSION_MAJOR(VK_API_VERSION_1_0); 14479784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_minor = VK_VERSION_MINOR(VK_API_VERSION_1_0); 14489784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_patch = VK_VERSION_PATCH(VK_HEADER_VERSION); 14493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 14507b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo printf("===========\n"); 1451481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("VULKAN INFO\n"); 1452b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo printf("===========\n\n"); 14539784e78683f658f304062235ceb2dd2c2652c357Karl Schultz printf("Vulkan API Version: %d.%d.%d\n\n", vulkan_major, vulkan_minor, vulkan_patch); 1454b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo 1455f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateInstance(&inst); 145618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1457cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\nInstance Extensions:\n"); 14589652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("====================\n"); 1459bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("", "Instance", inst.global_extension_count, inst.global_extensions); 1460825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1461cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 1462cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 1463242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz objs = malloc(sizeof(objs[0]) * gpu_count); 1464cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!objs) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 1465cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 1466cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 1467cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 1468242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz gpus = malloc(sizeof(gpus[0]) * gpu_count); 1469cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpus) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 14709784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1471f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuInit(&gpus[i], i, objs[i]); 1472cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n\n"); 1473cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1474cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 1475cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay //---Layer-Device-Extensions--- 1476cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("Layers: count = %d\n", inst.global_layer_count); 1477cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("=======\n"); 147818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst.global_layer_count; i++) { 14799784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t layer_major, layer_minor, layer_patch; 148018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 1481bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski VkLayerProperties const *layer_prop = &inst.global_layers[i].layer_properties; 148218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 14839784e78683f658f304062235ceb2dd2c2652c357Karl Schultz ExtractVersion(layer_prop->specVersion, &layer_major, &layer_minor, &layer_patch); 14849784e78683f658f304062235ceb2dd2c2652c357Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", layer_major, layer_minor, layer_patch); 1485bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski snprintf(layer_version, sizeof(layer_version), "%d", layer_prop->implementationVersion); 1486bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("%s (%s) Vulkan version %s, layer version %s\n", layer_prop->layerName, (char *)layer_prop->description, 1487481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz spec_version, layer_version); 148818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1489bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("\t", "Layer", inst.global_layers[i].extension_count, inst.global_layers[i].extension_properties); 1490190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1491f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg char *layer_name = inst.global_layers[i].layer_properties.layerName; 14929652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("\tDevices \tcount = %d\n", gpu_count); 1493cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay for (uint32_t j = 0; j < gpu_count; j++) { 1494cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\t\tGPU id : %u (%s)\n", j, gpus[j].props.deviceName); 14959652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay uint32_t count = 0; 14969652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay VkExtensionProperties *props; 1497bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetPhysicalDeviceLayerExtensions(&gpus[j], layer_name, &count, &props); 1498f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpExtensions("\t\t", "Layer-Device", count, props); 1499cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay free(props); 1500cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1501cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n"); 1502190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1503cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay fflush(stdout); 1504cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay //----------------------------- 1505190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 15067b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("Presentable Surfaces:\n"); 15077b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("=====================\n"); 15087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.width = 256; 15097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.height = 256; 1510f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg int format_count = 0; 1511f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg int present_mode_count = 0; 1512a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1513b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) 1514b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour if (getenv("DISPLAY") == NULL) { 1515b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour printf("'DISPLAY' environment variable not set... Exiting!\n"); 1516b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour fflush(stdout); 1517b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour exit(1); 1518b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour } 1519b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#endif 15207fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--WIN32-- 1521a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 1522bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski if (HasExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, inst.global_extension_count, inst.global_extensions)) { 1523f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateWin32Window(&inst); 15249784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1525f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateWin32Surface(&inst); 15269652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 15279652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 1528f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1529f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 1530f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 15319652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1532f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyWin32Window(&inst); 1533a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 15347fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XCB-- 1535b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 1536bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski if (HasExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME, inst.global_extension_count, inst.global_extensions)) { 1537f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXcbWindow(&inst); 15389784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1539f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXcbSurface(&inst); 15409652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 15419652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_XCB_SURFACE_EXTENSION_NAME); 1542f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1543f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 1544f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 15459652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1546f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyXcbWindow(&inst); 1547a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 15487fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XLIB-- 1549b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 1550bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski if (HasExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, inst.global_extension_count, inst.global_extensions)) { 1551f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXlibWindow(&inst); 15529784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1553f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXlibSurface(&inst); 15549652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 15559652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_XLIB_SURFACE_EXTENSION_NAME); 1556f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1557f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 1558f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 15599652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1560f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyXlibWindow(&inst); 1561a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1562a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 15637fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // TODO: Android / Wayland / MIR 1564cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!format_count && !present_mode_count) printf("None found\n"); 1565a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //--------- 1566a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 15679784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1568f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDump(&gpus[i]); 1569cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n\n"); 1570cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1571cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 15729784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) AppGpuDestroy(&gpus[i]); 1573242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz free(gpus); 1574242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz free(objs); 1575190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1576f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyInstance(&inst); 15770b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 1578ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 1579a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1580cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) Sleep(INFINITE); 1581ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 1582a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1583a3b7170656404199592bb65040621772f299a7f3Hugo Landau return 0; 1584a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1585