| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 1 | /* |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 2 | * Copyright (c) 2015-2016 The Khronos Group Inc. |
| 3 | * Copyright (c) 2015-2016 Valve Corporation |
| 4 | * Copyright (c) 2015-2016 LunarG, Inc. |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 5 | * |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 7 | * of this software and/or associated documentation files (the "Materials"), to |
| 8 | * deal in the Materials without restriction, including without limitation the |
| 9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
| 10 | * sell copies of the Materials, and to permit persons to whom the Materials are |
| 11 | * furnished to do so, subject to the following conditions: |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 12 | * |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 13 | * The above copyright notice(s) and this permission notice shall be included in |
| 14 | * all copies or substantial portions of the Materials. |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 15 | * |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 16 | * The Materials are Confidential Information as defined by the Khronos |
| 17 | * Membership Agreement until designated non-confidential by Khronos, at which |
| 18 | * point this condition clause shall be removed. |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 19 | * |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 20 | * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| 23 | * |
| 24 | * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| 25 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| 26 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE |
| 27 | * USE OR OTHER DEALINGS IN THE MATERIALS. |
| Courtney Goeltzenleuchter | 96cd795 | 2015-10-30 11:14:30 -0600 | [diff] [blame] | 28 | * |
| 29 | * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> |
| 30 | * Author: David Pinedo <david@lunarg.com> |
| 31 | * Author: Mark Lobodzinski <mark@lunarg.com> |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 32 | */ |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 33 | #include <stdlib.h> |
| 34 | #include <stdio.h> |
| 35 | #include <stdbool.h> |
| 36 | #include <string.h> |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 37 | #include <assert.h> |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 38 | #include <inttypes.h> |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 39 | |
| Ian Elliott | ea95f5c | 2015-04-17 21:23:34 -0600 | [diff] [blame] | 40 | #ifdef _WIN32 |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 41 | #include <fcntl.h> |
| 42 | #include <io.h> |
| Ian Elliott | b5fad79 | 2015-11-20 11:55:46 -0700 | [diff] [blame] | 43 | #endif // _WIN32 |
| Ian Elliott | 64070a8 | 2015-11-17 17:29:40 -0700 | [diff] [blame] | 44 | |
| David Pinedo | 329ca9e | 2015-11-06 12:54:48 -0700 | [diff] [blame] | 45 | #include <vulkan/vulkan.h> |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 46 | #include <vulkan/vk_ext_debug_report.h> |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 47 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 48 | #define ERR(err) \ |
| 49 | printf("%s:%d: failed with %s\n", __FILE__, __LINE__, \ |
| 50 | vk_result_string(err)); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 51 | |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 52 | #ifdef _WIN32 |
| 53 | |
| Ian Elliott | 7c83aa2 | 2015-07-08 17:09:54 -0600 | [diff] [blame] | 54 | #define snprintf _snprintf |
| 55 | |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 56 | bool consoleCreated = false; |
| 57 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 58 | #define WAIT_FOR_CONSOLE_DESTROY \ |
| 59 | do { \ |
| 60 | if (consoleCreated) \ |
| 61 | Sleep(INFINITE); \ |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 62 | } while (0) |
| 63 | #else |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 64 | #define WAIT_FOR_CONSOLE_DESTROY |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 65 | #endif |
| 66 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 67 | #define ERR_EXIT(err) \ |
| 68 | do { \ |
| 69 | ERR(err); \ |
| 70 | fflush(stdout); \ |
| 71 | WAIT_FOR_CONSOLE_DESTROY; \ |
| 72 | exit(-1); \ |
| 73 | } while (0) |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 74 | |
| Tony Barbour | 22a3086 | 2015-04-22 09:02:32 -0600 | [diff] [blame] | 75 | #if defined(NDEBUG) && defined(__GNUC__) |
| 76 | #define U_ASSERT_ONLY __attribute__((unused)) |
| 77 | #else |
| 78 | #define U_ASSERT_ONLY |
| 79 | #endif |
| 80 | |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 81 | #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) |
| 82 | |
| 83 | #define MAX_GPUS 8 |
| 84 | |
| 85 | #define MAX_QUEUE_TYPES 5 |
| Ian Elliott | 4e19ed0 | 2015-04-28 10:52:52 -0600 | [diff] [blame] | 86 | #define APP_SHORT_NAME "vulkaninfo" |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 87 | |
| 88 | struct app_gpu; |
| 89 | |
| 90 | struct app_dev { |
| 91 | struct app_gpu *gpu; /* point back to the GPU */ |
| 92 | |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 93 | VkDevice obj; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 94 | |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 95 | VkFormatProperties format_props[VK_FORMAT_RANGE_SIZE]; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 96 | }; |
| 97 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 98 | struct layer_extension_list { |
| 99 | VkLayerProperties layer_properties; |
| 100 | uint32_t extension_count; |
| 101 | VkExtensionProperties *extension_properties; |
| 102 | }; |
| 103 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 104 | struct app_instance { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 105 | VkInstance instance; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 106 | uint32_t global_layer_count; |
| 107 | struct layer_extension_list *global_layers; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 108 | uint32_t global_extension_count; |
| 109 | VkExtensionProperties *global_extensions; |
| 110 | }; |
| 111 | |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 112 | struct app_gpu { |
| Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 113 | uint32_t id; |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 114 | VkPhysicalDevice obj; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 115 | |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 116 | VkPhysicalDeviceProperties props; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 117 | |
| Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 118 | uint32_t queue_count; |
| Cody Northrop | ef72e2a | 2015-08-03 17:04:53 -0600 | [diff] [blame] | 119 | VkQueueFamilyProperties *queue_props; |
| Courtney Goeltzenleuchter | ddcb619 | 2015-04-14 18:48:46 -0600 | [diff] [blame] | 120 | VkDeviceQueueCreateInfo *queue_reqs; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 121 | |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 122 | VkPhysicalDeviceMemoryProperties memory_props; |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 123 | VkPhysicalDeviceFeatures features; |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 124 | VkPhysicalDevice limits; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 125 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 126 | uint32_t device_layer_count; |
| 127 | struct layer_extension_list *device_layers; |
| 128 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 129 | uint32_t device_extension_count; |
| 130 | VkExtensionProperties *device_extensions; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 131 | |
| 132 | struct app_dev dev; |
| 133 | }; |
| 134 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 135 | static VKAPI_ATTR VkBool32 VKAPI_CALL |
| 136 | dbg_callback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, |
| 137 | uint64_t srcObject, size_t location, int32_t msgCode, |
| 138 | const char *pLayerPrefix, const char *pMsg, void *pUserData) { |
| 139 | char *message = (char *)malloc(strlen(pMsg) + 100); |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 140 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 141 | assert(message); |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 142 | |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 143 | if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 144 | sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, |
| 145 | pMsg); |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 146 | } else if (msgFlags & VK_DEBUG_REPORT_WARN_BIT_EXT) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 147 | sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, |
| 148 | pMsg); |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 149 | } else if (msgFlags & VK_DEBUG_REPORT_INFO_BIT_EXT) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 150 | sprintf(message, "INFO: [%s] Code %d : %s", pLayerPrefix, msgCode, |
| 151 | pMsg); |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 152 | } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 153 | sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, |
| 154 | pMsg); |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 155 | } |
| 156 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 157 | printf("%s\n", message); |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 158 | fflush(stdout); |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 159 | free(message); |
| 160 | |
| 161 | /* |
| 162 | * false indicates that layer should not bail-out of an |
| 163 | * API call that had validation failures. This may mean that the |
| 164 | * app dies inside the driver due to invalid parameter(s). |
| 165 | * That's what would happen without validation layers, so we'll |
| 166 | * keep that behavior here. |
| 167 | */ |
| 168 | return false; |
| 169 | } |
| 170 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 171 | static const char *vk_result_string(VkResult err) { |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 172 | switch (err) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 173 | #define STR(r) \ |
| 174 | case r: \ |
| 175 | return #r |
| 176 | STR(VK_SUCCESS); |
| 177 | STR(VK_NOT_READY); |
| 178 | STR(VK_TIMEOUT); |
| 179 | STR(VK_EVENT_SET); |
| 180 | STR(VK_EVENT_RESET); |
| 181 | STR(VK_ERROR_INITIALIZATION_FAILED); |
| 182 | STR(VK_ERROR_OUT_OF_HOST_MEMORY); |
| 183 | STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); |
| 184 | STR(VK_ERROR_DEVICE_LOST); |
| 185 | STR(VK_ERROR_LAYER_NOT_PRESENT); |
| 186 | STR(VK_ERROR_EXTENSION_NOT_PRESENT); |
| 187 | STR(VK_ERROR_MEMORY_MAP_FAILED); |
| 188 | STR(VK_ERROR_INCOMPATIBLE_DRIVER); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 189 | #undef STR |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 190 | default: |
| 191 | return "UNKNOWN_RESULT"; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 192 | } |
| 193 | } |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 194 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 195 | static const char *vk_physical_device_type_string(VkPhysicalDeviceType type) { |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 196 | switch (type) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 197 | #define STR(r) \ |
| 198 | case VK_PHYSICAL_DEVICE_TYPE_##r: \ |
| 199 | return #r |
| 200 | STR(OTHER); |
| 201 | STR(INTEGRATED_GPU); |
| 202 | STR(DISCRETE_GPU); |
| 203 | STR(VIRTUAL_GPU); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 204 | #undef STR |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 205 | default: |
| 206 | return "UNKNOWN_DEVICE"; |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 207 | } |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 208 | } |
| 209 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 210 | static const char *vk_format_string(VkFormat fmt) { |
| Jeremy Hayes | 2b7e88a | 2015-01-23 08:51:43 -0700 | [diff] [blame] | 211 | switch (fmt) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 212 | #define STR(r) \ |
| 213 | case VK_FORMAT_##r: \ |
| 214 | return #r |
| 215 | STR(UNDEFINED); |
| 216 | STR(R4G4_UNORM_PACK8); |
| 217 | STR(R4G4B4A4_UNORM_PACK16); |
| 218 | STR(B4G4R4A4_UNORM_PACK16); |
| 219 | STR(R5G6B5_UNORM_PACK16); |
| 220 | STR(B5G6R5_UNORM_PACK16); |
| 221 | STR(R5G5B5A1_UNORM_PACK16); |
| 222 | STR(B5G5R5A1_UNORM_PACK16); |
| 223 | STR(A1R5G5B5_UNORM_PACK16); |
| 224 | STR(R8_UNORM); |
| 225 | STR(R8_SNORM); |
| 226 | STR(R8_USCALED); |
| 227 | STR(R8_SSCALED); |
| 228 | STR(R8_UINT); |
| 229 | STR(R8_SINT); |
| 230 | STR(R8_SRGB); |
| 231 | STR(R8G8_UNORM); |
| 232 | STR(R8G8_SNORM); |
| 233 | STR(R8G8_USCALED); |
| 234 | STR(R8G8_SSCALED); |
| 235 | STR(R8G8_UINT); |
| 236 | STR(R8G8_SINT); |
| 237 | STR(R8G8_SRGB); |
| 238 | STR(R8G8B8_UNORM); |
| 239 | STR(R8G8B8_SNORM); |
| 240 | STR(R8G8B8_USCALED); |
| 241 | STR(R8G8B8_SSCALED); |
| 242 | STR(R8G8B8_UINT); |
| 243 | STR(R8G8B8_SINT); |
| 244 | STR(R8G8B8_SRGB); |
| 245 | STR(B8G8R8_UNORM); |
| 246 | STR(B8G8R8_SNORM); |
| 247 | STR(B8G8R8_USCALED); |
| 248 | STR(B8G8R8_SSCALED); |
| 249 | STR(B8G8R8_UINT); |
| 250 | STR(B8G8R8_SINT); |
| 251 | STR(B8G8R8_SRGB); |
| 252 | STR(R8G8B8A8_UNORM); |
| 253 | STR(R8G8B8A8_SNORM); |
| 254 | STR(R8G8B8A8_USCALED); |
| 255 | STR(R8G8B8A8_SSCALED); |
| 256 | STR(R8G8B8A8_UINT); |
| 257 | STR(R8G8B8A8_SINT); |
| 258 | STR(R8G8B8A8_SRGB); |
| 259 | STR(B8G8R8A8_UNORM); |
| 260 | STR(B8G8R8A8_SNORM); |
| 261 | STR(B8G8R8A8_USCALED); |
| 262 | STR(B8G8R8A8_SSCALED); |
| 263 | STR(B8G8R8A8_UINT); |
| 264 | STR(B8G8R8A8_SINT); |
| 265 | STR(B8G8R8A8_SRGB); |
| 266 | STR(A8B8G8R8_UNORM_PACK32); |
| 267 | STR(A8B8G8R8_SNORM_PACK32); |
| 268 | STR(A8B8G8R8_USCALED_PACK32); |
| 269 | STR(A8B8G8R8_SSCALED_PACK32); |
| 270 | STR(A8B8G8R8_UINT_PACK32); |
| 271 | STR(A8B8G8R8_SINT_PACK32); |
| 272 | STR(A8B8G8R8_SRGB_PACK32); |
| 273 | STR(A2R10G10B10_UNORM_PACK32); |
| 274 | STR(A2R10G10B10_SNORM_PACK32); |
| 275 | STR(A2R10G10B10_USCALED_PACK32); |
| 276 | STR(A2R10G10B10_SSCALED_PACK32); |
| 277 | STR(A2R10G10B10_UINT_PACK32); |
| 278 | STR(A2R10G10B10_SINT_PACK32); |
| 279 | STR(A2B10G10R10_UNORM_PACK32); |
| 280 | STR(A2B10G10R10_SNORM_PACK32); |
| 281 | STR(A2B10G10R10_USCALED_PACK32); |
| 282 | STR(A2B10G10R10_SSCALED_PACK32); |
| 283 | STR(A2B10G10R10_UINT_PACK32); |
| 284 | STR(A2B10G10R10_SINT_PACK32); |
| 285 | STR(R16_UNORM); |
| 286 | STR(R16_SNORM); |
| 287 | STR(R16_USCALED); |
| 288 | STR(R16_SSCALED); |
| 289 | STR(R16_UINT); |
| 290 | STR(R16_SINT); |
| 291 | STR(R16_SFLOAT); |
| 292 | STR(R16G16_UNORM); |
| 293 | STR(R16G16_SNORM); |
| 294 | STR(R16G16_USCALED); |
| 295 | STR(R16G16_SSCALED); |
| 296 | STR(R16G16_UINT); |
| 297 | STR(R16G16_SINT); |
| 298 | STR(R16G16_SFLOAT); |
| 299 | STR(R16G16B16_UNORM); |
| 300 | STR(R16G16B16_SNORM); |
| 301 | STR(R16G16B16_USCALED); |
| 302 | STR(R16G16B16_SSCALED); |
| 303 | STR(R16G16B16_UINT); |
| 304 | STR(R16G16B16_SINT); |
| 305 | STR(R16G16B16_SFLOAT); |
| 306 | STR(R16G16B16A16_UNORM); |
| 307 | STR(R16G16B16A16_SNORM); |
| 308 | STR(R16G16B16A16_USCALED); |
| 309 | STR(R16G16B16A16_SSCALED); |
| 310 | STR(R16G16B16A16_UINT); |
| 311 | STR(R16G16B16A16_SINT); |
| 312 | STR(R16G16B16A16_SFLOAT); |
| 313 | STR(R32_UINT); |
| 314 | STR(R32_SINT); |
| 315 | STR(R32_SFLOAT); |
| 316 | STR(R32G32_UINT); |
| 317 | STR(R32G32_SINT); |
| 318 | STR(R32G32_SFLOAT); |
| 319 | STR(R32G32B32_UINT); |
| 320 | STR(R32G32B32_SINT); |
| 321 | STR(R32G32B32_SFLOAT); |
| 322 | STR(R32G32B32A32_UINT); |
| 323 | STR(R32G32B32A32_SINT); |
| 324 | STR(R32G32B32A32_SFLOAT); |
| 325 | STR(R64_UINT); |
| 326 | STR(R64_SINT); |
| 327 | STR(R64_SFLOAT); |
| 328 | STR(R64G64_UINT); |
| 329 | STR(R64G64_SINT); |
| 330 | STR(R64G64_SFLOAT); |
| 331 | STR(R64G64B64_UINT); |
| 332 | STR(R64G64B64_SINT); |
| 333 | STR(R64G64B64_SFLOAT); |
| 334 | STR(R64G64B64A64_UINT); |
| 335 | STR(R64G64B64A64_SINT); |
| 336 | STR(R64G64B64A64_SFLOAT); |
| 337 | STR(B10G11R11_UFLOAT_PACK32); |
| 338 | STR(E5B9G9R9_UFLOAT_PACK32); |
| 339 | STR(D16_UNORM); |
| 340 | STR(X8_D24_UNORM_PACK32); |
| 341 | STR(D32_SFLOAT); |
| 342 | STR(S8_UINT); |
| 343 | STR(D16_UNORM_S8_UINT); |
| 344 | STR(D24_UNORM_S8_UINT); |
| 345 | STR(D32_SFLOAT_S8_UINT); |
| 346 | STR(BC1_RGB_UNORM_BLOCK); |
| 347 | STR(BC1_RGB_SRGB_BLOCK); |
| 348 | STR(BC2_UNORM_BLOCK); |
| 349 | STR(BC2_SRGB_BLOCK); |
| 350 | STR(BC3_UNORM_BLOCK); |
| 351 | STR(BC3_SRGB_BLOCK); |
| 352 | STR(BC4_UNORM_BLOCK); |
| 353 | STR(BC4_SNORM_BLOCK); |
| 354 | STR(BC5_UNORM_BLOCK); |
| 355 | STR(BC5_SNORM_BLOCK); |
| 356 | STR(BC6H_UFLOAT_BLOCK); |
| 357 | STR(BC6H_SFLOAT_BLOCK); |
| 358 | STR(BC7_UNORM_BLOCK); |
| 359 | STR(BC7_SRGB_BLOCK); |
| 360 | STR(ETC2_R8G8B8_UNORM_BLOCK); |
| 361 | STR(ETC2_R8G8B8A1_UNORM_BLOCK); |
| 362 | STR(ETC2_R8G8B8A8_UNORM_BLOCK); |
| 363 | STR(EAC_R11_UNORM_BLOCK); |
| 364 | STR(EAC_R11_SNORM_BLOCK); |
| 365 | STR(EAC_R11G11_UNORM_BLOCK); |
| 366 | STR(EAC_R11G11_SNORM_BLOCK); |
| 367 | STR(ASTC_4x4_UNORM_BLOCK); |
| 368 | STR(ASTC_4x4_SRGB_BLOCK); |
| 369 | STR(ASTC_5x4_UNORM_BLOCK); |
| 370 | STR(ASTC_5x4_SRGB_BLOCK); |
| 371 | STR(ASTC_5x5_UNORM_BLOCK); |
| 372 | STR(ASTC_5x5_SRGB_BLOCK); |
| 373 | STR(ASTC_6x5_UNORM_BLOCK); |
| 374 | STR(ASTC_6x5_SRGB_BLOCK); |
| 375 | STR(ASTC_6x6_UNORM_BLOCK); |
| 376 | STR(ASTC_6x6_SRGB_BLOCK); |
| 377 | STR(ASTC_8x5_UNORM_BLOCK); |
| 378 | STR(ASTC_8x5_SRGB_BLOCK); |
| 379 | STR(ASTC_8x6_UNORM_BLOCK); |
| 380 | STR(ASTC_8x6_SRGB_BLOCK); |
| 381 | STR(ASTC_8x8_UNORM_BLOCK); |
| 382 | STR(ASTC_8x8_SRGB_BLOCK); |
| 383 | STR(ASTC_10x5_UNORM_BLOCK); |
| 384 | STR(ASTC_10x5_SRGB_BLOCK); |
| 385 | STR(ASTC_10x6_UNORM_BLOCK); |
| 386 | STR(ASTC_10x6_SRGB_BLOCK); |
| 387 | STR(ASTC_10x8_UNORM_BLOCK); |
| 388 | STR(ASTC_10x8_SRGB_BLOCK); |
| 389 | STR(ASTC_10x10_UNORM_BLOCK); |
| 390 | STR(ASTC_10x10_SRGB_BLOCK); |
| 391 | STR(ASTC_12x10_UNORM_BLOCK); |
| 392 | STR(ASTC_12x10_SRGB_BLOCK); |
| 393 | STR(ASTC_12x12_UNORM_BLOCK); |
| 394 | STR(ASTC_12x12_SRGB_BLOCK); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 395 | #undef STR |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 396 | default: |
| 397 | return "UNKNOWN_FORMAT"; |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 398 | } |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 399 | } |
| 400 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 401 | static void app_dev_init_formats(struct app_dev *dev) { |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 402 | VkFormat f; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 403 | |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 404 | for (f = 0; f < VK_FORMAT_RANGE_SIZE; f++) { |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 405 | const VkFormat fmt = f; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 406 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 407 | vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, fmt, |
| 408 | &dev->format_props[f]); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 409 | } |
| 410 | } |
| 411 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 412 | static void extract_version(uint32_t version, uint32_t *major, uint32_t *minor, |
| 413 | uint32_t *patch) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 414 | *major = version >> 22; |
| 415 | *minor = (version >> 12) & 0x3ff; |
| 416 | *patch = version & 0xfff; |
| 417 | } |
| 418 | |
| 419 | static void app_get_physical_device_layer_extensions( |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 420 | struct app_gpu *gpu, char *layer_name, uint32_t *extension_count, |
| 421 | VkExtensionProperties **extension_properties) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 422 | VkResult err; |
| 423 | uint32_t ext_count = 0; |
| 424 | VkExtensionProperties *ext_ptr = NULL; |
| 425 | |
| 426 | /* repeat get until VK_INCOMPLETE goes away */ |
| 427 | do { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 428 | err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, |
| 429 | &ext_count, NULL); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 430 | assert(!err); |
| 431 | |
| 432 | if (ext_ptr) { |
| 433 | free(ext_ptr); |
| 434 | } |
| 435 | ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 436 | err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, |
| 437 | &ext_count, ext_ptr); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 438 | } while (err == VK_INCOMPLETE); |
| 439 | assert(!err); |
| 440 | |
| 441 | *extension_count = ext_count; |
| 442 | *extension_properties = ext_ptr; |
| 443 | } |
| 444 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 445 | static void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) { |
| Courtney Goeltzenleuchter | ddcb619 | 2015-04-14 18:48:46 -0600 | [diff] [blame] | 446 | VkDeviceCreateInfo info = { |
| Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 447 | .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 448 | .pNext = NULL, |
| Chia-I Wu | 045654f | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 449 | .queueCreateInfoCount = 0, |
| 450 | .pQueueCreateInfos = NULL, |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 451 | .enabledLayerCount = 0, |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 452 | .ppEnabledLayerNames = NULL, |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 453 | .enabledExtensionCount = 0, |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 454 | .ppEnabledExtensionNames = NULL, |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 455 | }; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 456 | VkResult U_ASSERT_ONLY err; |
| 457 | // Extensions to enable |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 458 | static const char *known_extensions[] = { |
| Ian Elliott | 64070a8 | 2015-11-17 17:29:40 -0700 | [diff] [blame] | 459 | VK_KHR_SWAPCHAIN_EXTENSION_NAME, |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 460 | }; |
| Tony Barbour | 426b905 | 2015-06-24 16:06:58 -0600 | [diff] [blame] | 461 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 462 | uint32_t count = 0; |
| 463 | |
| 464 | /* Scan layers */ |
| 465 | VkLayerProperties *device_layer_properties = NULL; |
| 466 | struct layer_extension_list *device_layers = NULL; |
| 467 | |
| 468 | do { |
| Courtney Goeltzenleuchter | 74c4ce9 | 2015-09-14 17:22:16 -0600 | [diff] [blame] | 469 | err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, NULL); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 470 | assert(!err); |
| 471 | |
| 472 | if (device_layer_properties) { |
| 473 | free(device_layer_properties); |
| 474 | } |
| 475 | device_layer_properties = malloc(sizeof(VkLayerProperties) * count); |
| 476 | assert(device_layer_properties); |
| 477 | |
| 478 | if (device_layers) { |
| 479 | free(device_layers); |
| 480 | } |
| 481 | device_layers = malloc(sizeof(struct layer_extension_list) * count); |
| 482 | assert(device_layers); |
| 483 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 484 | err = vkEnumerateDeviceLayerProperties(gpu->obj, &count, |
| 485 | device_layer_properties); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 486 | } while (err == VK_INCOMPLETE); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 487 | assert(!err); |
| 488 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 489 | gpu->device_layer_count = count; |
| 490 | gpu->device_layers = device_layers; |
| 491 | |
| 492 | for (uint32_t i = 0; i < gpu->device_layer_count; i++) { |
| 493 | VkLayerProperties *src_info = &device_layer_properties[i]; |
| 494 | struct layer_extension_list *dst_info = &gpu->device_layers[i]; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 495 | memcpy(&dst_info->layer_properties, src_info, |
| 496 | sizeof(VkLayerProperties)); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 497 | |
| 498 | /* Save away layer extension info for report */ |
| 499 | app_get_physical_device_layer_extensions( |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 500 | gpu, src_info->layerName, &dst_info->extension_count, |
| 501 | &dst_info->extension_properties); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 502 | } |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 503 | free(device_layer_properties); |
| 504 | |
| 505 | app_get_physical_device_layer_extensions( |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 506 | gpu, NULL, &gpu->device_extension_count, &gpu->device_extensions); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 507 | |
| Courtney Goeltzenleuchter | 9e42b88 | 2015-06-25 16:24:36 -0600 | [diff] [blame] | 508 | fflush(stdout); |
| 509 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 510 | uint32_t enabled_extension_count = 0; |
| Courtney Goeltzenleuchter | 67a0741 | 2015-07-10 10:10:27 -0600 | [diff] [blame] | 511 | uint32_t known_extension_count = ARRAY_SIZE(known_extensions); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 512 | |
| Courtney Goeltzenleuchter | 67a0741 | 2015-07-10 10:10:27 -0600 | [diff] [blame] | 513 | for (uint32_t i = 0; i < known_extension_count; i++) { |
| Courtney Goeltzenleuchter | 1f41f54 | 2015-07-09 11:44:38 -0600 | [diff] [blame] | 514 | VkBool32 extension_found = 0; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 515 | for (uint32_t j = 0; j < gpu->device_extension_count; j++) { |
| 516 | VkExtensionProperties *ext_prop = &gpu->device_extensions[j]; |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 517 | if (!strcmp(known_extensions[i], ext_prop->extensionName)) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 518 | |
| 519 | extension_found = 1; |
| 520 | enabled_extension_count++; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 521 | } |
| 522 | } |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 523 | if (!extension_found) { |
| 524 | printf("Cannot find extension: %s\n", known_extensions[i]); |
| Courtney Goeltzenleuchter | ac544f3 | 2015-09-14 18:01:17 -0600 | [diff] [blame] | 525 | ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 526 | } |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 527 | } |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 528 | |
| 529 | /* request all queues */ |
| Chia-I Wu | 045654f | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 530 | info.queueCreateInfoCount = gpu->queue_count; |
| 531 | info.pQueueCreateInfos = gpu->queue_reqs; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 532 | |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 533 | info.enabledLayerCount = 0; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 534 | info.ppEnabledLayerNames = NULL; |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 535 | info.enabledExtensionCount = enabled_extension_count; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 536 | info.ppEnabledExtensionNames = (const char *const *)known_extensions; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 537 | dev->gpu = gpu; |
| Chia-I Wu | 69f4012 | 2015-10-26 21:10:41 +0800 | [diff] [blame] | 538 | err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 539 | if (err) |
| 540 | ERR_EXIT(err); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 541 | } |
| 542 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 543 | static void app_dev_destroy(struct app_dev *dev) { |
| Chia-I Wu | 69f4012 | 2015-10-26 21:10:41 +0800 | [diff] [blame] | 544 | vkDestroyDevice(dev->obj, NULL); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 545 | } |
| 546 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 547 | static void |
| 548 | app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, |
| 549 | VkExtensionProperties **extension_properties) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 550 | VkResult err; |
| 551 | uint32_t ext_count = 0; |
| 552 | VkExtensionProperties *ext_ptr = NULL; |
| 553 | |
| 554 | /* repeat get until VK_INCOMPLETE goes away */ |
| 555 | do { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 556 | err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, |
| 557 | NULL); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 558 | assert(!err); |
| 559 | |
| 560 | if (ext_ptr) { |
| 561 | free(ext_ptr); |
| 562 | } |
| 563 | ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 564 | err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, |
| 565 | ext_ptr); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 566 | } while (err == VK_INCOMPLETE); |
| 567 | assert(!err); |
| 568 | |
| 569 | *extension_count = ext_count; |
| 570 | *extension_properties = ext_ptr; |
| 571 | } |
| 572 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 573 | static void app_create_instance(struct app_instance *inst) { |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 574 | const VkApplicationInfo app_info = { |
| 575 | .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, |
| 576 | .pNext = NULL, |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 577 | .pApplicationName = APP_SHORT_NAME, |
| 578 | .applicationVersion = 1, |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 579 | .pEngineName = APP_SHORT_NAME, |
| 580 | .engineVersion = 1, |
| 581 | .apiVersion = VK_API_VERSION, |
| 582 | }; |
| 583 | VkInstanceCreateInfo inst_info = { |
| 584 | .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, |
| 585 | .pNext = NULL, |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 586 | .pApplicationInfo = &app_info, |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 587 | .enabledLayerCount = 0, |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 588 | .ppEnabledLayerNames = NULL, |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 589 | .enabledExtensionCount = 0, |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 590 | .ppEnabledExtensionNames = NULL, |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 591 | }; |
| Tony Barbour | 22a3086 | 2015-04-22 09:02:32 -0600 | [diff] [blame] | 592 | VkResult U_ASSERT_ONLY err; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 593 | // Global Extensions to enable |
| Ian Elliott | aae1a57 | 2015-02-04 16:48:37 -0700 | [diff] [blame] | 594 | static char *known_extensions[] = { |
| Ian Elliott | 64070a8 | 2015-11-17 17:29:40 -0700 | [diff] [blame] | 595 | VK_KHR_SURFACE_EXTENSION_NAME, |
| Ian Elliott | b5fad79 | 2015-11-20 11:55:46 -0700 | [diff] [blame] | 596 | #ifdef VK_USE_PLATFORM_ANDROID_KHR |
| 597 | VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, |
| 598 | #endif |
| 599 | #ifdef VK_USE_PLATFORM_MIR_KHR |
| 600 | VK_KHR_MIR_SURFACE_EXTENSION_NAME, |
| 601 | #endif |
| 602 | #ifdef VK_USE_PLATFORM_WAYLAND_KHR |
| 603 | VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, |
| 604 | #endif |
| 605 | #ifdef VK_USE_PLATFORM_WIN32_KHR |
| 606 | VK_KHR_WIN32_SURFACE_EXTENSION_NAME, |
| 607 | #endif |
| 608 | #ifdef VK_USE_PLATFORM_XCB_KHR |
| 609 | VK_KHR_XCB_SURFACE_EXTENSION_NAME, |
| 610 | #endif |
| 611 | #ifdef VK_USE_PLATFORM_XLIB_KHR |
| 612 | VK_KHR_XLIB_SURFACE_EXTENSION_NAME, |
| 613 | #endif |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 614 | }; |
| Tony Barbour | 426b905 | 2015-06-24 16:06:58 -0600 | [diff] [blame] | 615 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 616 | uint32_t global_extension_count = 0; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 617 | uint32_t count = 0; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 618 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 619 | /* Scan layers */ |
| 620 | VkLayerProperties *global_layer_properties = NULL; |
| 621 | struct layer_extension_list *global_layers = NULL; |
| 622 | |
| 623 | do { |
| Courtney Goeltzenleuchter | 74c4ce9 | 2015-09-14 17:22:16 -0600 | [diff] [blame] | 624 | err = vkEnumerateInstanceLayerProperties(&count, NULL); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 625 | assert(!err); |
| 626 | |
| 627 | if (global_layer_properties) { |
| 628 | free(global_layer_properties); |
| 629 | } |
| 630 | global_layer_properties = malloc(sizeof(VkLayerProperties) * count); |
| 631 | assert(global_layer_properties); |
| 632 | |
| 633 | if (global_layers) { |
| 634 | free(global_layers); |
| 635 | } |
| 636 | global_layers = malloc(sizeof(struct layer_extension_list) * count); |
| 637 | assert(global_layers); |
| 638 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 639 | err = |
| 640 | vkEnumerateInstanceLayerProperties(&count, global_layer_properties); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 641 | } while (err == VK_INCOMPLETE); |
| Tobin Ehlis | 3536b44 | 2015-04-16 18:04:57 -0600 | [diff] [blame] | 642 | assert(!err); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 643 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 644 | inst->global_layer_count = count; |
| 645 | inst->global_layers = global_layers; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 646 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 647 | for (uint32_t i = 0; i < inst->global_layer_count; i++) { |
| 648 | VkLayerProperties *src_info = &global_layer_properties[i]; |
| 649 | struct layer_extension_list *dst_info = &inst->global_layers[i]; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 650 | memcpy(&dst_info->layer_properties, src_info, |
| 651 | sizeof(VkLayerProperties)); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 652 | |
| 653 | /* Save away layer extension info for report */ |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 654 | app_get_global_layer_extensions(src_info->layerName, |
| 655 | &dst_info->extension_count, |
| 656 | &dst_info->extension_properties); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 657 | } |
| 658 | free(global_layer_properties); |
| 659 | |
| 660 | /* Collect global extensions */ |
| 661 | inst->global_extension_count = 0; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 662 | app_get_global_layer_extensions(NULL, &inst->global_extension_count, |
| 663 | &inst->global_extensions); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 664 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 665 | for (uint32_t i = 0; i < ARRAY_SIZE(known_extensions); i++) { |
| Courtney Goeltzenleuchter | 1f41f54 | 2015-07-09 11:44:38 -0600 | [diff] [blame] | 666 | VkBool32 extension_found = 0; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 667 | for (uint32_t j = 0; j < inst->global_extension_count; j++) { |
| 668 | VkExtensionProperties *extension_prop = &inst->global_extensions[j]; |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 669 | if (!strcmp(known_extensions[i], extension_prop->extensionName)) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 670 | |
| 671 | extension_found = 1; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 672 | global_extension_count++; |
| 673 | } |
| Tobin Ehlis | 3536b44 | 2015-04-16 18:04:57 -0600 | [diff] [blame] | 674 | } |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 675 | if (!extension_found) { |
| 676 | printf("Cannot find extension: %s\n", known_extensions[i]); |
| Courtney Goeltzenleuchter | ac544f3 | 2015-09-14 18:01:17 -0600 | [diff] [blame] | 677 | ERR_EXIT(VK_ERROR_EXTENSION_NOT_PRESENT); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 678 | } |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 679 | } |
| 680 | |
| Jon Ashburn | a4ae48b | 2016-01-11 13:12:43 -0700 | [diff] [blame] | 681 | inst_info.enabledExtensionCount = global_extension_count; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 682 | inst_info.ppEnabledExtensionNames = (const char *const *)known_extensions; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 683 | |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 684 | VkDebugReportCallbackCreateInfoEXT dbg_info; |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 685 | memset(&dbg_info, 0, sizeof(dbg_info)); |
| Courtney Goeltzenleuchter | acb1359 | 2015-12-09 15:48:16 -0700 | [diff] [blame] | 686 | dbg_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 687 | dbg_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | |
| 688 | VK_DEBUG_REPORT_WARN_BIT_EXT | |
| 689 | VK_DEBUG_REPORT_INFO_BIT_EXT; |
| Courtney Goeltzenleuchter | f412d57 | 2015-12-03 13:50:49 -0700 | [diff] [blame] | 690 | dbg_info.pfnCallback = dbg_callback; |
| 691 | inst_info.pNext = &dbg_info; |
| 692 | |
| Chia-I Wu | 69f4012 | 2015-10-26 21:10:41 +0800 | [diff] [blame] | 693 | err = vkCreateInstance(&inst_info, NULL, &inst->instance); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 694 | if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { |
| 695 | printf("Cannot create Vulkan instance.\n"); |
| 696 | ERR_EXIT(err); |
| 697 | } else if (err) { |
| 698 | ERR_EXIT(err); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 699 | } |
| 700 | } |
| 701 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 702 | static void app_destroy_instance(struct app_instance *inst) { |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 703 | free(inst->global_extensions); |
| Chia-I Wu | 69f4012 | 2015-10-26 21:10:41 +0800 | [diff] [blame] | 704 | vkDestroyInstance(inst->instance, NULL); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 705 | } |
| 706 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 707 | static void app_gpu_init(struct app_gpu *gpu, uint32_t id, |
| 708 | VkPhysicalDevice obj) { |
| Ian Elliott | aae1a57 | 2015-02-04 16:48:37 -0700 | [diff] [blame] | 709 | uint32_t i; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 710 | |
| 711 | memset(gpu, 0, sizeof(*gpu)); |
| 712 | |
| 713 | gpu->id = id; |
| 714 | gpu->obj = obj; |
| Tony Barbour | 426b905 | 2015-06-24 16:06:58 -0600 | [diff] [blame] | 715 | |
| Courtney Goeltzenleuchter | 01d2ae1 | 2015-10-20 16:40:38 -0600 | [diff] [blame] | 716 | vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 717 | |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 718 | /* get queue count */ |
| Courtney Goeltzenleuchter | 01d2ae1 | 2015-10-20 16:40:38 -0600 | [diff] [blame] | 719 | vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 720 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 721 | gpu->queue_props = malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); |
| Tony Barbour | 426b905 | 2015-06-24 16:06:58 -0600 | [diff] [blame] | 722 | |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 723 | if (!gpu->queue_props) |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 724 | ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 725 | vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, |
| 726 | gpu->queue_props); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 727 | |
| 728 | /* set up queue requests */ |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 729 | gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); |
| 730 | if (!gpu->queue_reqs) |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 731 | ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 732 | for (i = 0; i < gpu->queue_count; i++) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 733 | float *queue_priorities = |
| 734 | malloc(gpu->queue_props[i].queueCount * sizeof(float)); |
| 735 | memset(queue_priorities, 0, |
| 736 | gpu->queue_props[i].queueCount * sizeof(float)); |
| Courtney Goeltzenleuchter | ea97564 | 2015-09-16 16:23:55 -0600 | [diff] [blame] | 737 | gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; |
| 738 | gpu->queue_reqs[i].pNext = NULL; |
| Chris Forbes | fa6d36e | 2015-07-11 19:11:39 +1200 | [diff] [blame] | 739 | gpu->queue_reqs[i].queueFamilyIndex = i; |
| Chia-I Wu | 045654f | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 740 | gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; |
| Courtney Goeltzenleuchter | d3a8d36 | 2015-10-23 10:37:02 -0600 | [diff] [blame] | 741 | gpu->queue_reqs[i].pQueuePriorities = queue_priorities; |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 742 | } |
| 743 | |
| Courtney Goeltzenleuchter | 01d2ae1 | 2015-10-20 16:40:38 -0600 | [diff] [blame] | 744 | vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 745 | |
| Courtney Goeltzenleuchter | 01d2ae1 | 2015-10-20 16:40:38 -0600 | [diff] [blame] | 746 | vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 747 | |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 748 | app_dev_init(&gpu->dev, gpu); |
| 749 | app_dev_init_formats(&gpu->dev); |
| 750 | } |
| 751 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 752 | static void app_gpu_destroy(struct app_gpu *gpu) { |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 753 | app_dev_destroy(&gpu->dev); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 754 | free(gpu->device_extensions); |
| Jon Ashburn | 2c09483 | 2015-12-11 17:11:43 -0700 | [diff] [blame] | 755 | |
| Courtney Goeltzenleuchter | d3a8d36 | 2015-10-23 10:37:02 -0600 | [diff] [blame] | 756 | for (uint32_t i = 0; i < gpu->queue_count; i++) { |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 757 | free((void *)gpu->queue_reqs[i].pQueuePriorities); |
| Courtney Goeltzenleuchter | d3a8d36 | 2015-10-23 10:37:02 -0600 | [diff] [blame] | 758 | } |
| Jon Ashburn | 2c09483 | 2015-12-11 17:11:43 -0700 | [diff] [blame] | 759 | free(gpu->queue_reqs); |
| Chia-I Wu | 46c29dd | 2014-12-02 21:09:20 +0800 | [diff] [blame] | 760 | free(gpu->queue_props); |
| 761 | } |
| 762 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 763 | // clang-format off |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 764 | static void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 765 | { |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 766 | const VkFormatProperties *props = &dev->format_props[fmt]; |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 767 | struct { |
| 768 | const char *name; |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 769 | VkFlags flags; |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 770 | } features[3]; |
| Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 771 | uint32_t i; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 772 | |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 773 | features[0].name = "linearTiling FormatFeatureFlags"; |
| 774 | features[0].flags = props->linearTilingFeatures; |
| 775 | features[1].name = "optimalTiling FormatFeatureFlags"; |
| 776 | features[1].flags = props->optimalTilingFeatures; |
| 777 | features[2].name = "bufferFeatures FormatFeatureFlags"; |
| 778 | features[2].flags = props->bufferFeatures; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 779 | |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 780 | printf("\nFORMAT_%s:", vk_format_string(fmt)); |
| 781 | for (i = 0; i < ARRAY_SIZE(features); i++) { |
| 782 | printf("\n\t%s:", features[i].name); |
| 783 | if (features[i].flags == 0) { |
| 784 | printf("\n\t\tNone"); |
| 785 | } else { |
| Jon Ashburn | bd897d8 | 2016-01-22 15:39:20 -0700 | [diff] [blame] | 786 | printf("%s%s%s%s%s%s%s%s%s%s%s%s%s", |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 787 | ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), |
| 788 | ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), |
| 789 | ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), |
| 790 | ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), |
| 791 | ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), |
| 792 | ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), |
| Jon Ashburn | bd897d8 | 2016-01-22 15:39:20 -0700 | [diff] [blame] | 793 | ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), |
| 794 | ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), |
| 795 | ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 796 | ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), |
| 797 | ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), |
| 798 | ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), |
| 799 | ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : "")); |
| 800 | } |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 801 | } |
| Mark Lobodzinski | 4b36dd4 | 2015-09-03 15:21:52 -0600 | [diff] [blame] | 802 | printf("\n"); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 803 | } |
| 804 | |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 805 | |
| 806 | static void |
| 807 | app_dev_dump(const struct app_dev *dev) |
| 808 | { |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 809 | VkFormat fmt; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 810 | |
| Chia-I Wu | 1f85191 | 2015-10-27 18:04:07 +0800 | [diff] [blame] | 811 | for (fmt = 0; fmt < VK_FORMAT_RANGE_SIZE; fmt++) { |
| Jeremy Hayes | 2b7e88a | 2015-01-23 08:51:43 -0700 | [diff] [blame] | 812 | app_dev_dump_format_props(dev, fmt); |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 813 | } |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 814 | } |
| 815 | |
| Mike Stroyan | 009d8ca | 2015-05-27 13:09:15 -0600 | [diff] [blame] | 816 | #ifdef _WIN32 |
| 817 | #define PRINTF_SIZE_T_SPECIFIER "%Iu" |
| 818 | #else |
| 819 | #define PRINTF_SIZE_T_SPECIFIER "%zu" |
| 820 | #endif |
| 821 | |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 822 | static void app_gpu_dump_features(const struct app_gpu *gpu) |
| 823 | { |
| 824 | const VkPhysicalDeviceFeatures *features = &gpu->features; |
| 825 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 826 | printf("VkPhysicalDeviceFeatures:\n"); |
| 827 | printf("=========================\n"); |
| 828 | |
| 829 | printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); |
| 830 | printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); |
| 831 | printf("\timageCubeArray = %u\n", features->imageCubeArray ); |
| 832 | printf("\tindependentBlend = %u\n", features->independentBlend ); |
| 833 | printf("\tgeometryShader = %u\n", features->geometryShader ); |
| 834 | printf("\ttessellationShader = %u\n", features->tessellationShader ); |
| 835 | printf("\tsampleRateShading = %u\n", features->sampleRateShading ); |
| Chia-I Wu | c04519c | 2015-10-27 17:53:18 +0800 | [diff] [blame] | 836 | printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 837 | printf("\tlogicOp = %u\n", features->logicOp ); |
| 838 | printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); |
| Jon Ashburn | 0bdccbb | 2015-12-31 12:47:52 -0700 | [diff] [blame] | 839 | printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); |
| Chia-I Wu | c04519c | 2015-10-27 17:53:18 +0800 | [diff] [blame] | 840 | printf("\tdepthClamp = %u\n", features->depthClamp ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 841 | printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); |
| Chia-I Wu | 4291d88 | 2015-10-27 19:00:15 +0800 | [diff] [blame] | 842 | printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 843 | printf("\tdepthBounds = %u\n", features->depthBounds ); |
| 844 | printf("\twideLines = %u\n", features->wideLines ); |
| 845 | printf("\tlargePoints = %u\n", features->largePoints ); |
| 846 | printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); |
| 847 | printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); |
| 848 | printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 849 | printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 850 | printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); |
| Chia-I Wu | fd4bfc4 | 2015-10-26 17:04:32 +0800 | [diff] [blame] | 851 | printf("\tvertexSideEffects = %u\n", features->vertexPipelineStoresAndAtomics ); |
| 852 | printf("\ttessellationSideEffects = %u\n", features->fragmentStoresAndAtomics ); |
| 853 | printf("\tgeometrySideEffects = %u\n", features->shaderTessellationAndGeometryPointSize ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 854 | printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); |
| 855 | printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); |
| 856 | printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); |
| Chia-I Wu | 221f2f2 | 2015-10-27 18:52:05 +0800 | [diff] [blame] | 857 | printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); |
| 858 | printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 859 | printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); |
| 860 | printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); |
| 861 | printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); |
| 862 | printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); |
| 863 | printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); |
| 864 | printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); |
| 865 | printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); |
| 866 | printf("\tshaderInt64 = %u\n", features->shaderInt64 ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 867 | printf("\tshaderInt16 = %u\n", features->shaderInt16 ); |
| 868 | printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); |
| Chia-I Wu | d3f9934 | 2015-10-27 18:58:00 +0800 | [diff] [blame] | 869 | printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 870 | printf("\talphaToOne = %u\n", features->alphaToOne ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 871 | printf("\tsparseBinding = %u\n", features->sparseBinding ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 872 | printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); |
| 873 | printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); |
| 874 | printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); |
| 875 | printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); |
| 876 | printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); |
| 877 | printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); |
| 878 | printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 879 | printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); |
| Chia-I Wu | d507261 | 2015-10-27 18:52:46 +0800 | [diff] [blame] | 880 | printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); |
| Jon Ashburn | 0717ed5 | 2015-12-14 14:59:20 -0700 | [diff] [blame] | 881 | printf("\tiheritedQueries = %u\n", features->inheritedQueries ); |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 882 | } |
| 883 | |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 884 | static void app_dump_sparse_props(const VkPhysicalDeviceSparseProperties *sparseProps) |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 885 | { |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 886 | |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 887 | printf("\tVkPhysicalDeviceSparseProperties:\n"); |
| 888 | printf("\t---------------------------------\n"); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 889 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 890 | printf("\t\tresidencyStandard2DBlockShape = %u\n", sparseProps->residencyStandard2DBlockShape ); |
| Chia-I Wu | 7e47070 | 2015-10-26 17:24:52 +0800 | [diff] [blame] | 891 | printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparseProps->residencyStandard2DMultisampleBlockShape); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 892 | printf("\t\tresidencyStandard3DBlockShape = %u\n", sparseProps->residencyStandard3DBlockShape ); |
| 893 | printf("\t\tresidencyAlignedMipSize = %u\n", sparseProps->residencyAlignedMipSize ); |
| 894 | printf("\t\tresidencyNonResidentStrict = %u\n", sparseProps->residencyNonResidentStrict ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 895 | } |
| 896 | |
| 897 | static void app_dump_limits(const VkPhysicalDeviceLimits *limits) |
| 898 | { |
| 899 | printf("\tVkPhysicalDeviceLimits:\n"); |
| 900 | printf("\t-----------------------\n"); |
| 901 | |
| 902 | printf("\t\tmaxImageDimension1D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension1D ); |
| 903 | printf("\t\tmaxImageDimension2D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension2D ); |
| 904 | printf("\t\tmaxImageDimension3D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension3D ); |
| 905 | printf("\t\tmaxImageDimensionCube = 0x%" PRIxLEAST32 "\n", limits->maxImageDimensionCube ); |
| 906 | printf("\t\tmaxImageArrayLayers = 0x%" PRIxLEAST32 "\n", limits->maxImageArrayLayers ); |
| Chia-I Wu | 7e47070 | 2015-10-26 17:24:52 +0800 | [diff] [blame] | 907 | printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 908 | printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); |
| 909 | printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 910 | printf("\t\tmaxPushConstantsSize = 0x%" PRIxLEAST32 "\n", limits->maxPushConstantsSize ); |
| 911 | printf("\t\tmaxMemoryAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxMemoryAllocationCount ); |
| Chia-I Wu | 64a9b66 | 2015-10-31 00:31:16 +0800 | [diff] [blame] | 912 | printf("\t\tmaxSamplerAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxSamplerAllocationCount ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 913 | printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); |
| Tony Barbour | a0258a5 | 2015-10-27 11:01:20 -0600 | [diff] [blame] | 914 | printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 915 | printf("\t\tmaxBoundDescriptorSets = 0x%" PRIxLEAST32 "\n", limits->maxBoundDescriptorSets ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 916 | printf("\t\tmaxPerStageDescriptorSamplers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSamplers ); |
| 917 | printf("\t\tmaxPerStageDescriptorUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorUniformBuffers ); |
| 918 | printf("\t\tmaxPerStageDescriptorStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageBuffers ); |
| 919 | printf("\t\tmaxPerStageDescriptorSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSampledImages ); |
| 920 | printf("\t\tmaxPerStageDescriptorStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageImages ); |
| Chia-I Wu | 31bba40 | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 921 | printf("\t\tmaxPerStageDescriptorInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorInputAttachments ); |
| Chia-I Wu | 076be29 | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 922 | printf("\t\tmaxPerStageResources = 0x%" PRIxLEAST32 "\n", limits->maxPerStageResources ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 923 | printf("\t\tmaxDescriptorSetSamplers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSamplers ); |
| 924 | printf("\t\tmaxDescriptorSetUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffers ); |
| Tony Barbour | a0258a5 | 2015-10-27 11:01:20 -0600 | [diff] [blame] | 925 | printf("\t\tmaxDescriptorSetUniformBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffersDynamic ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 926 | printf("\t\tmaxDescriptorSetStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffers ); |
| Tony Barbour | a0258a5 | 2015-10-27 11:01:20 -0600 | [diff] [blame] | 927 | printf("\t\tmaxDescriptorSetStorageBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffersDynamic ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 928 | printf("\t\tmaxDescriptorSetSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSampledImages ); |
| 929 | printf("\t\tmaxDescriptorSetStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageImages ); |
| Chia-I Wu | 31bba40 | 2015-11-06 06:42:02 +0800 | [diff] [blame] | 930 | printf("\t\tmaxDescriptorSetInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetInputAttachments ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 931 | printf("\t\tmaxVertexInputAttributes = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributes ); |
| Tony Barbour | a0258a5 | 2015-10-27 11:01:20 -0600 | [diff] [blame] | 932 | printf("\t\tmaxVertexInputBindings = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindings ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 933 | printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); |
| 934 | printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); |
| 935 | printf("\t\tmaxVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxVertexOutputComponents ); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 936 | printf("\t\tmaxTessellationGenerationLevel = 0x%" PRIxLEAST32 "\n", limits->maxTessellationGenerationLevel ); |
| Courtney Goeltzenleuchter | c6fd226 | 2015-10-15 17:35:38 -0600 | [diff] [blame] | 937 | printf("\t\tmaxTessellationPatchSize = 0x%" PRIxLEAST32 "\n", limits->maxTessellationPatchSize ); |
| 938 | printf("\t\tmaxTessellationControlPerVertexInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexInputComponents ); |
| 939 | printf("\t\tmaxTessellationControlPerVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexOutputComponents); |
| 940 | printf("\t\tmaxTessellationControlPerPatchOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerPatchOutputComponents ); |
| 941 | printf("\t\tmaxTessellationControlTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlTotalOutputComponents ); |
| 942 | printf("\t\tmaxTessellationEvaluationInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationInputComponents ); |
| 943 | printf("\t\tmaxTessellationEvaluationOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationOutputComponents ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 944 | printf("\t\tmaxGeometryShaderInvocations = 0x%" PRIxLEAST32 "\n", limits->maxGeometryShaderInvocations ); |
| 945 | printf("\t\tmaxGeometryInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryInputComponents ); |
| 946 | printf("\t\tmaxGeometryOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputComponents ); |
| 947 | printf("\t\tmaxGeometryOutputVertices = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputVertices ); |
| 948 | printf("\t\tmaxGeometryTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryTotalOutputComponents ); |
| 949 | printf("\t\tmaxFragmentInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxFragmentInputComponents ); |
| Chia-I Wu | c04519c | 2015-10-27 17:53:18 +0800 | [diff] [blame] | 950 | printf("\t\tmaxFragmentOutputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentOutputAttachments ); |
| 951 | printf("\t\tmaxFragmentDualSrcAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentDualSrcAttachments ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 952 | printf("\t\tmaxFragmentCombinedOutputResources = 0x%" PRIxLEAST32 "\n", limits->maxFragmentCombinedOutputResources ); |
| 953 | printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); |
| 954 | printf("\t\tmaxComputeWorkGroupCount[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[0] ); |
| 955 | printf("\t\tmaxComputeWorkGroupCount[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[1] ); |
| 956 | printf("\t\tmaxComputeWorkGroupCount[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[2] ); |
| 957 | printf("\t\tmaxComputeWorkGroupInvocations = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupInvocations ); |
| 958 | printf("\t\tmaxComputeWorkGroupSize[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[0] ); |
| 959 | printf("\t\tmaxComputeWorkGroupSize[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[1] ); |
| 960 | printf("\t\tmaxComputeWorkGroupSize[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[2] ); |
| 961 | printf("\t\tsubPixelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subPixelPrecisionBits ); |
| 962 | printf("\t\tsubTexelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subTexelPrecisionBits ); |
| 963 | printf("\t\tmipmapPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->mipmapPrecisionBits ); |
| 964 | printf("\t\tmaxDrawIndexedIndexValue = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndexedIndexValue ); |
| Chia-I Wu | 8ca320f | 2015-11-06 10:29:05 +0800 | [diff] [blame] | 965 | printf("\t\tmaxDrawIndirectCount = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndirectCount ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 966 | printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); |
| 967 | printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); |
| 968 | printf("\t\tmaxViewports = 0x%" PRIxLEAST32 "\n", limits->maxViewports ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 969 | printf("\t\tmaxViewportDimensions[0] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[0] ); |
| 970 | printf("\t\tmaxViewportDimensions[1] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[1] ); |
| 971 | printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] ); |
| 972 | printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] ); |
| 973 | printf("\t\tviewportSubPixelBits = 0x%" PRIxLEAST32 "\n", limits->viewportSubPixelBits ); |
| Chia-I Wu | 3ffcd73 | 2015-10-26 17:08:33 +0800 | [diff] [blame] | 974 | printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); |
| 975 | printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); |
| 976 | printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); |
| 977 | printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 978 | printf("\t\tminTexelOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset ); |
| 979 | printf("\t\tmaxTexelOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset ); |
| 980 | printf("\t\tminTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset ); |
| 981 | printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset ); |
| 982 | printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset ); |
| 983 | printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset ); |
| 984 | printf("\t\tsubPixelInterpolationOffsetBits = 0x%" PRIxLEAST32 "\n", limits->subPixelInterpolationOffsetBits ); |
| 985 | printf("\t\tmaxFramebufferWidth = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferWidth ); |
| 986 | printf("\t\tmaxFramebufferHeight = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferHeight ); |
| 987 | printf("\t\tmaxFramebufferLayers = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferLayers ); |
| Chia-I Wu | 3138d6a | 2015-10-31 00:31:16 +0800 | [diff] [blame] | 988 | printf("\t\tframebufferColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferColorSampleCounts ); |
| 989 | printf("\t\tframebufferDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferDepthSampleCounts ); |
| 990 | printf("\t\tframebufferStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferStencilSampleCounts ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 991 | printf("\t\tmaxColorAttachments = 0x%" PRIxLEAST32 "\n", limits->maxColorAttachments ); |
| Chia-I Wu | 3138d6a | 2015-10-31 00:31:16 +0800 | [diff] [blame] | 992 | printf("\t\tsampledImageColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageColorSampleCounts ); |
| 993 | printf("\t\tsampledImageDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageDepthSampleCounts ); |
| 994 | printf("\t\tsampledImageStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageStencilSampleCounts ); |
| 995 | printf("\t\tsampledImageIntegerSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageIntegerSampleCounts ); |
| 996 | printf("\t\tstorageImageSampleCounts = 0x%" PRIxLEAST32 "\n", limits->storageImageSampleCounts ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 997 | printf("\t\tmaxSampleMaskWords = 0x%" PRIxLEAST32 "\n", limits->maxSampleMaskWords ); |
| Jon Ashburn | fef7f08 | 2015-12-29 14:57:48 -0700 | [diff] [blame] | 998 | printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); |
| Chia-I Wu | c789f69 | 2015-10-26 19:27:21 +0800 | [diff] [blame] | 999 | printf("\t\ttimestampPeriod = 0x%f\n", limits->timestampPeriod ); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 1000 | printf("\t\tmaxClipDistances = 0x%" PRIxLEAST32 "\n", limits->maxClipDistances ); |
| 1001 | printf("\t\tmaxCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCullDistances ); |
| 1002 | printf("\t\tmaxCombinedClipAndCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCombinedClipAndCullDistances ); |
| 1003 | printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); |
| 1004 | printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); |
| 1005 | printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); |
| 1006 | printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] ); |
| 1007 | printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity ); |
| 1008 | printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity ); |
| Chia-I Wu | 3c33210 | 2015-10-26 16:47:26 +0800 | [diff] [blame] | 1009 | printf("\t\tstrictLines = %u\n", limits->strictLines ); |
| Chia-I Wu | a3939fc | 2015-10-31 00:31:16 +0800 | [diff] [blame] | 1010 | printf("\t\tstandardSampleLocations = %u\n", limits->standardSampleLocations ); |
| Chia-I Wu | ee0eaa1 | 2015-11-06 10:37:51 +0800 | [diff] [blame] | 1011 | printf("\t\toptimalBufferCopyOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyOffsetAlignment ); |
| 1012 | printf("\t\toptimalBufferCopyRowPitchAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyRowPitchAlignment ); |
| 1013 | printf("\t\tnonCoherentAtomSize = 0x%" PRIxLEAST64 "\n", limits->nonCoherentAtomSize ); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1014 | } |
| 1015 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1016 | static void app_gpu_dump_props(const struct app_gpu *gpu) |
| 1017 | { |
| 1018 | const VkPhysicalDeviceProperties *props = &gpu->props; |
| 1019 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1020 | printf("VkPhysicalDeviceProperties:\n"); |
| 1021 | printf("===========================\n"); |
| 1022 | printf("\tapiVersion = %u\n", props->apiVersion); |
| 1023 | printf("\tdriverVersion = %u\n", props->driverVersion); |
| Chia-I Wu | d3f9934 | 2015-10-27 18:58:00 +0800 | [diff] [blame] | 1024 | printf("\tvendorID = 0x%04x\n", props->vendorID); |
| 1025 | printf("\tdeviceID = 0x%04x\n", props->deviceID); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1026 | printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); |
| 1027 | printf("\tdeviceName = %s\n", props->deviceName); |
| Mark Lobodzinski | 7dae686 | 2015-09-07 12:56:17 -0600 | [diff] [blame] | 1028 | |
| 1029 | app_dump_limits(&gpu->props.limits); |
| 1030 | app_dump_sparse_props(&gpu->props.sparseProperties); |
| 1031 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1032 | fflush(stdout); |
| 1033 | } |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1034 | // clang-format on |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1035 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1036 | static void |
| 1037 | app_dump_extensions(const char *indent, const char *layer_name, |
| 1038 | const uint32_t extension_count, |
| 1039 | const VkExtensionProperties *extension_properties) { |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1040 | uint32_t i; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1041 | if (layer_name && (strlen(layer_name) > 0)) { |
| 1042 | printf("%s%s Extensions", indent, layer_name); |
| 1043 | } else { |
| 1044 | printf("Extensions"); |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1045 | } |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1046 | printf("\tcount = %d\n", extension_count); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1047 | for (i = 0; i < extension_count; i++) { |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1048 | VkExtensionProperties const *ext_prop = &extension_properties[i]; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1049 | |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1050 | printf("%s\t", indent); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1051 | printf("%-32s: extension revision %2d\n", ext_prop->extensionName, |
| 1052 | ext_prop->specVersion); |
| Courtney Goeltzenleuchter | ff87c82 | 2014-10-03 18:05:10 -0600 | [diff] [blame] | 1053 | } |
| 1054 | printf("\n"); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1055 | fflush(stdout); |
| Courtney Goeltzenleuchter | ff87c82 | 2014-10-03 18:05:10 -0600 | [diff] [blame] | 1056 | } |
| 1057 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1058 | static void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) { |
| Cody Northrop | ef72e2a | 2015-08-03 17:04:53 -0600 | [diff] [blame] | 1059 | const VkQueueFamilyProperties *props = &gpu->queue_props[id]; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1060 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1061 | printf("VkQueueFamilyProperties[%d]:\n", id); |
| 1062 | printf("============================\n"); |
| Chia-I Wu | b21a51a | 2015-10-26 20:33:12 +0800 | [diff] [blame] | 1063 | printf("\tqueueFlags = %c%c%c\n", |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1064 | (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', |
| 1065 | (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.', |
| 1066 | (props->queueFlags & VK_QUEUE_TRANSFER_BIT) ? 'D' : '.'); |
| 1067 | printf("\tqueueCount = %u\n", props->queueCount); |
| 1068 | printf("\ttimestampValidBits = %u\n", props->timestampValidBits); |
| Chia-I Wu | 0339bc5 | 2015-10-27 18:58:24 +0800 | [diff] [blame] | 1069 | printf("\tminImageTransferGranularity = (%d, %d, %d)\n", |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1070 | props->minImageTransferGranularity.width, |
| 1071 | props->minImageTransferGranularity.height, |
| 1072 | props->minImageTransferGranularity.depth); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1073 | fflush(stdout); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1074 | } |
| 1075 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1076 | static void app_gpu_dump_memory_props(const struct app_gpu *gpu) { |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 1077 | const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1078 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1079 | printf("VkPhysicalDeviceMemoryProperties:\n"); |
| 1080 | printf("=================================\n"); |
| 1081 | printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); |
| Mark Lobodzinski | 7234629 | 2015-07-02 16:49:40 -0600 | [diff] [blame] | 1082 | for (uint32_t i = 0; i < props->memoryTypeCount; i++) { |
| 1083 | printf("\tmemoryTypes[%u] : \n", i); |
| 1084 | printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags); |
| 1085 | printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); |
| 1086 | } |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1087 | printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); |
| Mark Lobodzinski | 7234629 | 2015-07-02 16:49:40 -0600 | [diff] [blame] | 1088 | for (uint32_t i = 0; i < props->memoryHeapCount; i++) { |
| 1089 | printf("\tmemoryHeaps[%u] : \n", i); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1090 | printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", |
| 1091 | (size_t)props->memoryHeaps[i].size); |
| Mark Lobodzinski | 7234629 | 2015-07-02 16:49:40 -0600 | [diff] [blame] | 1092 | } |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1093 | fflush(stdout); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1094 | } |
| 1095 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1096 | static void app_gpu_dump(const struct app_gpu *gpu) { |
| Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 1097 | uint32_t i; |
| Chia-I Wu | f5c46f4 | 2014-08-05 15:33:40 +0800 | [diff] [blame] | 1098 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1099 | printf("Device Extensions and layers:\n"); |
| 1100 | printf("=============================\n"); |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1101 | printf("GPU%u\n", gpu->id); |
| 1102 | app_gpu_dump_props(gpu); |
| 1103 | printf("\n"); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1104 | app_dump_extensions("", "Device", gpu->device_extension_count, |
| 1105 | gpu->device_extensions); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1106 | printf("\n"); |
| 1107 | printf("Layers\tcount = %d\n", gpu->device_layer_count); |
| 1108 | for (uint32_t i = 0; i < gpu->device_layer_count; i++) { |
| 1109 | uint32_t major, minor, patch; |
| 1110 | char spec_version[64], layer_version[64]; |
| 1111 | struct layer_extension_list const *layer_info = &gpu->device_layers[i]; |
| 1112 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1113 | extract_version(layer_info->layer_properties.specVersion, &major, |
| 1114 | &minor, &patch); |
| 1115 | snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, |
| 1116 | patch); |
| 1117 | snprintf(layer_version, sizeof(layer_version), "%d", |
| 1118 | layer_info->layer_properties.implementationVersion); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1119 | printf("\t%s (%s) Vulkan version %s, layer version %s\n", |
| 1120 | layer_info->layer_properties.layerName, |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1121 | (char *)layer_info->layer_properties.description, spec_version, |
| 1122 | layer_version); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1123 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1124 | app_dump_extensions("\t", layer_info->layer_properties.layerName, |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1125 | layer_info->extension_count, |
| 1126 | layer_info->extension_properties); |
| 1127 | fflush(stdout); |
| 1128 | } |
| Courtney Goeltzenleuchter | ff87c82 | 2014-10-03 18:05:10 -0600 | [diff] [blame] | 1129 | printf("\n"); |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1130 | for (i = 0; i < gpu->queue_count; i++) { |
| 1131 | app_gpu_dump_queue_props(gpu, i); |
| 1132 | printf("\n"); |
| 1133 | } |
| 1134 | app_gpu_dump_memory_props(gpu); |
| 1135 | printf("\n"); |
| Chris Forbes | a048b31 | 2015-06-21 20:09:12 +1200 | [diff] [blame] | 1136 | app_gpu_dump_features(gpu); |
| 1137 | printf("\n"); |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1138 | app_dev_dump(&gpu->dev); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1139 | } |
| 1140 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1141 | int main(int argc, char **argv) { |
| David Pinedo | 7b4e9ec | 2015-10-19 15:22:28 -0600 | [diff] [blame] | 1142 | unsigned int major, minor, patch; |
| 1143 | struct app_gpu gpus[MAX_GPUS]; |
| Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 1144 | VkPhysicalDevice objs[MAX_GPUS]; |
| Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 1145 | uint32_t gpu_count, i; |
| Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 1146 | VkResult err; |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1147 | struct app_instance inst; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1148 | |
| David Pinedo | 7b4e9ec | 2015-10-19 15:22:28 -0600 | [diff] [blame] | 1149 | major = VK_API_VERSION >> 22; |
| Mark Lobodzinski | ab5e3be | 2016-01-13 10:36:44 -0700 | [diff] [blame] | 1150 | minor = (VK_API_VERSION >> 12) & 0x3ff; |
| David Pinedo | 7b4e9ec | 2015-10-19 15:22:28 -0600 | [diff] [blame] | 1151 | patch = VK_API_VERSION & 0xfff; |
| 1152 | printf("===========\n"); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1153 | printf("VULKAN INFO\n"); |
| David Pinedo | b5ec4c2 | 2015-10-19 15:15:34 -0600 | [diff] [blame] | 1154 | printf("===========\n\n"); |
| Mark Lobodzinski | ab5e3be | 2016-01-13 10:36:44 -0700 | [diff] [blame] | 1155 | printf("Vulkan API Version: %d.%d.%d\n\n", major, minor, patch); |
| David Pinedo | b5ec4c2 | 2015-10-19 15:15:34 -0600 | [diff] [blame] | 1156 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1157 | app_create_instance(&inst); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1158 | |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1159 | printf("Instance Extensions and layers:\n"); |
| 1160 | printf("===============================\n"); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1161 | app_dump_extensions("", "Instance", inst.global_extension_count, |
| 1162 | inst.global_extensions); |
| Mark Lobodzinski | 825cc51 | 2015-08-14 10:30:30 -0600 | [diff] [blame] | 1163 | |
| 1164 | printf("Instance Layers\tcount = %d\n", inst.global_layer_count); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1165 | for (uint32_t i = 0; i < inst.global_layer_count; i++) { |
| 1166 | uint32_t major, minor, patch; |
| 1167 | char spec_version[64], layer_version[64]; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1168 | VkLayerProperties const *layer_prop = |
| 1169 | &inst.global_layers[i].layer_properties; |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1170 | |
| 1171 | extract_version(layer_prop->specVersion, &major, &minor, &patch); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1172 | snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", major, minor, |
| 1173 | patch); |
| 1174 | snprintf(layer_version, sizeof(layer_version), "%d", |
| 1175 | layer_prop->implementationVersion); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1176 | printf("\t%s (%s) Vulkan version %s, layer version %s\n", |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1177 | layer_prop->layerName, (char *)layer_prop->description, |
| 1178 | spec_version, layer_version); |
| Courtney Goeltzenleuchter | 18061cd | 2015-06-29 15:39:26 -0600 | [diff] [blame] | 1179 | |
| 1180 | app_dump_extensions("\t", |
| 1181 | inst.global_layers[i].layer_properties.layerName, |
| 1182 | inst.global_layers[i].extension_count, |
| 1183 | inst.global_layers[i].extension_properties); |
| 1184 | } |
| Jon Ashburn | 29669a4 | 2015-04-04 14:52:07 -0600 | [diff] [blame] | 1185 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1186 | err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); |
| Jon Ashburn | 07b309a | 2015-04-15 11:31:12 -0600 | [diff] [blame] | 1187 | if (err) |
| 1188 | ERR_EXIT(err); |
| 1189 | if (gpu_count > MAX_GPUS) { |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1190 | printf("Too many GPUS found \n"); |
| Courtney Goeltzenleuchter | ac544f3 | 2015-09-14 18:01:17 -0600 | [diff] [blame] | 1191 | ERR_EXIT(-1); |
| Jon Ashburn | 07b309a | 2015-04-15 11:31:12 -0600 | [diff] [blame] | 1192 | } |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1193 | err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1194 | if (err) |
| 1195 | ERR_EXIT(err); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1196 | |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1197 | for (i = 0; i < gpu_count; i++) { |
| 1198 | app_gpu_init(&gpus[i], i, objs[i]); |
| 1199 | app_gpu_dump(&gpus[i]); |
| 1200 | printf("\n\n"); |
| 1201 | } |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1202 | |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1203 | for (i = 0; i < gpu_count; i++) |
| 1204 | app_gpu_destroy(&gpus[i]); |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1205 | |
| Courtney Goeltzenleuchter | 3c1ccf5 | 2015-06-04 16:20:06 -0600 | [diff] [blame] | 1206 | app_destroy_instance(&inst); |
| Chia-I Wu | 0b9a737 | 2014-08-06 12:09:19 +0800 | [diff] [blame] | 1207 | |
| Chia-I Wu | 190ebdc | 2014-08-06 12:04:13 +0800 | [diff] [blame] | 1208 | return 0; |
| Chia-I Wu | d4bae36 | 2014-07-29 11:15:00 +0800 | [diff] [blame] | 1209 | } |
| Ian Elliott | ea95f5c | 2015-04-17 21:23:34 -0600 | [diff] [blame] | 1210 | |
| 1211 | #ifdef _WIN32 |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1212 | |
| 1213 | // Create a console window with a large scrollback size to which to send stdout. |
| 1214 | // Returns true if console window was successfully created, false otherwise. |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1215 | bool SetStdOutToNewConsole() { |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1216 | // don't do anything if we already have a console |
| 1217 | if (GetStdHandle(STD_OUTPUT_HANDLE)) |
| 1218 | return false; |
| 1219 | |
| 1220 | // allocate a console for this app |
| 1221 | AllocConsole(); |
| 1222 | |
| 1223 | // redirect unbuffered STDOUT to the console |
| 1224 | HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); |
| 1225 | int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT); |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1226 | FILE *fp = _fdopen(fileDescriptor, "w"); |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1227 | *stdout = *fp; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1228 | setvbuf(stdout, NULL, _IONBF, 0); |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1229 | |
| 1230 | // make the console window bigger |
| 1231 | CONSOLE_SCREEN_BUFFER_INFO csbi; |
| 1232 | SMALL_RECT r; |
| 1233 | COORD bufferSize; |
| 1234 | if (!GetConsoleScreenBufferInfo(consoleHandle, &csbi)) |
| 1235 | return false; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1236 | bufferSize.X = csbi.dwSize.X + 30; |
| David Pinedo | e1b115f | 2015-10-02 16:49:43 -0600 | [diff] [blame] | 1237 | bufferSize.Y = 20000; |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1238 | if (!SetConsoleScreenBufferSize(consoleHandle, bufferSize)) |
| 1239 | return false; |
| 1240 | r.Left = r.Top = 0; |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1241 | r.Right = csbi.dwSize.X - 1 + 30; |
| David Pinedo | 3bf020c | 2015-09-29 16:56:02 -0600 | [diff] [blame] | 1242 | r.Bottom = 50; |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1243 | if (!SetConsoleWindowInfo(consoleHandle, true, &r)) |
| 1244 | return false; |
| 1245 | |
| 1246 | // change the console window title |
| Ian Elliott | 4e19ed0 | 2015-04-28 10:52:52 -0600 | [diff] [blame] | 1247 | if (!SetConsoleTitle(TEXT(APP_SHORT_NAME))) |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1248 | return false; |
| 1249 | |
| 1250 | return true; |
| 1251 | } |
| 1252 | |
| Karl Schultz | 481756e | 2016-02-02 15:37:51 -0700 | [diff] [blame] | 1253 | int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, |
| 1254 | int nCmdShow) { |
| Ian Elliott | ea95f5c | 2015-04-17 21:23:34 -0600 | [diff] [blame] | 1255 | char *argv = pCmdLine; |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1256 | consoleCreated = SetStdOutToNewConsole(); |
| Ian Elliott | ea95f5c | 2015-04-17 21:23:34 -0600 | [diff] [blame] | 1257 | main(1, &argv); |
| 1258 | fflush(stdout); |
| David Pinedo | 18fb923 | 2015-04-21 14:45:16 -0600 | [diff] [blame] | 1259 | if (consoleCreated) |
| 1260 | Sleep(INFINITE); |
| Ian Elliott | ea95f5c | 2015-04-17 21:23:34 -0600 | [diff] [blame] | 1261 | } |
| 1262 | #endif |