vulkaninfo.c revision 73a21d311a3e905b8874b08ca6a54a2a5931b240
146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu/* 29cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter * Vulkan 346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Copyright (C) 2014 LunarG, Inc. 546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * copy of this software and associated documentation files (the "Software"), 846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * to deal in the Software without restriction, including without limitation 946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * The above copyright notice and this permission notice shall be included 1446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * in all copies or substantial portions of the Software. 1546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * DEALINGS IN THE SOFTWARE. 2346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu */ 24d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdlib.h> 25d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdio.h> 26d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <stdbool.h> 27d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#include <string.h> 2846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h> 29d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 30ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 31ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#include <Windows.h> 3218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h> 3318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h> 34ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 35ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott 369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include <vulkan.h> 3746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 3846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ERR(err) printf("%s:%d: failed with %s\n", \ 399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter __FILE__, __LINE__, vk_result_string(err)); 4046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32 4218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 437c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf 447c83aa210365e148877f0f3698292a1b509018ffIan Elliott 4518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool consoleCreated = false; 4618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 4718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define WAIT_FOR_CONSOLE_DESTROY \ 4818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo do { \ 4918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (consoleCreated) \ 5018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); \ 5118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 5218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 5318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo #define WAIT_FOR_CONSOLE_DESTROY 5418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 5518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define ERR_EXIT(err) \ 5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo do { \ 5918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo ERR(err); \ 6018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo fflush(stdout); \ 6118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo WAIT_FOR_CONSOLE_DESTROY; \ 6218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo exit(-1); \ 6318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 6446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 6522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 6622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 6722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 6822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 6922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 7022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 7146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 7246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8 7446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 764e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 7746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu; 7946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev { 8146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_gpu *gpu; /* point back to the GPU */ 8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 83382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 8446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 86ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter VkFormatProperties format_props[VK_FORMAT_NUM]; 8746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 8846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstruct layer_extension_list { 9018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties layer_properties; 9118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t extension_count; 9218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_properties; 9318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}; 9418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance { 963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstance instance; 9718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t global_layer_count; 9818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *global_layers; 993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 1003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *global_extensions; 1013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 1023c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 10346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu { 104e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 1058205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 10646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1078205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 10846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 109e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 1108205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceQueueProperties *queue_props; 111ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 11246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1138205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 114a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 115a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceLimits limits; 11646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 11718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t device_layer_count; 11818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers; 11918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1203c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 1213c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 12246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 12346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_dev dev; 12446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 12546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 126382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_result_string(VkResult err) 12746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 12846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 12946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define STR(r) case r: return #r 1309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_SUCCESS); 1319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_UNSUPPORTED); 1329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_NOT_READY); 1339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_TIMEOUT); 1349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_EVENT_SET); 1359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_EVENT_RESET); 1369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNKNOWN); 1379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNAVAILABLE); 1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INITIALIZATION_FAILED); 1398205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VK_ERROR_OUT_OF_HOST_MEMORY); 1408205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 1419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_DEVICE_ALREADY_CREATED); 1429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_DEVICE_LOST); 1439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_POINTER); 1449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_VALUE); 1459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_HANDLE); 1469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_ORDINAL); 1479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_MEMORY_SIZE); 1489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_EXTENSION); 1499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_FLAGS); 1509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_ALIGNMENT); 1519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_FORMAT); 1529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_IMAGE); 1539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_DESCRIPTOR_SET_DATA); 1549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_QUEUE_TYPE); 1559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION); 1569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BAD_SHADER_CODE); 1579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BAD_PIPELINE_DATA); 1589cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_NOT_MAPPABLE); 1599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_MAP_FAILED); 1609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_UNMAP_FAILED); 1619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_DEVICE); 1629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_DRIVER); 1639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPLETE_COMMAND_BUFFER); 1649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BUILDING_COMMAND_BUFFER); 1659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_NOT_BOUND); 1669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_QUEUE); 16746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 16846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu default: return "UNKNOWN_RESULT"; 16946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 17046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 171d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1728205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type) 173d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 174190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 1758205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_PHYSICAL_DEVICE_TYPE_ ##r: return #r 176190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu STR(OTHER); 1778205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(INTEGRATED_GPU); 1788205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(DISCRETE_GPU); 1798205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VIRTUAL_GPU); 180d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 1818205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour default: return "UNKNOWN_DEVICE"; 182190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 183d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 184d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 185382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_format_string(VkFormat fmt) 186d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 1888205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_FORMAT_ ##r: return #r 189190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu STR(UNDEFINED); 1902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4_UNORM); 1912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4_USCALED); 1922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4B4A4_UNORM); 1932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4B4A4_USCALED); 1942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G6B5_UNORM); 1952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G6B5_USCALED); 1962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G5B5A1_UNORM); 1972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G5B5A1_USCALED); 1982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_UNORM); 1992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SNORM); 2002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_USCALED); 2012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SSCALED); 2022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_UINT); 2032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SINT); 2042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SRGB); 2052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_UNORM); 2062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SNORM); 2072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_USCALED); 2082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SSCALED); 2092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_UINT); 2102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SINT); 2112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SRGB); 2122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_UNORM); 2132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SNORM); 2142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_USCALED); 2152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SSCALED); 2162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_UINT); 2172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SINT); 2182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SRGB); 2192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_UNORM); 2202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SNORM); 2212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_USCALED); 2222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SSCALED); 2232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_UINT); 2242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SINT); 2252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SRGB); 2262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_UNORM); 2272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SNORM); 2282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_USCALED); 2292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SSCALED); 2302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_UINT); 2312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SINT); 2322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_UNORM); 2332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SNORM); 2342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_USCALED); 2352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SSCALED); 2362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_UINT); 2372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SINT); 2382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SFLOAT); 2392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_UNORM); 2402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SNORM); 2412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_USCALED); 2422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SSCALED); 2432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_UINT); 2442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SINT); 2452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SFLOAT); 2462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_UNORM); 2472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SNORM); 2482b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_USCALED); 2492b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SSCALED); 2502b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_UINT); 2512b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SINT); 2522b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SFLOAT); 2532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_UNORM); 2542b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SNORM); 2552b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_USCALED); 2562b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SSCALED); 2572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_UINT); 2582b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SINT); 2592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SFLOAT); 2602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_UINT); 2612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_SINT); 2622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_SFLOAT); 2632b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_UINT); 2642b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_SINT); 2652b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_SFLOAT); 2662b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_UINT); 2672b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_SINT); 2682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_SFLOAT); 2692b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_UINT); 2702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_SINT); 2712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_SFLOAT); 2722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64_SFLOAT); 2732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64_SFLOAT); 2742b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64B64_SFLOAT); 2752b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64B64A64_SFLOAT); 2762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R11G11B10_UFLOAT); 2772b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R9G9B9E5_UFLOAT); 2782b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D16_UNORM); 2792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D24_UNORM); 2802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D32_SFLOAT); 2812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(S8_UINT); 2822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D16_UNORM_S8_UINT); 2832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D24_UNORM_S8_UINT); 2842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D32_SFLOAT_S8_UINT); 285fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(BC1_RGB_UNORM); 286fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(BC1_RGB_SRGB); 2872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC2_UNORM); 2882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC2_SRGB); 2892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC3_UNORM); 2902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC3_SRGB); 2912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC4_UNORM); 2922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC4_SNORM); 2932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC5_UNORM); 2942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC5_SNORM); 2952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC6H_UFLOAT); 2962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC6H_SFLOAT); 2972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC7_UNORM); 2982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC7_SRGB); 2992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8_UNORM); 3002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8A1_UNORM); 3012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8A8_UNORM); 3022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11_UNORM); 3032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11_SNORM); 3042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11G11_UNORM); 3052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11G11_SNORM); 3062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_4x4_UNORM); 3072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_4x4_SRGB); 308fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(ASTC_5x4_UNORM); 309fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(ASTC_5x4_SRGB); 3102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_5x5_UNORM); 3112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_5x5_SRGB); 3122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x5_UNORM); 3132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x5_SRGB); 3142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x6_UNORM); 3152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x6_SRGB); 3162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x5_UNORM); 3172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x5_SRGB); 3182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x6_UNORM); 3192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x6_SRGB); 3202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x8_UNORM); 3212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x8_SRGB); 3222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x5_UNORM); 3232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x5_SRGB); 3242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x6_UNORM); 3252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x6_SRGB); 3262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x8_UNORM); 3272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x8_SRGB); 3282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x10_UNORM); 3292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x10_SRGB); 3302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x10_UNORM); 3312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x10_SRGB); 3322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x12_UNORM); 3332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x12_SRGB); 3342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B5G6R5_UNORM); 3352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B5G6R5_USCALED); 3362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_UNORM); 3372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SNORM); 3382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_USCALED); 3392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SSCALED); 3402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_UINT); 3412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SINT); 3422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SRGB); 3432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_UNORM); 3442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SNORM); 3452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_USCALED); 3462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SSCALED); 3472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_UINT); 3482b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SINT); 3492b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SRGB); 3502b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_UNORM); 3512b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SNORM); 3522b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_USCALED); 3532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SSCALED); 3542b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_UINT); 3552b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SINT); 356d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 3572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes default: return "UNKNOWN_FORMAT"; 358190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 359d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 360d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 36146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init_formats(struct app_dev *dev) 36246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 363382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat f; 3642b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 365ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter for (f = 0; f < VK_FORMAT_NUM; f++) { 366382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormat fmt = f; 367382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 3682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 3694da96aafe97eada8c0ab939dd8a8e94760b35649Courtney Goeltzenleuchter err = vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, &dev->format_props[f]); 3702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes if (err) { 3712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes memset(&dev->format_props[f], 0, 3722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes sizeof(dev->format_props[f])); 3732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes } 37446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 37546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 37646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 37718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch) 37818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 37918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *major = version >> 22; 38018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *minor = (version >> 12) & 0x3ff; 38118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *patch = version & 0xfff; 38218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 38318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 38418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_physical_device_layer_extensions( 38518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct app_gpu *gpu, 38618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char *layer_name, 38718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t *extension_count, 38818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties **extension_properties) 38918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 39018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 39118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 39218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 39318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 39418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 39518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 39618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetPhysicalDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, NULL); 39718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 39818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 39918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 40018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 40118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 40218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 40318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetPhysicalDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, ext_ptr); 40418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 40518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 40618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 40718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 40818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 40918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 41018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 41146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) 41246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 413ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 4149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 41546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 41646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .queueRecordCount = 0, 41746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pRequestedQueues = NULL, 41818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .layerCount = 0, 41918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 42046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .extensionCount = 0, 42118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 42280d3b716eb7e4c2d4acab18e620298735672b268Jon Ashburn .flags = 0, 42346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 4243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 4253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Extensions to enable 42618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter static const char *known_extensions[] = { 427fcff0438fe599da9508d50a854e9ec27ad0632d4Jon Ashburn //TODO add WSI device extension WSI swapchain, WSI_LUNARG is a global extension 428793c7295b47eaf2de7408d0953b59c097d9e2bc9David Pinedo "" 4293c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 430426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 43118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t count = 0; 43218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 43318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Scan layers */ 43418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *device_layer_properties = NULL; 43518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *device_layers = NULL; 43618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 43718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 43818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetPhysicalDeviceLayerProperties(gpu->obj, &count, NULL); 43918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 44018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 44118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layer_properties) { 44218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 44318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 44418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layer_properties = malloc(sizeof(VkLayerProperties) * count); 44518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layer_properties); 44618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 44718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (device_layers) { 44818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layers); 44918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 45018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter device_layers = malloc(sizeof(struct layer_extension_list) * count); 45118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(device_layers); 45218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 45318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetPhysicalDeviceLayerProperties(gpu->obj, &count, device_layer_properties); 45418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 4553c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter assert(!err); 4563c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 45718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layer_count = count; 45818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu->device_layers = device_layers; 45918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 46118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *src_info = &device_layer_properties[i]; 46218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *dst_info = &gpu->device_layers[i]; 46318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties)); 46418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 46518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Save away layer extension info for report */ 46618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 46718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu, 46818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter src_info->layerName, 46918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &dst_info->extension_count, 47018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &dst_info->extension_properties); 4713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 47218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(device_layer_properties); 47318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 47418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_physical_device_layer_extensions( 47518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter gpu, 47618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter NULL, 47718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &gpu->device_extension_count, 47818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &gpu->device_extensions); 4793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 4809e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 4819e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 48218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t enabled_extension_count = 0; 48367a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter uint32_t known_extension_count = ARRAY_SIZE(known_extensions); 48418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 48567a07414039ea03404711b0d9204ba35930d1d21Courtney Goeltzenleuchter for (uint32_t i = 0; i < known_extension_count; i++) { 4861f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 extension_found = 0; 48718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t j = 0; j < gpu->device_extension_count; j++) { 48818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_prop = &gpu->device_extensions[j]; 48918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!strcmp(known_extensions[i], ext_prop->extName)) { 49018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 49118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extension_found = 1; 49218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter enabled_extension_count++; 4933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 49518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!extension_found) { 49618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Cannot find extension: %s\n", known_extensions[i]); 49718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ERR_EXIT(VK_ERROR_INVALID_EXTENSION); 49818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 4993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 50046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 50146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 50246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu info.queueRecordCount = gpu->queue_count; 50346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu info.pRequestedQueues = gpu->queue_reqs; 50446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 50518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.layerCount = 0; 50618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledLayerNames = NULL; 50718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.extensionCount = enabled_extension_count; 50818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledExtensionNames = (const char*const*) known_extensions; 5093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 5103c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkCreateDevice(gpu->obj, &info, &dev->obj); 5113c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err) 5123c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 51346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 51446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 51546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 51646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_destroy(struct app_dev *dev) 51746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 5189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter vkDestroyDevice(dev->obj); 51946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 52046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 52118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_get_global_layer_extensions( 52218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char *layer_name, 52318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t *extension_count, 52418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties **extension_properties) 52518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 52618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 52718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 52818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 52918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 53018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 53118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 53218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetGlobalExtensionProperties(layer_name, &ext_count, NULL); 53318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 53418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 53518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 53618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 53718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 53818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 53918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetGlobalExtensionProperties(layer_name, &ext_count, ext_ptr); 54018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 54118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 54218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 54318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 54418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 54518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 54618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 5473c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_create_instance(struct app_instance *inst) 54846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 5493c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 5503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 5513c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 5523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAppName = APP_SHORT_NAME, 5533c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .appVersion = 1, 5543c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 5553c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 5563c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .apiVersion = VK_API_VERSION, 5573c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 5583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstanceCreateInfo inst_info = { 5593c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 5603c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 5613c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAppInfo = &app_info, 5623c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAllocCb = NULL, 56318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .layerCount = 0, 56418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 5653c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .extensionCount = 0, 56618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 5673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 56822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 5693c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Global Extensions to enable 570aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott static char *known_extensions[] = { 57197b4c5d6d4f50d5c4f3c5c4f715462b6a7db94e7Tobin Ehlis "VK_WSI_LunarG", 57246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 573426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 5743c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count = 0; 57518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t count = 0; 57618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 57718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Scan layers */ 57818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *global_layer_properties = NULL; 57918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *global_layers = NULL; 58018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 58118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 58218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetGlobalLayerProperties(&count, NULL); 58318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 58418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 58518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (global_layer_properties) { 58618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layer_properties); 58718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 58818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter global_layer_properties = malloc(sizeof(VkLayerProperties) * count); 58918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(global_layer_properties); 59018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 59118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (global_layers) { 59218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layers); 59318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 59418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter global_layers = malloc(sizeof(struct layer_extension_list) * count); 59518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(global_layers); 5963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 59718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter err = vkGetGlobalLayerProperties(&count, global_layer_properties); 59818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 5993536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis assert(!err); 6003536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis 60118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_layer_count = count; 60218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_layers = global_layers; 60318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 60418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst->global_layer_count; i++) { 60518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties *src_info = &global_layer_properties[i]; 60618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list *dst_info = &inst->global_layers[i]; 60718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties)); 60818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 60918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Save away layer extension info for report */ 61018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_global_layer_extensions( 61118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter src_info->layerName, 61218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &dst_info->extension_count, 61318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &dst_info->extension_properties); 6143c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 61518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(global_layer_properties); 61618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 61718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Collect global extensions */ 61818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst->global_extension_count = 0; 61918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_get_global_layer_extensions( 62018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter NULL, 62118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &inst->global_extension_count, 62218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter &inst->global_extensions); 6233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 6243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) { 6251f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 extension_found = 0; 62618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t j = 0; j < inst->global_extension_count; j++) { 62718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_prop = &inst->global_extensions[j]; 62818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!strcmp(known_extensions[i], extension_prop->extName)) { 62918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 63018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extension_found = 1; 6313c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter global_extension_count++; 6323c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 6333536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis } 63418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (!extension_found) { 63518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Cannot find extension: %s\n", known_extensions[i]); 63618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ERR_EXIT(VK_ERROR_INVALID_EXTENSION); 63718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 63846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 63946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 6403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter inst_info.extensionCount = global_extension_count; 64118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst_info.ppEnabledExtensionNames = (const char * const *) known_extensions; 64246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 6433c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkCreateInstance(&inst_info, &inst->instance); 6443c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 6453c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 6463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 6473c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 6483c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 64946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 6503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 6513c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 6523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_destroy_instance(struct app_instance *inst) 6533c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{ 6543c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 6553c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter vkDestroyInstance(inst->instance); 65646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 65746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 6583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 6598205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, VkPhysicalDevice obj) 66046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 661382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 662aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 66346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 66446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 66546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 66646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 66746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 668426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 669426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 670426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 67146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 67246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 67346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 674426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceQueueCount(gpu->obj, &gpu->queue_count); 675426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 67646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 67746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 67846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_props = 67946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 680426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 68146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_props) 6828205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 683426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceQueueProperties(gpu->obj, gpu->queue_count, gpu->queue_props); 684426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 68546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 68646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 68746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 68846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 68946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_reqs) 6908205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 69146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 692fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes gpu->queue_reqs[i].queueFamilyIndex = i; 69346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 69446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 69546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 696426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 697426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 69846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 69946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 700a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes err = vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 701a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes if (err) 702a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes ERR_EXIT(err); 703a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 704a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes err = vkGetPhysicalDeviceLimits(gpu->obj, &gpu->limits); 705a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes if (err) 706a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes ERR_EXIT(err); 707a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 70846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init(&gpu->dev, gpu); 70946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init_formats(&gpu->dev); 71046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 71146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 71246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_gpu_destroy(struct app_gpu *gpu) 71346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 71446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_destroy(&gpu->dev); 7153c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 71646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_reqs); 71746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 71846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 71946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 720382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) 721d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 722382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 723190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 724190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 725382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 726190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } tilings[2]; 727e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 728190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 729190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (!props->linearTilingFeatures && !props->optimalTilingFeatures) 730190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu return; 731190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 732190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[0].name = "linear"; 733190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[0].flags = props->linearTilingFeatures; 734190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[1].name = "optimal"; 735190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[1].flags = props->optimalTilingFeatures; 736190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 7379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter printf("FORMAT_%s\n", vk_format_string(fmt)); 738190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < ARRAY_SIZE(tilings); i++) { 739190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (!tilings[i].flags) 740190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu continue; 741190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 742190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\t%s tiling image =%s%s%s\n", tilings[i].name, 7438205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? " sampled" : "", 7448205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? " storage" : "", 7458205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? " atomic" : ""); 746ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling texel =%s%s%s\n", tilings[i].name, 7478205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? " TBO" : "", 7488205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? " IBO" : "", 7498205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? " atomic" : ""); 750ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling attachment =%s%s%s\n", tilings[i].name, 7518205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? " color" : "", 7528205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? " blend" : "", 7538205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? " depth/stencil" : ""); 754ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling vertex = %u\n", tilings[i].name, 7558205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (bool) (tilings[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)); 756190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\t%s tiling conversion = %u\n", tilings[i].name, 7578205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (bool) (tilings[i].flags & VK_FORMAT_FEATURE_CONVERSION_BIT)); 758190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 759d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 760d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 761d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 762d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 763d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev) 764d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 765382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 766190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 767ab36aa63b05aaa4432fc0abc9b978601c74c9532Courtney Goeltzenleuchter for (fmt = 0; fmt < VK_FORMAT_NUM; fmt++) { 7682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes app_dev_dump_format_props(dev, fmt); 769190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 770d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 771d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 772009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 773009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 774009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 775009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 776009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 777009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 778a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu) 779a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 780a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 781a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 782a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("VkPhysicalDeviceFeatures\n"); 783a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes /* TODO: add interesting features */ 784a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tgeometryShader = %u\n", features->geometryShader); 785a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 786a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 787a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_limits(const struct app_gpu *gpu) 788a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 789a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceLimits *limits = &gpu->limits; 790a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 791a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("VkPhysicalDeviceLimits\n"); 792a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes /* TODO: add interesting limits */ 793a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxInlineMemoryUpdateSize = " PRINTF_SIZE_T_SPECIFIER "\n", limits->maxInlineMemoryUpdateSize); 794a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets); 795a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations); 796a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\ttimestampFrequency = %lu\n", limits->timestampFrequency); 797d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 798d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 79918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_gpu_dump_props(const struct app_gpu *gpu) 80018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 80118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkPhysicalDeviceProperties *props = &gpu->props; 80218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 80318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("VkPhysicalDeviceProperties\n"); 80418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tapiVersion = %u\n", props->apiVersion); 80518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tdriverVersion = %u\n", props->driverVersion); 80618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tvendorId = 0x%04x\n", props->vendorId); 80718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tdeviceId = 0x%04x\n", props->deviceId); 80818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); 80918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tdeviceName = %s\n", props->deviceName); 81018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 81118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 81218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 81318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstatic void app_dump_extensions( 81418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const char *indent, 81518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const char *layer_name, 81618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const uint32_t extension_count, 81718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkExtensionProperties *extension_properties) 8183c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{ 8193c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 82018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (layer_name && (strlen(layer_name) > 0)) { 82118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s%s Extensions", indent, layer_name); 82218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } else { 82318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Extensions"); 8243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 82518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tcount = %d\n", extension_count); 82618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (i=0; i< extension_count; i++) { 82718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 82873a21d311a3e905b8874b08ca6a54a2a5931b240Courtney Goeltzenleuchter char spec_version[64]; 82918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties const *ext_prop = &extension_properties[i]; 8303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 831ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter if (i>0) 83218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); // separator between extensions 83318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 83418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s\t", indent); 83518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(ext_prop->specVersion, &major, &minor, &patch); 83618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch); 83773a21d311a3e905b8874b08ca6a54a2a5931b240Courtney Goeltzenleuchter printf("%s: extension version %s", 83873a21d311a3e905b8874b08ca6a54a2a5931b240Courtney Goeltzenleuchter ext_prop->extName, spec_version); 839ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 840ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 84118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 842ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 843ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 844e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) 845d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 8468205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceQueueProperties *props = &gpu->queue_props[id]; 847190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 8488205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDeviceQueueProperties[%d]\n", id); 849190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tqueueFlags = %c%c%c%c\n", 8509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', 8519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.', 8529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_DMA_BIT) ? 'D' : '.', 8539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_EXTENDED_BIT) ? 'X' : '.'); 854190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tqueueCount = %u\n", props->queueCount); 855190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tsupportsTimestamps = %u\n", props->supportsTimestamps); 85618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 857d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 858d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 859d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_memory_props(const struct app_gpu *gpu) 860d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 8618205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 862d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 8638205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDeviceMemoryProperties\n"); 864723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 865723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 866723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypes[%u] : \n", i); 867723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags); 868723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 869723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 870723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 871723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 872723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeaps[%u] : \n", i); 873723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", props->memoryHeaps[i].size); 874723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 87518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 876d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 877d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 878d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump(const struct app_gpu *gpu) 879d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 880e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 881190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 882190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 883190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_props(gpu); 884190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 88518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("", "", gpu->device_extension_count, gpu->device_extensions); 88618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); 88718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Layers\tcount = %d\n", gpu->device_layer_count); 88818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->device_layer_count; i++) { 88918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 89018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 89118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct layer_extension_list const *layer_info = &gpu->device_layers[i]; 89218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 89318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_info->layer_properties.specVersion, &major, &minor, &patch); 89418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch); 89518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_info->layer_properties.implVersion, &major, &minor, &patch); 89618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch); 89718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 89818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->layer_properties.layerName, 89918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->layer_properties.description, 90018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter spec_version, layer_version); 90118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 90218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("\t", 90318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->layer_properties.layerName, 90418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_count, 90518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_info->extension_properties); 90618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 90718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 908ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 909190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 910190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_queue_props(gpu, i); 911190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 912190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 913190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_memory_props(gpu); 914190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 915a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_features(gpu); 916a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 917a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_limits(gpu); 918a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 919190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_dev_dump(&gpu->dev); 920d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 921d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 922d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuint main(int argc, char **argv) 923d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 924190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct app_gpu gpus[MAX_GPUS]; 9258205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice objs[MAX_GPUS]; 926e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t gpu_count, i; 927382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 9283c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter struct app_instance inst; 929190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 9303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_create_instance(&inst); 93118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("", "Global", inst.global_extension_count, inst.global_extensions); 93218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 93318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("Global Layers\tcount = %d\n", inst.global_layer_count); 93418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst.global_layer_count; i++) { 93518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t major, minor, patch; 93618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 93718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties const *layer_prop = &inst.global_layers[i].layer_properties; 93818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 93918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_prop->specVersion, &major, &minor, &patch); 94018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, patch); 94118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter extract_version(layer_prop->implVersion, &major, &minor, &patch); 94218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter snprintf(layer_version, sizeof(layer_version), "%d.%d.%d", major, minor, patch); 94318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\t%s (%s) Vulkan version %s, layer version %s\n", 94418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter layer_prop->layerName, layer_prop->description, spec_version, layer_version); 94518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 94618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter app_dump_extensions("\t", 94718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].layer_properties.layerName, 94818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_count, 94918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter inst.global_layers[i].extension_properties); 95018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 95129669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn 9523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 95307b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (err) 95407b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn ERR_EXIT(err); 95507b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (gpu_count > MAX_GPUS) { 95618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo printf("Too many GPUS found \n"); 95718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo ERR_EXIT(VK_ERROR_UNKNOWN); 95807b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn } 9593c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 960190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (err) 961190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu ERR_EXIT(err); 962190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 963190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) { 964190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_init(&gpus[i], i, objs[i]); 965190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump(&gpus[i]); 966190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n\n"); 967190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 968190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 969190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) 970190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_destroy(&gpus[i]); 971190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 9723c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_destroy_instance(&inst); 9730b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 974190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu return 0; 975d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 976ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott 977ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 97818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 97918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Create a console window with a large scrollback size to which to send stdout. 98018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Returns true if console window was successfully created, false otherwise. 98118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool SetStdOutToNewConsole() 98218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo{ 98318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // don't do anything if we already have a console 98418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (GetStdHandle(STD_OUTPUT_HANDLE)) 98518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 98618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 98718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // allocate a console for this app 98818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo AllocConsole(); 98918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 99018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // redirect unbuffered STDOUT to the console 99118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 99218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT); 99318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo FILE *fp = _fdopen( fileDescriptor, "w" ); 99418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo *stdout = *fp; 99518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo setvbuf( stdout, NULL, _IONBF, 0 ); 99618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 99718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // make the console window bigger 99818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo CONSOLE_SCREEN_BUFFER_INFO csbi; 99918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo SMALL_RECT r; 100018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo COORD bufferSize; 100118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi)) 100218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 100318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo bufferSize.X = csbi.dwSize.X; 100418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo bufferSize.Y = 1000; 100518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize)) 100618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 100718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Left = r.Top = 0; 100818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Right = csbi.dwSize.X-1; 100918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Bottom = 60; 101018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!SetConsoleWindowInfo(consoleHandle, true, &r)) 101118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 101218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 101318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // change the console window title 10144e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott if (!SetConsoleTitle(TEXT(APP_SHORT_NAME))) 101518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 101618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 101718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return true; 101818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo} 101918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 1020ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliottint WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) 1021ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott{ 1022ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott char *argv = pCmdLine; 102318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo consoleCreated = SetStdOutToNewConsole(); 1024ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott main(1, &argv); 1025ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 102618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (consoleCreated) 102718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); 1028ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott} 1029ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 1030