vulkaninfo.c revision a048b3146ed9bc094adf4d6ba7355cd8a5ef7008
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 4318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool consoleCreated = false; 4418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 4518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define WAIT_FOR_CONSOLE_DESTROY \ 4618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo do { \ 4718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (consoleCreated) \ 4818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); \ 4918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 5018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 5118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo #define WAIT_FOR_CONSOLE_DESTROY 5218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 5318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 5418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 5518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#define ERR_EXIT(err) \ 5618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo do { \ 5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo ERR(err); \ 5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo fflush(stdout); \ 5918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo WAIT_FOR_CONSOLE_DESTROY; \ 6018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo exit(-1); \ 6118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 6246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 6322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 6422a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 6522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 6622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 6722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 6822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 6946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 7046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_GPUS 8 7246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 744e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 7546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu; 7746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 7846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_dev { 7946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_gpu *gpu; /* point back to the GPU */ 8046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 81382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 8246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 848205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkFormatProperties format_props[VK_NUM_FORMAT]; 8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 8646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstruct app_instance { 883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstance instance; 893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *global_extensions; 913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustruct app_gpu { 94e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 958205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 9646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 978205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 988205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevicePerformance perf; 9946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 100e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 1018205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceQueueProperties *queue_props; 102ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 10346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1048205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 105a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 106a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceLimits limits; 10746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1083c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 1093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 11046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 11146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu struct app_dev dev; 11246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 11346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 114382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_result_string(VkResult err) 11546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 11646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 11746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define STR(r) case r: return #r 1189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_SUCCESS); 1199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_UNSUPPORTED); 1209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_NOT_READY); 1219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_TIMEOUT); 1229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_EVENT_SET); 1239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_EVENT_RESET); 1249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNKNOWN); 1259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNAVAILABLE); 1269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INITIALIZATION_FAILED); 1278205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VK_ERROR_OUT_OF_HOST_MEMORY); 1288205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 1299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_DEVICE_ALREADY_CREATED); 1309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_DEVICE_LOST); 1319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_POINTER); 1329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_VALUE); 1339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_HANDLE); 1349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_ORDINAL); 1359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_MEMORY_SIZE); 1369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_EXTENSION); 1379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_FLAGS); 1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_ALIGNMENT); 1399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_FORMAT); 1409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_IMAGE); 1419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_DESCRIPTOR_SET_DATA); 1429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_QUEUE_TYPE); 1439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INVALID_OBJECT_TYPE); 1449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION); 1459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BAD_SHADER_CODE); 1469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BAD_PIPELINE_DATA); 1479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_NOT_MAPPABLE); 1489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_MAP_FAILED); 1499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_UNMAP_FAILED); 1509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_DEVICE); 1519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_DRIVER); 1529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPLETE_COMMAND_BUFFER); 1539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_BUILDING_COMMAND_BUFFER); 1549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_MEMORY_NOT_BOUND); 1559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter STR(VK_ERROR_INCOMPATIBLE_QUEUE); 15646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 15746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu default: return "UNKNOWN_RESULT"; 15846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 15946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 160d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1618205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic const char *vk_physical_device_type_string(VkPhysicalDeviceType type) 162d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 163190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 1648205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_PHYSICAL_DEVICE_TYPE_ ##r: return #r 165190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu STR(OTHER); 1668205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(INTEGRATED_GPU); 1678205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(DISCRETE_GPU); 1688205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour STR(VIRTUAL_GPU); 169d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 1708205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour default: return "UNKNOWN_DEVICE"; 171190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 172d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 173d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 174382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic const char *vk_format_string(VkFormat fmt) 175d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 1778205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour#define STR(r) case VK_FORMAT_ ##r: return #r 178190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu STR(UNDEFINED); 1792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4_UNORM); 1802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4_USCALED); 1812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4B4A4_UNORM); 1822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R4G4B4A4_USCALED); 1832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G6B5_UNORM); 1842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G6B5_USCALED); 1852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G5B5A1_UNORM); 1862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R5G5B5A1_USCALED); 1872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_UNORM); 1882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SNORM); 1892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_USCALED); 1902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SSCALED); 1912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_UINT); 1922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SINT); 1932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8_SRGB); 1942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_UNORM); 1952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SNORM); 1962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_USCALED); 1972b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SSCALED); 1982b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_UINT); 1992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SINT); 2002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8_SRGB); 2012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_UNORM); 2022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SNORM); 2032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_USCALED); 2042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SSCALED); 2052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_UINT); 2062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SINT); 2072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8_SRGB); 2082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_UNORM); 2092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SNORM); 2102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_USCALED); 2112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SSCALED); 2122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_UINT); 2132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SINT); 2142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R8G8B8A8_SRGB); 2152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_UNORM); 2162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SNORM); 2172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_USCALED); 2182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SSCALED); 2192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_UINT); 2202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R10G10B10A2_SINT); 2212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_UNORM); 2222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SNORM); 2232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_USCALED); 2242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SSCALED); 2252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_UINT); 2262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SINT); 2272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16_SFLOAT); 2282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_UNORM); 2292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SNORM); 2302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_USCALED); 2312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SSCALED); 2322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_UINT); 2332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SINT); 2342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16_SFLOAT); 2352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_UNORM); 2362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SNORM); 2372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_USCALED); 2382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SSCALED); 2392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_UINT); 2402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SINT); 2412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16_SFLOAT); 2422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_UNORM); 2432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SNORM); 2442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_USCALED); 2452b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SSCALED); 2462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_UINT); 2472b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SINT); 2482b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R16G16B16A16_SFLOAT); 2492b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_UINT); 2502b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_SINT); 2512b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32_SFLOAT); 2522b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_UINT); 2532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_SINT); 2542b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32_SFLOAT); 2552b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_UINT); 2562b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_SINT); 2572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32_SFLOAT); 2582b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_UINT); 2592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_SINT); 2602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R32G32B32A32_SFLOAT); 2612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64_SFLOAT); 2622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64_SFLOAT); 2632b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64B64_SFLOAT); 2642b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R64G64B64A64_SFLOAT); 2652b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R11G11B10_UFLOAT); 2662b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(R9G9B9E5_UFLOAT); 2672b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D16_UNORM); 2682b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D24_UNORM); 2692b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D32_SFLOAT); 2702b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(S8_UINT); 2712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D16_UNORM_S8_UINT); 2722b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D24_UNORM_S8_UINT); 2732b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(D32_SFLOAT_S8_UINT); 274fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(BC1_RGB_UNORM); 275fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(BC1_RGB_SRGB); 2762b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC2_UNORM); 2772b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC2_SRGB); 2782b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC3_UNORM); 2792b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC3_SRGB); 2802b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC4_UNORM); 2812b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC4_SNORM); 2822b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC5_UNORM); 2832b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC5_SNORM); 2842b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC6H_UFLOAT); 2852b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC6H_SFLOAT); 2862b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC7_UNORM); 2872b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(BC7_SRGB); 2882b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8_UNORM); 2892b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8A1_UNORM); 2902b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ETC2_R8G8B8A8_UNORM); 2912b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11_UNORM); 2922b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11_SNORM); 2932b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11G11_UNORM); 2942b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(EAC_R11G11_SNORM); 2952b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_4x4_UNORM); 2962b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_4x4_SRGB); 297fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(ASTC_5x4_UNORM); 298fe8a2e1259447466b5821fc9e067ebd735241f62Courtney Goeltzenleuchter STR(ASTC_5x4_SRGB); 2992b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_5x5_UNORM); 3002b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_5x5_SRGB); 3012b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x5_UNORM); 3022b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x5_SRGB); 3032b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x6_UNORM); 3042b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_6x6_SRGB); 3052b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x5_UNORM); 3062b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x5_SRGB); 3072b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x6_UNORM); 3082b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x6_SRGB); 3092b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x8_UNORM); 3102b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_8x8_SRGB); 3112b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x5_UNORM); 3122b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x5_SRGB); 3132b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x6_UNORM); 3142b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x6_SRGB); 3152b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x8_UNORM); 3162b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x8_SRGB); 3172b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x10_UNORM); 3182b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_10x10_SRGB); 3192b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x10_UNORM); 3202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x10_SRGB); 3212b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x12_UNORM); 3222b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(ASTC_12x12_SRGB); 3232b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B5G6R5_UNORM); 3242b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B5G6R5_USCALED); 3252b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_UNORM); 3262b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SNORM); 3272b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_USCALED); 3282b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SSCALED); 3292b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_UINT); 3302b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SINT); 3312b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8_SRGB); 3322b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_UNORM); 3332b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SNORM); 3342b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_USCALED); 3352b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SSCALED); 3362b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_UINT); 3372b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SINT); 3382b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B8G8R8A8_SRGB); 3392b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_UNORM); 3402b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SNORM); 3412b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_USCALED); 3422b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SSCALED); 3432b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_UINT); 3442b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes STR(B10G10R10A2_SINT); 345d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 3462b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes default: return "UNKNOWN_FORMAT"; 347190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 348d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 349d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 35046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init_formats(struct app_dev *dev) 35146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 352382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat f; 3532b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 3548205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour for (f = 0; f < VK_NUM_FORMAT; f++) { 355382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormat fmt = f; 356382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 3572b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 358d757630a88456aa57e5699f42d96896f17d2f624Chris Forbes err = vkGetPhysicalDeviceFormatInfo(dev->gpu->obj, fmt, &dev->format_props[f]); 3592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes if (err) { 3602b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes memset(&dev->format_props[f], 0, 3612b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes sizeof(dev->format_props[f])); 3622b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes } 36346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 36446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 36546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 36646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) 36746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 368ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 3699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 37046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 37146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .queueRecordCount = 0, 37246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pRequestedQueues = NULL, 37346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .extensionCount = 0, 3741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .pEnabledExtensions = NULL, 37580d3b716eb7e4c2d4acab18e620298735672b268Jon Ashburn .flags = 0, 37646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 3773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 3783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Extensions to enable 3793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *enable_extension_list; 3803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter static char *known_extensions[] = { 381e880e9bfd899c6c747b053cfb09f5d59168221b8Courtney Goeltzenleuchter "VK_WSI_LunarG", 3823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter "Validation", 3833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 384426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 385426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour uint32_t extCount; 386426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceExtensionCount(gpu->obj, &extCount); 3873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter assert(!err); 3883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 3893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter enable_extension_list = malloc(sizeof(VkExtensionProperties) * extCount); 3903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (!enable_extension_list) { 3913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 3923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 3933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 3949e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 3959e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 3963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties extProp; 3973c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter gpu->device_extension_count = 0; 3983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter bool32_t U_ASSERT_ONLY extFound = 0; // TODO : Need to enhance this if/when we enable multiple extensions 3993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) { 4003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t j = 0; j < extCount; j++) { 401426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceExtensionProperties( 402426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour gpu->obj, j, &extProp); 4033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (!strcmp(known_extensions[i], extProp.name)) { 4043c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter extFound = 1; 4053c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter memcpy(&enable_extension_list[gpu->device_extension_count], &extProp, sizeof(extProp)); 4063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter gpu->device_extension_count++; 4079e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter printf("%s: %s\n", extProp.name, extProp.description); 4089e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 4093c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4103c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4113c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4123c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter assert(extFound); 4133c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 4143c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter gpu->device_extensions = enable_extension_list; 41546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 41646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 41746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu info.queueRecordCount = gpu->queue_count; 41846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu info.pRequestedQueues = gpu->queue_reqs; 41946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 420a7e408fed6c19d5113a319b0ec309ad899d5d067Courtney Goeltzenleuchter info.extensionCount = gpu->device_extension_count; 4213c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter info.pEnabledExtensions = enable_extension_list; 4223c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 4233c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkCreateDevice(gpu->obj, &info, &dev->obj); 4243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err) 4253c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 42646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 42746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 42846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 42946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_dev_destroy(struct app_dev *dev) 43046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 4319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter vkDestroyDevice(dev->obj); 43246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 43346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4343c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_create_instance(struct app_instance *inst) 43546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 4363c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 4373c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 4383c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 4393c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAppName = APP_SHORT_NAME, 4403c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .appVersion = 1, 4413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 4423c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 4433c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .apiVersion = VK_API_VERSION, 4443c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 4453c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkInstanceCreateInfo inst_info = { 4463c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 4473c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 4483c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAppInfo = &app_info, 4493c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pAllocCb = NULL, 4503c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .extensionCount = 0, 4513c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEnabledExtensions = NULL, 4523c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 45322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 4543c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter // Global Extensions to enable 455aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott static char *known_extensions[] = { 45697b4c5d6d4f50d5c4f3c5c4f715462b6a7db94e7Tobin Ehlis "VK_WSI_LunarG", 45746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 458426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 4593536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis uint32_t extCount = 0; 4603c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties extProp; 4613c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *enable_extension_list; 4623c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count = 0; 4633c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 464426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetGlobalExtensionCount(&extCount); 4653536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis assert(!err); 4663536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis 4673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter enable_extension_list = malloc(sizeof(VkExtensionProperties) * extCount); 4683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (!enable_extension_list) { 4693c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 4703c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 47222a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour bool32_t U_ASSERT_ONLY extFound = 0; // TODO : Need to enhance this if/when we enable multiple extensions 4733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) { 4743c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (uint32_t j = 0; j < extCount; j++) { 475426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetGlobalExtensionProperties(j, &extProp); 4763c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (!strcmp(known_extensions[i], extProp.name)) { 4773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter extFound = 1; 4783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter memcpy(&enable_extension_list[global_extension_count], &extProp, sizeof(extProp)); 4793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter global_extension_count++; 4803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 4813536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis } 48246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 4833536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis assert(extFound); 48446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter inst_info.extensionCount = global_extension_count; 4863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter inst_info.pEnabledExtensions = enable_extension_list; 48746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 4883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkCreateInstance(&inst_info, &inst->instance); 4893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 4903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 4913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 4923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 4933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 49446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 4953c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 4963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter inst->global_extension_count = global_extension_count; 4973c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter inst->global_extensions = enable_extension_list; 4983c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 4993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 5003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_destroy_instance(struct app_instance *inst) 5013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{ 5023c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 5033c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter vkDestroyInstance(inst->instance); 50446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 50546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 5063c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 5078205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourstatic void app_gpu_init(struct app_gpu *gpu, uint32_t id, VkPhysicalDevice obj) 50846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 509382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 510aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 51146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 51246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 51346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 51446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 51546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 516426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 517426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 518426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 51946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 52046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 521426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDevicePerformance(gpu->obj, &gpu->perf); 522426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 52346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 52446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 52546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 526426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceQueueCount(gpu->obj, &gpu->queue_count); 527426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 52846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 52946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 53046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_props = 53146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 532426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 53346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_props) 5348205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 535426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceQueueProperties(gpu->obj, gpu->queue_count, gpu->queue_props); 536426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 53746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 53846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 53946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 54046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 54146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu if (!gpu->queue_reqs) 5428205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 54346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 54446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs[i].queueNodeIndex = i; 54546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 54646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 54746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 548426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour err = vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 549426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour if (err) 55046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu ERR_EXIT(err); 55146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 552a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes err = vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 553a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes if (err) 554a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes ERR_EXIT(err); 555a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 556a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes err = vkGetPhysicalDeviceLimits(gpu->obj, &gpu->limits); 557a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes if (err) 558a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes ERR_EXIT(err); 559a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 56046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init(&gpu->dev, gpu); 56146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_init_formats(&gpu->dev); 56246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 56346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 56446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wustatic void app_gpu_destroy(struct app_gpu *gpu) 56546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu{ 56646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu app_dev_destroy(&gpu->dev); 5673c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 56846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_reqs); 56946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 57046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 57146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 572382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterstatic void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) 573d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 574382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 575190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 576190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 577382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 578190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } tilings[2]; 579e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 580190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 581190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (!props->linearTilingFeatures && !props->optimalTilingFeatures) 582190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu return; 583190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 584190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[0].name = "linear"; 585190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[0].flags = props->linearTilingFeatures; 586190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[1].name = "optimal"; 587190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu tilings[1].flags = props->optimalTilingFeatures; 588190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 5899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter printf("FORMAT_%s\n", vk_format_string(fmt)); 590190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < ARRAY_SIZE(tilings); i++) { 591190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (!tilings[i].flags) 592190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu continue; 593190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 594190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\t%s tiling image =%s%s%s\n", tilings[i].name, 5958205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? " sampled" : "", 5968205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? " storage" : "", 5978205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? " atomic" : ""); 598ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling texel =%s%s%s\n", tilings[i].name, 5998205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? " TBO" : "", 6008205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? " IBO" : "", 6018205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? " atomic" : ""); 602ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling attachment =%s%s%s\n", tilings[i].name, 6038205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? " color" : "", 6048205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? " blend" : "", 6058205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (tilings[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? " depth/stencil" : ""); 606ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter printf("\t%s tiling vertex = %u\n", tilings[i].name, 6078205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (bool) (tilings[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)); 608190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\t%s tiling conversion = %u\n", tilings[i].name, 6098205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour (bool) (tilings[i].flags & VK_FORMAT_FEATURE_CONVERSION_BIT)); 610190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 611d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 612d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 613d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 614d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 615d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuapp_dev_dump(const struct app_dev *dev) 616d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 617382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 618190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 6198205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour for (fmt = 0; fmt < VK_NUM_FORMAT; fmt++) { 6202b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes app_dev_dump_format_props(dev, fmt); 621190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 622d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 623d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 624009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 625009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 626009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 627009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 628009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 629009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 630d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_props(const struct app_gpu *gpu) 631d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 6328205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceProperties *props = &gpu->props; 633190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 6348205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDeviceProperties\n"); 635190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tapiVersion = %u\n", props->apiVersion); 636190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tdriverVersion = %u\n", props->driverVersion); 637190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tvendorId = 0x%04x\n", props->vendorId); 638190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tdeviceId = 0x%04x\n", props->deviceId); 6398205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); 6408205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("\tdeviceName = %s\n", props->deviceName); 641a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 642a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 643a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_features(const struct app_gpu *gpu) 644a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 645a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 646a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 647a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("VkPhysicalDeviceFeatures\n"); 648a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes /* TODO: add interesting features */ 649a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tgeometryShader = %u\n", features->geometryShader); 650a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 651a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 652a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbesstatic void app_gpu_dump_limits(const struct app_gpu *gpu) 653a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 654a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceLimits *limits = &gpu->limits; 655a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 656a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("VkPhysicalDeviceLimits\n"); 657a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes /* TODO: add interesting limits */ 658a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxInlineMemoryUpdateSize = " PRINTF_SIZE_T_SPECIFIER "\n", limits->maxInlineMemoryUpdateSize); 659a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets); 660a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations); 661a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\ttimestampFrequency = %lu\n", limits->timestampFrequency); 662d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 663d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 664d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_perf(const struct app_gpu *gpu) 665d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 6668205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDevicePerformance *perf = &gpu->perf; 667190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 6688205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDevicePerformance\n"); 6698205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("\tmaxGpuClock = %f\n", perf->maxDeviceClock); 670190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\taluPerClock = %f\n", perf->aluPerClock); 671190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\ttexPerClock = %f\n", perf->texPerClock); 672190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tprimsPerClock = %f\n", perf->primsPerClock); 673190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tpixelsPerClock = %f\n", perf->pixelsPerClock); 674d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 675d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 6763c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchterstatic void app_gpu_dump_instance_extensions(const struct app_instance *inst) 6773c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter{ 6783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 6793c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Extensions"); 6803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("\tcount = %d\n", inst->global_extension_count); 6813c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("\t"); 6823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (i=0; i< inst->global_extension_count; i++) { 6833c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (i>0) 6843c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf(", "); // separator between extension names 6853c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("%s", inst->global_extensions[i].name); 6863c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 6873c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("\n"); 6883c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 6893c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 690ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchterstatic void app_gpu_dump_extensions(const struct app_gpu *gpu) 691ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter{ 692aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 693ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("Extensions"); 6943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("\tcount = %d\n", gpu->device_extension_count); 695ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\t"); 6963c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter for (i=0; i< gpu->device_extension_count; i++) { 697ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter if (i>0) 698ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf(", "); // separator between extension names 6993c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("%s(%d): %s", gpu->device_extensions[i].name, 7003c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter gpu->device_extensions[i].version, 7013c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter gpu->device_extensions[i].description); 702ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 703ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 704ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 705ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 706e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) 707d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 7088205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceQueueProperties *props = &gpu->queue_props[id]; 709190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 7108205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDeviceQueueProperties[%d]\n", id); 711190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tqueueFlags = %c%c%c%c\n", 7129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', 7139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.', 7149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_DMA_BIT) ? 'D' : '.', 7159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter (props->queueFlags & VK_QUEUE_EXTENDED_BIT) ? 'X' : '.'); 716190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tqueueCount = %u\n", props->queueCount); 717190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\tsupportsTimestamps = %u\n", props->supportsTimestamps); 718d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 719d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 720d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump_memory_props(const struct app_gpu *gpu) 721d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 7228205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 723d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 7248205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour printf("VkPhysicalDeviceMemoryProperties\n"); 725723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 726723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 727723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryTypes[%u] : \n", i); 728723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags); 729723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 730723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 731723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 732723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 733723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\tmemoryHeaps[%u] : \n", i); 734723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", props->memoryHeaps[i].size); 735723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 736d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 737d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 738d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void app_gpu_dump(const struct app_gpu *gpu) 739d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 740e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 741190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 742190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 743190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_props(gpu); 744190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 745ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter app_gpu_dump_extensions(gpu); 746ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter printf("\n"); 747190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_perf(gpu); 748190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 749190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 750190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_queue_props(gpu, i); 751190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 752190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 753190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump_memory_props(gpu); 754190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 755a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_features(gpu); 756a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 757a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes app_gpu_dump_limits(gpu); 758a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 759190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_dev_dump(&gpu->dev); 760d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 761d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 762d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wuint main(int argc, char **argv) 763d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 764190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct app_gpu gpus[MAX_GPUS]; 7658205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice objs[MAX_GPUS]; 766e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t gpu_count, i; 767382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 7683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter struct app_instance inst; 769190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 7703c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_create_instance(&inst); 7713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_gpu_dump_instance_extensions(&inst); 77229669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn 7733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 77407b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (err) 77507b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn ERR_EXIT(err); 77607b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn if (gpu_count > MAX_GPUS) { 77718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo printf("Too many GPUS found \n"); 77818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo ERR_EXIT(VK_ERROR_UNKNOWN); 77907b309a0cdfca1532ad14038682716ea7f77538dJon Ashburn } 7803c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 781190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu if (err) 782190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu ERR_EXIT(err); 783190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 784190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) { 785190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_init(&gpus[i], i, objs[i]); 786190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_dump(&gpus[i]); 787190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n\n"); 788190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 789190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 790190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu_count; i++) 791190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu app_gpu_destroy(&gpus[i]); 792190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 7933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter app_destroy_instance(&inst); 7940b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 795190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu return 0; 796d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 797ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott 798ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 79918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 80018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Create a console window with a large scrollback size to which to send stdout. 80118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo// Returns true if console window was successfully created, false otherwise. 80218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedobool SetStdOutToNewConsole() 80318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo{ 80418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // don't do anything if we already have a console 80518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (GetStdHandle(STD_OUTPUT_HANDLE)) 80618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 80718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 80818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // allocate a console for this app 80918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo AllocConsole(); 81018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 81118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // redirect unbuffered STDOUT to the console 81218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 81318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT); 81418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo FILE *fp = _fdopen( fileDescriptor, "w" ); 81518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo *stdout = *fp; 81618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo setvbuf( stdout, NULL, _IONBF, 0 ); 81718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 81818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // make the console window bigger 81918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo CONSOLE_SCREEN_BUFFER_INFO csbi; 82018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo SMALL_RECT r; 82118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo COORD bufferSize; 82218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi)) 82318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 82418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo bufferSize.X = csbi.dwSize.X; 82518fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo bufferSize.Y = 1000; 82618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize)) 82718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 82818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Left = r.Top = 0; 82918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Right = csbi.dwSize.X-1; 83018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo r.Bottom = 60; 83118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (!SetConsoleWindowInfo(consoleHandle, true, &r)) 83218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 83318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 83418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo // change the console window title 8354e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott if (!SetConsoleTitle(TEXT(APP_SHORT_NAME))) 83618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return false; 83718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 83818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo return true; 83918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo} 84018fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 841ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliottint WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) 842ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott{ 843ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott char *argv = pCmdLine; 84418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo consoleCreated = SetStdOutToNewConsole(); 845ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott main(1, &argv); 846ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 84718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo if (consoleCreated) 84818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo Sleep(INFINITE); 849ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott} 850ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 851