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