vulkaninfo.c revision 5d8d6b4f93daceacca1de36be6de935a8264caf6
146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu/* 2481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 The Khronos Group Inc. 3481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 Valve Corporation 4481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz * Copyright (c) 2015-2016 LunarG, Inc. 546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License"); 743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License. 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at 946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * http://www.apache.org/licenses/LICENSE-2.0 1146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu * 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software 1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS, 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License. 1796cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * 1896cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> 1996cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: David Pinedo <david@lunarg.com> 2096cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Mark Lobodzinski <mark@lunarg.com> 21a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay * Author: Rene Lindsay <rene@lunarg.com> 225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager * Author: Jeremy Kniager <jeremyk@lunarg.com> 2346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu */ 24bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 25bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#ifdef __GNUC__ 26bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#ifndef _POSIX_C_SOURCE 27bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define _POSIX_C_SOURCE 200809L 28bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#endif 29bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#else 30bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define strndup(p, n) strdup(p) 31bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#endif 32bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 3346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#include <assert.h> 34825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski#include <inttypes.h> 357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdbool.h> 367fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdio.h> 377fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <stdlib.h> 387fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#include <string.h> 39d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 40ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#ifdef _WIN32 4118fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <fcntl.h> 4218fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#include <io.h> 43cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#endif // _WIN32 4464070a88a7a4411e0eb0d7148bd1a1598e74a88cIan Elliott 45787b627282489b56b4ed111f152008fe66d33488Mun Gwan-gyeong#if defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR) 46a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#include <X11/Xutil.h> 47a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 48a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 490394191ea288611bb919194d46fde101947df54aTony Barbour#if defined(VK_USE_PLATFORM_MIR_KHR) 500394191ea288611bb919194d46fde101947df54aTony Barbour#warning "Vulkaninfo does not have code for Mir at this time" 510394191ea288611bb919194d46fde101947df54aTony Barbour#endif 520394191ea288611bb919194d46fde101947df54aTony Barbour 53329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vulkan.h> 5446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 55bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski#define ERR(err) printf("%s:%d: failed with %s\n", __FILE__, __LINE__, VkResultString(err)); 5646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 5718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#ifdef _WIN32 5818fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 597c83aa210365e148877f0f3698292a1b509018ffIan Elliott#define snprintf _snprintf 60bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define strdup _strdup 617c83aa210365e148877f0f3698292a1b509018ffIan Elliott 62a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Returns nonzero if the console is used only for this process. Will return 63a3b7170656404199592bb65040621772f299a7f3Hugo Landau// zero if another process (such as cmd.exe) is also attached. 64a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic int ConsoleIsExclusive(void) { 65a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD pids[2]; 66a3b7170656404199592bb65040621772f299a7f3Hugo Landau DWORD num_pids = GetConsoleProcessList(pids, ARRAYSIZE(pids)); 67a3b7170656404199592bb65040621772f299a7f3Hugo Landau return num_pids <= 1; 68a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 6918fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 70cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define WAIT_FOR_CONSOLE_DESTROY \ 71cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 72cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) Sleep(INFINITE); \ 7318fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo } while (0) 7418fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#else 75481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz#define WAIT_FOR_CONSOLE_DESTROY 7618fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo#endif 7718fb9239e51c9449fa072e3a398a55777f5c3c62David Pinedo 78cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define ERR_EXIT(err) \ 79cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 80cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ERR(err); \ 81cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski fflush(stdout); \ 82cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski WAIT_FOR_CONSOLE_DESTROY; \ 83cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski exit(-1); \ 84481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 8546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 8622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 8722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 8822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 8922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 9022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 9122a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 9246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 9346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#define MAX_QUEUE_TYPES 5 954e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "vulkaninfo" 9646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic const VkFormat format_check_list[] = {VK_FORMAT_UNDEFINED, 985d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R4G4_UNORM_PACK8, 995d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R4G4B4A4_UNORM_PACK16, 1005d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B4G4R4A4_UNORM_PACK16, 1015d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R5G6B5_UNORM_PACK16, 1025d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B5G6R5_UNORM_PACK16, 1035d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R5G5B5A1_UNORM_PACK16, 1045d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B5G5R5A1_UNORM_PACK16, 1055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A1R5G5B5_UNORM_PACK16, 1065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_UNORM, 1075d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_SNORM, 1085d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_USCALED, 1095d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_SSCALED, 1105d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_UINT, 1115d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_SINT, 1125d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8_SRGB, 1135d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_UNORM, 1145d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_SNORM, 1155d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_USCALED, 1165d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_SSCALED, 1175d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_UINT, 1185d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_SINT, 1195d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8_SRGB, 1205d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_UNORM, 1215d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_SNORM, 1225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_USCALED, 1235d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_SSCALED, 1245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_UINT, 1255d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_SINT, 1265d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8_SRGB, 1275d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_UNORM, 1285d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_SNORM, 1295d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_USCALED, 1305d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_SSCALED, 1315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_UINT, 1325d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_SINT, 1335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8_SRGB, 1345d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_UNORM, 1355d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_SNORM, 1365d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_USCALED, 1375d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_SSCALED, 1385d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_UINT, 1395d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_SINT, 1405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R8G8B8A8_SRGB, 1415d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_UNORM, 1425d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_SNORM, 1435d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_USCALED, 1445d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_SSCALED, 1455d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_UINT, 1465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_SINT, 1475d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B8G8R8A8_SRGB, 1485d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_UNORM_PACK32, 1495d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_SNORM_PACK32, 1505d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_USCALED_PACK32, 1515d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_SSCALED_PACK32, 1525d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_UINT_PACK32, 1535d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_SINT_PACK32, 1545d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A8B8G8R8_SRGB_PACK32, 1555d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_UNORM_PACK32, 1565d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_SNORM_PACK32, 1575d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_USCALED_PACK32, 1585d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_SSCALED_PACK32, 1595d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_UINT_PACK32, 1605d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2R10G10B10_SINT_PACK32, 1615d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_UNORM_PACK32, 1625d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_SNORM_PACK32, 1635d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_USCALED_PACK32, 1645d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_SSCALED_PACK32, 1655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_UINT_PACK32, 1665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_A2B10G10R10_SINT_PACK32, 1675d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_UNORM, 1685d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_SNORM, 1695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_USCALED, 1705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_SSCALED, 1715d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_UINT, 1725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_SINT, 1735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16_SFLOAT, 1745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_UNORM, 1755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_SNORM, 1765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_USCALED, 1775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_SSCALED, 1785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_UINT, 1795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_SINT, 1805d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16_SFLOAT, 1815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_UNORM, 1825d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_SNORM, 1835d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_USCALED, 1845d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_SSCALED, 1855d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_UINT, 1865d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_SINT, 1875d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16_SFLOAT, 1885d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_UNORM, 1895d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_SNORM, 1905d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_USCALED, 1915d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_SSCALED, 1925d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_UINT, 1935d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_SINT, 1945d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R16G16B16A16_SFLOAT, 1955d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32_UINT, 1965d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32_SINT, 1975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32_SFLOAT, 1985d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32_UINT, 1995d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32_SINT, 2005d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32_SFLOAT, 2015d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32_UINT, 2025d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32_SINT, 2035d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32_SFLOAT, 2045d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32A32_UINT, 2055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32A32_SINT, 2065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R32G32B32A32_SFLOAT, 2075d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64_UINT, 2085d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64_SINT, 2095d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64_SFLOAT, 2105d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64_UINT, 2115d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64_SINT, 2125d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64_SFLOAT, 2135d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64_UINT, 2145d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64_SINT, 2155d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64_SFLOAT, 2165d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64A64_UINT, 2175d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64A64_SINT, 2185d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_R64G64B64A64_SFLOAT, 2195d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_B10G11R11_UFLOAT_PACK32, 2205d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, 2215d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_D16_UNORM, 2225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_X8_D24_UNORM_PACK32, 2235d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_D32_SFLOAT, 2245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_S8_UINT, 2255d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_D16_UNORM_S8_UINT, 2265d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_D24_UNORM_S8_UINT, 2275d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_D32_SFLOAT_S8_UINT, 2285d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC1_RGB_UNORM_BLOCK, 2295d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC1_RGB_SRGB_BLOCK, 2305d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 2315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC1_RGBA_SRGB_BLOCK, 2325d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC2_UNORM_BLOCK, 2335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC2_SRGB_BLOCK, 2345d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC3_UNORM_BLOCK, 2355d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC3_SRGB_BLOCK, 2365d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC4_UNORM_BLOCK, 2375d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC4_SNORM_BLOCK, 2385d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC5_UNORM_BLOCK, 2395d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC5_SNORM_BLOCK, 2405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC6H_UFLOAT_BLOCK, 2415d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC6H_SFLOAT_BLOCK, 2425d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC7_UNORM_BLOCK, 2435d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_BC7_SRGB_BLOCK, 2445d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, 2455d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, 2465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, 2475d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, 2485d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, 2495d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, 2505d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_EAC_R11_UNORM_BLOCK, 2515d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_EAC_R11_SNORM_BLOCK, 2525d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_EAC_R11G11_UNORM_BLOCK, 2535d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_EAC_R11G11_SNORM_BLOCK, 2545d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_4x4_UNORM_BLOCK, 2555d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_4x4_SRGB_BLOCK, 2565d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_5x4_UNORM_BLOCK, 2575d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_5x4_SRGB_BLOCK, 2585d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_5x5_UNORM_BLOCK, 2595d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_5x5_SRGB_BLOCK, 2605d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_6x5_UNORM_BLOCK, 2615d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_6x5_SRGB_BLOCK, 2625d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_6x6_UNORM_BLOCK, 2635d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_6x6_SRGB_BLOCK, 2645d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x5_UNORM_BLOCK, 2655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x5_SRGB_BLOCK, 2665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x6_UNORM_BLOCK, 2675d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x6_SRGB_BLOCK, 2685d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x8_UNORM_BLOCK, 2695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_8x8_SRGB_BLOCK, 2705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x5_UNORM_BLOCK, 2715d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x5_SRGB_BLOCK, 2725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x6_UNORM_BLOCK, 2735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x6_SRGB_BLOCK, 2745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x8_UNORM_BLOCK, 2755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x8_SRGB_BLOCK, 2765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x10_UNORM_BLOCK, 2775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_10x10_SRGB_BLOCK, 2785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_12x10_UNORM_BLOCK, 2795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_12x10_SRGB_BLOCK, 2805d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_12x12_UNORM_BLOCK, 2815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_ASTC_12x12_SRGB_BLOCK, 2825d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, 2835d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, 2845d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, 2855d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, 2865d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, 2875d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, 2885d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, 2895d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG}; 2905d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 2915d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic const uint32_t format_check_list_count = ARRAY_SIZE(format_check_list); 2925d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 2935d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstruct VkStructureHeader { 2945d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkStructureType sType; 2955d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager void *pNext; 2965d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager}; 2975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 298f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppGpu; 29946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 300f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppDev { 301f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppGpu *gpu; /* point back to the GPU */ 30246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 303382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice obj; 30446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 3055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkFormatProperties format_props[ARRAY_SIZE(format_check_list)]; 3065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkFormatProperties2KHR format_props2[ARRAY_SIZE(format_check_list)]; 30746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 30846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 309f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct LayerExtensionList { 31018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkLayerProperties layer_properties; 31118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t extension_count; 31218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *extension_properties; 31318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter}; 31418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 315f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppInstance { 316481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkInstance instance; 31718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t global_layer_count; 318f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *global_layers; 3193c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t global_extension_count; 320cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski VkExtensionProperties *global_extensions; // Instance Extensions 321a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 3225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager const char **inst_extensions; 3235d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager uint32_t inst_extensions_count; 3245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 325bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; 326bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; 327bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; 328bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; 3295d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; 3305d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR; 3315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR; 3325d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; 3335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR; 3345d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR; 3355d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT; 3365d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 3375d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkSurfaceCapabilitiesKHR surface_capabilities; 3385d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkSurfaceCapabilities2KHR surface_capabilities2; 3395d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkSharedPresentSurfaceCapabilitiesKHR shared_surface_capabilities; 3405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkSurfaceCapabilities2EXT surface_capabilities2_ext; 341a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 342a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkSurfaceKHR surface; 343a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int width, height; 344a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 345a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 346cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HINSTANCE h_instance; // Windows Instance 347cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HWND h_wnd; // window handle 348b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 3497fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_connection_t *xcb_connection; 3507fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_screen_t *xcb_screen; 3517fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay xcb_window_t xcb_window; 352b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 3537fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Display *xlib_display; 3547fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay Window xlib_window; 355cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#elif VK_USE_PLATFORM_ANDROID_KHR // TODO 3567fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay ANativeWindow *window; 357a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 3583c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter}; 3593c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 360f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstruct AppGpu { 361e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t id; 3628205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice obj; 36346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 3648205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceProperties props; 3655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkPhysicalDeviceProperties2KHR props2; 36646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 367e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t queue_count; 368ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop VkQueueFamilyProperties *queue_props; 3695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkQueueFamilyProperties2KHR *queue_props2; 370ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceQueueCreateInfo *queue_reqs; 37146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 3725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager struct AppInstance *inst; 3735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 3748205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDeviceMemoryProperties memory_props; 3755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkPhysicalDeviceMemoryProperties2KHR memory_props2; 3765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 377a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes VkPhysicalDeviceFeatures features; 3785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkPhysicalDeviceFeatures2KHR features2; 3797dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski VkPhysicalDevice limits; 38046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 3813c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t device_extension_count; 3823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkExtensionProperties *device_extensions; 38346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 384f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppDev dev; 38546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu}; 38646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 387bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic VKAPI_ATTR VkBool32 VKAPI_CALL DbgCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, 388bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg, 389bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski void *pUserData) { 390481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz char *message = (char *)malloc(strlen(pMsg) + 100); 391f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 392481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz assert(message); 393f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 394acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 395bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 3965c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 397bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 3985c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski } else if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 399bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "INFO: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 400acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 401bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 402f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter } 403f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 404481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%s\n", message); 405f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter fflush(stdout); 406f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter free(message); 407f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 408f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter /* 409f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * false indicates that layer should not bail-out of an 410f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * API call that had validation failures. This may mean that the 411f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * app dies inside the driver due to invalid parameter(s). 412f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * That's what would happen without validation layers, so we'll 413f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter * keep that behavior here. 414f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter */ 415f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter return false; 416f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter} 417f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 418f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkResultString(VkResult err) { 41946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu switch (err) { 420cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 421cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case r: \ 422481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 423481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_SUCCESS); 424481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_NOT_READY); 425481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_TIMEOUT); 426481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_SET); 427481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_EVENT_RESET); 428481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INITIALIZATION_FAILED); 429481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_HOST_MEMORY); 430481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 431481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_DEVICE_LOST); 432481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_LAYER_NOT_PRESENT); 433481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_EXTENSION_NOT_PRESENT); 434481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_MEMORY_MAP_FAILED); 435481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VK_ERROR_INCOMPATIBLE_DRIVER); 43646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu#undef STR 437cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 438cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_RESULT"; 43946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 44046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 441d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 442f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkPhysicalDeviceTypeString(VkPhysicalDeviceType type) { 443190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu switch (type) { 444cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 445cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_PHYSICAL_DEVICE_TYPE_##r: \ 446481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 447481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(OTHER); 448481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(INTEGRATED_GPU); 449481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(DISCRETE_GPU); 450481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(VIRTUAL_GPU); 45155016b83baf512e5590d4ed265081fa33eb4d4ffChris Forbes STR(CPU); 452d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 453cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 454cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_DEVICE"; 455190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 456d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 457d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 458f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkFormatString(VkFormat fmt) { 4592b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes switch (fmt) { 460cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 461cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_FORMAT_##r: \ 462481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return #r 463481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(UNDEFINED); 464481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4_UNORM_PACK8); 465481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R4G4B4A4_UNORM_PACK16); 466481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B4G4R4A4_UNORM_PACK16); 467481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G6B5_UNORM_PACK16); 468481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G6R5_UNORM_PACK16); 469481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R5G5B5A1_UNORM_PACK16); 470481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B5G5R5A1_UNORM_PACK16); 471481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A1R5G5B5_UNORM_PACK16); 472481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UNORM); 473481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SNORM); 474481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_USCALED); 475481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SSCALED); 476481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_UINT); 477481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SINT); 478481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8_SRGB); 479481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UNORM); 480481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SNORM); 481481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_USCALED); 482481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SSCALED); 483481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_UINT); 484481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SINT); 485481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8_SRGB); 486481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UNORM); 487481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SNORM); 488481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_USCALED); 489481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SSCALED); 490481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_UINT); 491481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SINT); 492481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8_SRGB); 493481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UNORM); 494481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SNORM); 495481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_USCALED); 496481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SSCALED); 497481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_UINT); 498481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SINT); 499481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8_SRGB); 500481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UNORM); 501481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SNORM); 502481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_USCALED); 503481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SSCALED); 504481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_UINT); 505481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SINT); 506481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R8G8B8A8_SRGB); 507481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UNORM); 508481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SNORM); 509481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_USCALED); 510481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SSCALED); 511481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_UINT); 512481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SINT); 513481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B8G8R8A8_SRGB); 514481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UNORM_PACK32); 515481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SNORM_PACK32); 516481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_USCALED_PACK32); 517481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SSCALED_PACK32); 518481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_UINT_PACK32); 519481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SINT_PACK32); 520481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A8B8G8R8_SRGB_PACK32); 521481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UNORM_PACK32); 522481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SNORM_PACK32); 523481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_USCALED_PACK32); 524481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SSCALED_PACK32); 525481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_UINT_PACK32); 526481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2R10G10B10_SINT_PACK32); 527481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UNORM_PACK32); 528481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SNORM_PACK32); 529481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_USCALED_PACK32); 530481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SSCALED_PACK32); 531481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_UINT_PACK32); 532481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(A2B10G10R10_SINT_PACK32); 533481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UNORM); 534481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SNORM); 535481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_USCALED); 536481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SSCALED); 537481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_UINT); 538481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SINT); 539481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16_SFLOAT); 540481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UNORM); 541481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SNORM); 542481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_USCALED); 543481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SSCALED); 544481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_UINT); 545481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SINT); 546481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16_SFLOAT); 547481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UNORM); 548481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SNORM); 549481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_USCALED); 550481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SSCALED); 551481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_UINT); 552481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SINT); 553481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16_SFLOAT); 554481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UNORM); 555481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SNORM); 556481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_USCALED); 557481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SSCALED); 558481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_UINT); 559481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SINT); 560481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R16G16B16A16_SFLOAT); 561481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_UINT); 562481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SINT); 563481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32_SFLOAT); 564481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_UINT); 565481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SINT); 566481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32_SFLOAT); 567481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_UINT); 568481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SINT); 569481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32_SFLOAT); 570481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_UINT); 571481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SINT); 572481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R32G32B32A32_SFLOAT); 573481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_UINT); 574481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SINT); 575481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64_SFLOAT); 576481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_UINT); 577481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SINT); 578481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64_SFLOAT); 579481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_UINT); 580481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SINT); 581481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64_SFLOAT); 582481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_UINT); 583481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SINT); 584481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(R64G64B64A64_SFLOAT); 585481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(B10G11R11_UFLOAT_PACK32); 586481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(E5B9G9R9_UFLOAT_PACK32); 587481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM); 588481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(X8_D24_UNORM_PACK32); 589481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT); 590481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(S8_UINT); 591481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D16_UNORM_S8_UINT); 592481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D24_UNORM_S8_UINT); 593481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(D32_SFLOAT_S8_UINT); 594481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_UNORM_BLOCK); 595481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC1_RGB_SRGB_BLOCK); 596481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_UNORM_BLOCK); 597481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC2_SRGB_BLOCK); 598481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_UNORM_BLOCK); 599481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC3_SRGB_BLOCK); 600481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_UNORM_BLOCK); 601481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC4_SNORM_BLOCK); 602481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_UNORM_BLOCK); 603481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC5_SNORM_BLOCK); 604481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_UFLOAT_BLOCK); 605481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC6H_SFLOAT_BLOCK); 606481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_UNORM_BLOCK); 607481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(BC7_SRGB_BLOCK); 608481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8_UNORM_BLOCK); 609481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A1_UNORM_BLOCK); 610481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ETC2_R8G8B8A8_UNORM_BLOCK); 611481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_UNORM_BLOCK); 612481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11_SNORM_BLOCK); 613481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_UNORM_BLOCK); 614481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(EAC_R11G11_SNORM_BLOCK); 615481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_UNORM_BLOCK); 616481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_4x4_SRGB_BLOCK); 617481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_UNORM_BLOCK); 618481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x4_SRGB_BLOCK); 619481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_UNORM_BLOCK); 620481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_5x5_SRGB_BLOCK); 621481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_UNORM_BLOCK); 622481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x5_SRGB_BLOCK); 623481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_UNORM_BLOCK); 624481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_6x6_SRGB_BLOCK); 625481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_UNORM_BLOCK); 626481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x5_SRGB_BLOCK); 627481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_UNORM_BLOCK); 628481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x6_SRGB_BLOCK); 629481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_UNORM_BLOCK); 630481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_8x8_SRGB_BLOCK); 631481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_UNORM_BLOCK); 632481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x5_SRGB_BLOCK); 633481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_UNORM_BLOCK); 634481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x6_SRGB_BLOCK); 635481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_UNORM_BLOCK); 636481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x8_SRGB_BLOCK); 637481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_UNORM_BLOCK); 638481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_10x10_SRGB_BLOCK); 639481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_UNORM_BLOCK); 640481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x10_SRGB_BLOCK); 641481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_UNORM_BLOCK); 642481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz STR(ASTC_12x12_SRGB_BLOCK); 643d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu#undef STR 644cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 645cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_FORMAT"; 646190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 647d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 648bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WIN32_KHR) 649f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic const char *VkPresentModeString(VkPresentModeKHR mode) { 6507b3aadea3a889f1e04529f50649124277a47db46joey-lunarg switch (mode) { 651cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define STR(r) \ 652cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski case VK_PRESENT_MODE_##r: \ 6537b3aadea3a889f1e04529f50649124277a47db46joey-lunarg return #r 6547b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(IMMEDIATE_KHR); 6557b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(MAILBOX_KHR); 6567b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(FIFO_KHR); 6577b3aadea3a889f1e04529f50649124277a47db46joey-lunarg STR(FIFO_RELAXED_KHR); 6587b3aadea3a889f1e04529f50649124277a47db46joey-lunarg#undef STR 659cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski default: 660cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski return "UNKNOWN_FORMAT"; 6617b3aadea3a889f1e04529f50649124277a47db46joey-lunarg } 6627b3aadea3a889f1e04529f50649124277a47db46joey-lunarg} 663b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#endif 6647b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 6655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic bool CheckExtensionEnabled(const char *extension_to_check, const char **extension_list, uint32_t extension_count) { 6665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (uint32_t i = 0; i < extension_count; i++) { 6675d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (!strcmp(extension_to_check, extension_list[i])) return true; 6685d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 6695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager return false; 6705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager} 6712b7e88a1fdefc49d78e80765745e87e00034c2a0Jeremy Hayes 6725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic void AppDevInitFormats(struct AppDev *dev) { 6735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (uint32_t i = 0; i < format_check_list_count; i++) { 6745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager vkGetPhysicalDeviceFormatProperties(dev->gpu->obj, format_check_list[i], &dev->format_props[i]); 6755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 6765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, dev->gpu->inst->inst_extensions, 6775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager dev->gpu->inst->inst_extensions_count)) { 6785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager dev->format_props2[i].sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR; 6795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager dev->format_props2[i].pNext = NULL; 6805d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager dev->gpu->inst->vkGetPhysicalDeviceFormatProperties2KHR(dev->gpu->obj, format_check_list[i], &dev->format_props2[i]); 6815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 68246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 68346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 68446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 685bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void ExtractVersion(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch) { 68618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *major = version >> 22; 68718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *minor = (version >> 12) & 0x3ff; 68818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *patch = version & 0xfff; 68918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 69018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 691bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppGetPhysicalDeviceLayerExtensions(struct AppGpu *gpu, char *layer_name, uint32_t *extension_count, 692bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski VkExtensionProperties **extension_properties) { 69318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 69418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 69518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 69618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 69718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 69818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 699bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, NULL); 70018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 70118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 70218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 70318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 70418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 70518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 706bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateDeviceExtensionProperties(gpu->obj, layer_name, &ext_count, ext_ptr); 70718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 70818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 70918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 71018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 71118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 71218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 71318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 714f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevInit(struct AppDev *dev, struct AppGpu *gpu) { 715ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkDeviceCreateInfo info = { 7169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 71746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu .pNext = NULL, 7188173093c7d5db4415108a25e24fd0c07d7209f20Tony Barbour .flags = 0, 719045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .queueCreateInfoCount = 0, 720045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .pQueueCreateInfos = NULL, 721a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledLayerCount = 0, 72218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledLayerNames = NULL, 723a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .enabledExtensionCount = 0, 72418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter .ppEnabledExtensionNames = NULL, 72546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu }; 7263c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 727426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 7289652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // Device extensions 729bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetPhysicalDeviceLayerExtensions(gpu, NULL, &gpu->device_extension_count, &gpu->device_extensions); 7303c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 7319e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter fflush(stdout); 7329e42b8882f26e897f0022f5ce800a04f4d2ad1cfCourtney Goeltzenleuchter 73346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* request all queues */ 734045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.queueCreateInfoCount = gpu->queue_count; 735045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu info.pQueueCreateInfos = gpu->queue_reqs; 73646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 737a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn info.enabledLayerCount = 0; 73818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter info.ppEnabledLayerNames = NULL; 7394ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.enabledExtensionCount = 0; 7404ead55c47dc19d771244bec82679a0f97544c741Jon Ashburn info.ppEnabledExtensionNames = NULL; 7413c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter dev->gpu = gpu; 74269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateDevice(gpu->obj, &info, NULL, &dev->obj); 743cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 74446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 74546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 746f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevDestroy(struct AppDev *dev) { 747c7e3fbda0891c48fb667f645d40d495be48f3fe8Tony Barbour vkDeviceWaitIdle(dev->obj); 74869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDevice(dev->obj, NULL); 74946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 75046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 751bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppGetGlobalLayerExtensions(char *layer_name, uint32_t *extension_count, VkExtensionProperties **extension_properties) { 75218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkResult err; 75318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t ext_count = 0; 75418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties *ext_ptr = NULL; 75518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 75618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* repeat get until VK_INCOMPLETE goes away */ 75718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter do { 7587fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension count if the last parameter is NULL 759bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, NULL); 76018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 76118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 76218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (ext_ptr) { 76318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter free(ext_ptr); 76418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 76518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); 7667fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // gets the extension properties if the last parameter is not NULL 767bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, ext_ptr); 76818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } while (err == VK_INCOMPLETE); 76918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 77018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_count = ext_count; 77118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter *extension_properties = ext_ptr; 77218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 77318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 7747fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay/* Gets a list of layer and instance extensions */ 775f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGetInstanceExtensions(struct AppInstance *inst) { 7767fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkResult U_ASSERT_ONLY err; 777a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7787fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay uint32_t count = 0; 779a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7807fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay /* Scan layers */ 7817fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *global_layer_properties = NULL; 782f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *global_layers = NULL; 783a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7847fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay do { 7857fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkEnumerateInstanceLayerProperties(&count, NULL); 7867fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 787a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7887fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layer_properties) { 7897fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 7907fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 7917fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay global_layer_properties = malloc(sizeof(VkLayerProperties) * count); 7927fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layer_properties); 793a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 7947fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (global_layers) { 7957fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layers); 7967fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 797f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg global_layers = malloc(sizeof(struct LayerExtensionList) * count); 7987fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(global_layers); 799a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 800bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties); 8017fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } while (err == VK_INCOMPLETE); 8027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 803a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8047fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layer_count = count; 8057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_layers = global_layers; 806a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8077fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay for (uint32_t i = 0; i < inst->global_layer_count; i++) { 8087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkLayerProperties *src_info = &global_layer_properties[i]; 809f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct LayerExtensionList *dst_info = &inst->global_layers[i]; 810bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties)); 811a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 812cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Save away layer extension info for report 813cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Gets layer extensions, if first parameter is not NULL 814bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetGlobalLayerExtensions(src_info->layerName, &dst_info->extension_count, &dst_info->extension_properties); 8157fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 8167fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay free(global_layer_properties); 8177fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 818cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay // Collect global extensions 8197fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst->global_extension_count = 0; 8209652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // Gets instance extensions, if no layer was specified in the first 8219652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay // paramteter 822bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetGlobalLayerExtensions(NULL, &inst->global_extension_count, &inst->global_extensions); 823a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 824a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 825f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateInstance(struct AppInstance *inst) { 826f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGetInstanceExtensions(inst); 827a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8287fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//---Build a list of extensions to load--- 829a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8305d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager const char *info_instance_extensions[] = {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 8315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, 8325d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_SURFACE_EXTENSION_NAME, 8335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 8345d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 8357fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 8365d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_WIN32_SURFACE_EXTENSION_NAME 837b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 8385d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_XCB_SURFACE_EXTENSION_NAME 839b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 8405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_XLIB_SURFACE_EXTENSION_NAME 841b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_WAYLAND_KHR 8425d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME 843b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_ANDROID_KHR 8445d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VK_KHR_ANDROID_SURFACE_EXTENSION_NAME 845a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 8465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager }; 8475d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager uint32_t info_instance_extensions_count = ARRAY_SIZE(info_instance_extensions); 8485d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->inst_extensions = malloc(sizeof(char *) * ARRAY_SIZE(info_instance_extensions)); 8495d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->inst_extensions_count = 0; 8505d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 8515d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (uint32_t k = 0; (k < info_instance_extensions_count); k++) { 8525d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (uint32_t j = 0; (j < inst->global_extension_count); j++) { 8535d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager const char *found_name = inst->global_extensions[j].extensionName; 8545d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (!strcmp(info_instance_extensions[k], found_name)) { 8555d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->inst_extensions[inst->inst_extensions_count++] = info_instance_extensions[k]; 8565d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager break; 8575d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 8587fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 8595d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 8605d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 861a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //---------------------------------------- 862a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8633c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter const VkApplicationInfo app_info = { 8643c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 8653c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pNext = NULL, 8661f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationName = APP_SHORT_NAME, 8671f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .applicationVersion = 1, 8683c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .pEngineName = APP_SHORT_NAME, 8693c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter .engineVersion = 1, 870d3995c987ba7e47700ceb54535880e782c6b04c1Jon Ashburn .apiVersion = VK_API_VERSION_1_0, 8713c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter }; 872a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkInstanceCreateInfo inst_info = {.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 8745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .pNext = NULL, 8755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .pApplicationInfo = &app_info, 8765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .enabledLayerCount = 0, 8775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .ppEnabledLayerNames = NULL, 8785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .enabledExtensionCount = inst->inst_extensions_count, 8795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager .ppEnabledExtensionNames = inst->inst_extensions}; 88046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 881acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackCreateInfoEXT dbg_info; 882f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter memset(&dbg_info, 0, sizeof(dbg_info)); 883acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter dbg_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 884bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski dbg_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 885f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg dbg_info.pfnCallback = DbgCallback; 886f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter inst_info.pNext = &dbg_info; 887f412d576c9f1d7635786d44e9f40885beaa9867eCourtney Goeltzenleuchter 888a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 88969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateInstance(&inst_info, NULL, &inst->instance); 8903c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 8913c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter printf("Cannot create Vulkan instance.\n"); 8923c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 8933c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } else if (err) { 8943c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter ERR_EXIT(err); 89546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 896a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 8975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceSupportKHR = 8985d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vkGetInstanceProcAddr(inst->instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); 8995d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vkGetInstanceProcAddr( 9005d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); 9015d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceFormatsKHR = 9025d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vkGetInstanceProcAddr(inst->instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); 9035d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vkGetInstanceProcAddr( 9045d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); 9055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceProperties2KHR = 9065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager (PFN_vkGetPhysicalDeviceProperties2KHR)vkGetInstanceProcAddr(inst->instance, "vkGetPhysicalDeviceProperties2KHR"); 9075d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vkGetInstanceProcAddr( 9085d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceFormatProperties2KHR"); 9095d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vkGetInstanceProcAddr( 9105d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); 9115d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceFeatures2KHR = 9125d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(inst->instance, "vkGetPhysicalDeviceFeatures2KHR"); 9135d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr( 9145d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceMemoryProperties2KHR"); 9155d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)vkGetInstanceProcAddr( 9165d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR"); 9175d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)vkGetInstanceProcAddr( 9185d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT"); 9193c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter} 9203c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 921a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 922a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 923f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyInstance(struct AppInstance *inst) { 9243c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(inst->global_extensions); 9255d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (uint32_t i = 0; i < inst->global_layer_count; i++) { 9265d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(inst->global_layers[i].extension_properties); 9275d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 9285d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(inst->global_layers); 9295d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(inst->inst_extensions); 93069f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyInstance(inst->instance, NULL); 93146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 93246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic void AppGpuInit(struct AppGpu *gpu, struct AppInstance *inst, uint32_t id, VkPhysicalDevice obj) { 934aae1a570a95ca8074d48698372694bb1ef2b5530Ian Elliott uint32_t i; 93546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 93646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu memset(gpu, 0, sizeof(*gpu)); 93746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 93846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->id = id; 93946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->obj = obj; 9405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->inst = inst; 941426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 94201d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceProperties(gpu->obj, &gpu->props); 94346c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9445d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, 9455d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->inst->inst_extensions_count)) { 9465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; 9475d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->props2.pNext = NULL; 9485d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 9495d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceProperties2KHR(gpu->obj, &gpu->props2); 9505d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 9515d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 95246c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* get queue count */ 95301d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, NULL); 95446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 955481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz gpu->queue_props = malloc(sizeof(gpu->queue_props[0]) * gpu->queue_count); 956426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour 957cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpu->queue_props) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 958bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski vkGetPhysicalDeviceQueueFamilyProperties(gpu->obj, &gpu->queue_count, gpu->queue_props); 95946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 9605d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, 9615d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->inst->inst_extensions_count)) { 9625d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->queue_props2 = malloc(sizeof(gpu->queue_props2[0]) * gpu->queue_count); 9635d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 9645d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (!gpu->queue_props2) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 9655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 9665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager for (i = 0; i < gpu->queue_count; i++) { 9675d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->queue_props2[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR; 9685d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->queue_props2[i].pNext = NULL; 9695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 9705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 9715d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceQueueFamilyProperties2KHR(gpu->obj, &gpu->queue_count, gpu->queue_props2); 9725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 9735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 97446c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu /* set up queue requests */ 97546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu gpu->queue_reqs = malloc(sizeof(*gpu->queue_reqs) * gpu->queue_count); 976cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpu->queue_reqs) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 97746c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 978bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); 979cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!queue_priorities) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 980bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); 9815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 982ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 983ea97564708cfcbebb42a842edac456e79643e716Courtney Goeltzenleuchter gpu->queue_reqs[i].pNext = NULL; 9848173093c7d5db4415108a25e24fd0c07d7209f20Tony Barbour gpu->queue_reqs[i].flags = 0; 985fa6d36ea26354e4d68e81b05d1199a83c9fa3d6aChris Forbes gpu->queue_reqs[i].queueFamilyIndex = i; 986045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; 987d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter gpu->queue_reqs[i].pQueuePriorities = queue_priorities; 98846c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu } 98946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 99001d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props); 99146c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 99201d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFeatures(gpu->obj, &gpu->features); 993a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 9945d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, 9955d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->inst->inst_extensions_count)) { 9965d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->memory_props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR; 9975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->memory_props2.pNext = NULL; 9985d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 9995d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceMemoryProperties2KHR(gpu->obj, &gpu->memory_props2); 10005d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 10015d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; 10025d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->features2.pNext = NULL; 10035d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 10045d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceFeatures2KHR(gpu->obj, &gpu->features2); 10055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 10065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 1007f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevInit(&gpu->dev, gpu); 1008f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevInitFormats(&gpu->dev); 100946c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 101046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1011f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDestroy(struct AppGpu *gpu) { 1012f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDestroy(&gpu->dev); 10133c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter free(gpu->device_extensions); 10142c0948342e626904289329dd3f0912b6714eac19Jon Ashburn 1015d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter for (uint32_t i = 0; i < gpu->queue_count; i++) { 1016481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz free((void *)gpu->queue_reqs[i].pQueuePriorities); 1017d3a8d3699ceffb62da8d95d1fb49242fb25b43bfCourtney Goeltzenleuchter } 10182c0948342e626904289329dd3f0912b6714eac19Jon Ashburn free(gpu->queue_reqs); 10195d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 102046c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu free(gpu->queue_props); 10215d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, 10225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager gpu->inst->inst_extensions_count)) { 10235d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(gpu->queue_props2); 10245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 102546c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu} 102646c29ddef4360cac80d9dd533486aa1ab34776e1Chia-I Wu 1027481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format off 1028a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1029a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 1030a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1031a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//---------------------------Win32--------------------------- 1032a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 1033a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1034a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay// MS-Windows event handling function: 1035a155d62f73c03dea7315ba34a7582239fdfc85d2Rene LindsayLRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 1036a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay return (DefWindowProc(hWnd, uMsg, wParam, lParam)); 1037a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1038a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1039f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateWin32Window(struct AppInstance *inst) { 1040f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_instance = GetModuleHandle(NULL); 1041a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1042a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WNDCLASSEX win_class; 1043a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1044a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Initialize the window class structure: 1045a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbSize = sizeof(WNDCLASSEX); 1046a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.style = CS_HREDRAW | CS_VREDRAW; 1047a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpfnWndProc = WndProc; 1048a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbClsExtra = 0; 1049a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.cbWndExtra = 0; 1050f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg win_class.hInstance = inst->h_instance; 1051a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); 1052a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hCursor = LoadCursor(NULL, IDC_ARROW); 1053a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 1054a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszMenuName = NULL; 1055a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.lpszClassName = APP_SHORT_NAME; 1056f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg win_class.hInstance = inst->h_instance; 1057a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); 1058a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Register window class: 1059a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay if (!RegisterClassEx(&win_class)) { 1060a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 106154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to register the window class!\n"); 1062a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 1063a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 1064a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1065a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Create window with the registered class: 1066a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay RECT wr = { 0, 0, inst->width, inst->height }; 1067a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); 1068f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_wnd = CreateWindowEx(0, 1069a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // class name 1070a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay APP_SHORT_NAME, // app name 1071a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //WS_VISIBLE | WS_SYSMENU | 1072a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay WS_OVERLAPPEDWINDOW, // window style 1073a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 100, 100, // x/y coords 1074a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.right - wr.left, // width 1075a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay wr.bottom - wr.top, // height 1076a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to parent 1077a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL, // handle to menu 1078f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg inst->h_instance, // hInstance 1079a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay NULL); // no extra parameters 1080f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg if (!inst->h_wnd) { 1081a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // It didn't work, so try to give a useful error: 108254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay printf("Failed to create a window!\n"); 1083a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay fflush(stdout); 1084a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay exit(1); 1085a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1086a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1087a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1088f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateWin32Surface(struct AppInstance *inst) { 1089a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 1090a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkWin32SurfaceCreateInfoKHR createInfo; 1091a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 1092a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 1093a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 1094f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg createInfo.hinstance = inst->h_instance; 1095f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg createInfo.hwnd = inst->h_wnd; 10967fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 10977fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 1098a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1099a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1100f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyWin32Window(struct AppInstance *inst) { 1101f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg DestroyWindow(inst->h_wnd); 1102a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1103a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_WIN32_KHR 1104a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 1105a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1106b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || \ 1107b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour defined(VK_USE_PLATFORM_XLIB_KHR) || \ 1108fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz defined(VK_USE_PLATFORM_WIN32_KHR) 1109f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroySurface(struct AppInstance *inst) { //same for all platforms 1110a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vkDestroySurfaceKHR(inst->instance, inst->surface, NULL); 1111a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1112fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 1113a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1114a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XCB---------------------------- 111554cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 1116a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_XCB_KHR 1117f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXcbWindow(struct AppInstance *inst) { 1118ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski //--Init Connection-- 1119ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski const xcb_setup_t *setup; 1120ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_screen_iterator_t iter; 1121ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski int scr; 1122ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1123ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_connection = xcb_connect(NULL, &scr); 1124ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski if (inst->xcb_connection == NULL) { 1125ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski printf("XCB failed to connect to the X server.\nExiting ...\n"); 1126ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski fflush(stdout); 1127ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski exit(1); 1128ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 1129ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1130c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses int conn_error = xcb_connection_has_error(inst->xcb_connection); 1131c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses if (conn_error) { 1132c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses printf("XCB failed to connect to the X server due to error:%d.\nExiting ...\n", conn_error); 1133c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses fflush(stdout); 1134c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses exit(1); 1135c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses } 1136c18eb54c92b625ad2f5d2970eadc53c1d6f55aa5Arda Coskunses 1137ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski setup = xcb_get_setup(inst->xcb_connection); 1138ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski iter = xcb_setup_roots_iterator(setup); 1139ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski while (scr-- > 0) { 1140ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_screen_next(&iter); 1141ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 1142ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1143ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_screen = iter.data; 1144ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski //------------------- 1145ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1146ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_window = xcb_generate_id(inst->xcb_connection); 1147ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_create_window(inst->xcb_connection, XCB_COPY_FROM_PARENT, inst->xcb_window, 1148ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski inst->xcb_screen->root, 0, 0, inst->width, inst->height, 0, 1149ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, 1150ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 0, NULL); 1151ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1152ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); 1153ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); 1154ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski free(reply); 1155a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1156a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1157f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXcbSurface(struct AppInstance *inst) { 1158a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 1159a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXcbSurfaceCreateInfoKHR xcb_createInfo; 1160a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; 1161a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.pNext = NULL; 1162a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.flags = 0; 1163a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.connection = inst->xcb_connection; 1164a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_createInfo.window = inst->xcb_window; 11657fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); 11667fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 1167a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1168a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1169f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyXcbWindow(struct AppInstance *inst) { 1170a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_destroy_window(inst->xcb_connection, inst->xcb_window); 1171a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay xcb_disconnect(inst->xcb_connection); 1172a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1173b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour//VK_USE_PLATFORM_XCB_KHR 1174a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 1175a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1176a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------XLib--------------------------- 1177b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 1178f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXlibWindow(struct AppInstance *inst) { 1179a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay long visualMask = VisualScreenMask; 1180a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay int numberOfVisuals; 118154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay 1182600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz inst->xlib_display = XOpenDisplay(NULL); 1183600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz if (inst->xlib_display == NULL) { 1184600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz printf("XLib failed to connect to the X server.\nExiting ...\n"); 1185600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz fflush(stdout); 1186600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz exit(1); 1187600078730ceb7ffa77f5f57f1ce9a5858d5a0816Karl Schultz } 1188f231a17a49b329c79ef12bc55fde9bdc893372dcAwais Belal 118954cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay XVisualInfo vInfoTemplate={}; 1190a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay vInfoTemplate.screen = DefaultScreen(inst->xlib_display); 1191a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XVisualInfo *visualInfo = XGetVisualInfo(inst->xlib_display, visualMask, 1192a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay &vInfoTemplate, &numberOfVisuals); 1193a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_window = XCreateWindow( 1194a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), 0, 0, 1195a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay inst->width, inst->height, 0, visualInfo->depth, InputOutput, 119654cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay visualInfo->visual, 0, NULL); 1197a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1198aad516ebcb8e220a5770b7802f241c933a920c56Rene Lindsay XSync(inst->xlib_display,false); 1199a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1200a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1201f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppCreateXlibSurface(struct AppInstance *inst) { 1202a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkResult U_ASSERT_ONLY err; 1203a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay VkXlibSurfaceCreateInfoKHR createInfo; 1204a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; 1205a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.pNext = NULL; 1206a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.flags = 0; 1207a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.dpy = inst->xlib_display; 1208a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay createInfo.window = inst->xlib_window; 12097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); 12107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay assert(!err); 1211a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1212a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1213f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDestroyXlibWindow(struct AppInstance *inst) { 1214a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XDestroyWindow(inst->xlib_display, inst->xlib_window); 1215a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay XCloseDisplay(inst->xlib_display); 1216a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 1217a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif //VK_USE_PLATFORM_XLIB_KHR 1218a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay//----------------------------------------------------------- 1219a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1220b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || \ 1221b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour defined(VK_USE_PLATFORM_XLIB_KHR) || \ 1222fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz defined(VK_USE_PLATFORM_WIN32_KHR) 1223f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic int AppDumpSurfaceFormats(struct AppInstance *inst, struct AppGpu *gpu){ 1224a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay // Get the list of VkFormat's that are supported: 1225ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski VkResult U_ASSERT_ONLY err; 1226f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg uint32_t format_count = 0; 1227f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &format_count, NULL); 1228ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski assert(!err); 1229ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1230f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkSurfaceFormatKHR *surf_formats = (VkSurfaceFormatKHR *)malloc(format_count * sizeof(VkSurfaceFormatKHR)); 1231242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz if (!surf_formats) 1232242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 1233f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &format_count, surf_formats); 1234ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski assert(!err); 1235f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("Formats:\t\tcount = %d\n", format_count); 1236ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski 1237f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg for (uint32_t i = 0; i < format_count; i++) { 1238f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t%s\n", VkFormatString(surf_formats[i].format)); 1239ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski } 1240ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski fflush(stdout); 12415d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 12425d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(surf_formats); 1243f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg return format_count; 1244a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay} 12457b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 1246f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic int AppDumpSurfacePresentModes(struct AppInstance *inst, struct AppGpu *gpu) { 12477b3aadea3a889f1e04529f50649124277a47db46joey-lunarg // Get the list of VkPresentMode's that are supported: 12487b3aadea3a889f1e04529f50649124277a47db46joey-lunarg VkResult U_ASSERT_ONLY err; 1249f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg uint32_t present_mode_count = 0; 1250f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->obj, inst->surface, &present_mode_count, NULL); 12517b3aadea3a889f1e04529f50649124277a47db46joey-lunarg assert(!err); 12527b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 1253f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkPresentModeKHR *surf_present_modes = (VkPresentModeKHR *)malloc(present_mode_count * sizeof(VkPresentInfoKHR)); 1254242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz if (!surf_present_modes) 1255242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 1256f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg err = inst->vkGetPhysicalDeviceSurfacePresentModesKHR(gpu->obj, inst->surface, &present_mode_count, surf_present_modes); 12577b3aadea3a889f1e04529f50649124277a47db46joey-lunarg assert(!err); 1258f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("Present Modes:\t\tcount = %d\n", present_mode_count); 12597b3aadea3a889f1e04529f50649124277a47db46joey-lunarg 1260f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg for (uint32_t i = 0; i < present_mode_count; i++) { 1261f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t%s\n", VkPresentModeString(surf_present_modes[i])); 12627b3aadea3a889f1e04529f50649124277a47db46joey-lunarg } 12637b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("\n"); 12647b3aadea3a889f1e04529f50649124277a47db46joey-lunarg fflush(stdout); 12655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 12665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager free(surf_present_modes); 1267f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg return present_mode_count; 12687b3aadea3a889f1e04529f50649124277a47db46joey-lunarg} 12695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 12705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniagerstatic void AppDumpSurfaceCapabilities(struct AppInstance *inst, struct AppGpu *gpu) { 12715d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_SURFACE_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { 12725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 12735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu->obj, inst->surface, &inst->surface_capabilities); 12745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 12755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\nVkSurfaceCapabilitiesKHR:\n"); 12765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("=========================\n\n"); 12775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tminImageCount = %u\n", inst->surface_capabilities.minImageCount); 12785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tmaxImageCount = %u\n", inst->surface_capabilities.maxImageCount); 12795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tcurrentExtent:\n"); 12805d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\twidth = %u\n", inst->surface_capabilities.currentExtent.width); 12815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\theight = %u\n", inst->surface_capabilities.currentExtent.height); 12825d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tminImageExtent:\n"); 12835d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\twidth = %u\n", inst->surface_capabilities.minImageExtent.width); 12845d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\theight = %u\n", inst->surface_capabilities.minImageExtent.height); 12855d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tmaxImageExtent:\n"); 12865d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\twidth = %u\n", inst->surface_capabilities.maxImageExtent.width); 12875d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\t\theight = %u\n", inst->surface_capabilities.maxImageExtent.height); 12885d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tmaxImageArrayLayers = %u\n", inst->surface_capabilities.maxImageArrayLayers); 12895d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tsupportedTransform:\n"); 12905d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms == 0) { printf("\t\tNone\n"); } 12915d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR\n"); } 12925d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR\n"); } 12935d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR\n"); } 12945d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR\n"); } 12955d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR\n"); } 12965d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR\n"); } 12975d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR\n"); } 12985d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR\n"); } 12995d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_INHERIT_BIT_KHR\n"); } 13005d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tcurrentTransform:\n"); 13015d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.currentTransform == 0) { printf("\t\tNone\n"); } 13025d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR\n"); } 13035d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR\n"); } 13045d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR\n"); } 13055d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR\n"); } 13065d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR\n"); } 13075d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR\n"); } 13085d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR\n"); } 13095d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR\n"); } 13105d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR) { printf("\t\tVK_SURFACE_TRANSFORM_INHERIT_BIT_KHR\n"); } 13115d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tsupportedCompositeAlpha:\n"); 13125d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedCompositeAlpha == 0) { printf("\t\tNone\n"); } 13135d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) { printf("\t\tVK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR\n"); } 13145d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR) { printf("\t\tVK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR\n"); } 13155d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR) { printf("\t\tVK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR\n"); } 13165d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) { printf("\t\tVK_COMPOSITE_ALPHA_INHERIT_BIT_KHR\n"); } 13175d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tsupportedUsageFlags:\n"); 13185d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags == 0) { printf("\t\tNone\n"); } 13195d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSFER_SRC_BIT\n"); } 13205d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSFER_DST_BIT\n"); } 13215d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) { printf("\t\tVK_IMAGE_USAGE_SAMPLED_BIT\n"); } 13225d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_STORAGE_BIT) { printf("\t\tVK_IMAGE_USAGE_STORAGE_BIT\n"); } 13235d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT\n"); } 13245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT\n"); } 13255d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT\n"); } 13265d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities.supportedUsageFlags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT\n"); } 13275d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13285d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager // Get additional surface capability information from vkGetPhysicalDeviceSurfaceCapabilities2EXT 13295d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { 13305d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager memset(&inst->surface_capabilities2_ext, 0, sizeof(VkSurfaceCapabilities2EXT)); 13315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->surface_capabilities2_ext.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT; 13325d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->surface_capabilities2_ext.pNext = NULL; 13335d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13345d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilities2EXT(gpu->obj, inst->surface, &inst->surface_capabilities2_ext); 13355d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13365d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\nVkSurfaceCapabilities2EXT:\n"); 13375d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("==========================\n\n"); 13385d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tsupportedSurfaceCounters:\n"); 13395d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities2_ext.supportedSurfaceCounters == 0) { printf("\t\tNone\n"); } 13405d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (inst->surface_capabilities2_ext.supportedSurfaceCounters & VK_SURFACE_COUNTER_VBLANK_EXT) { printf("\t\tVK_SURFACE_COUNTER_VBLANK_EXT\n"); } 13415d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13425d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13435d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager // Get additional surface capability information from vkGetPhysicalDeviceSurfaceCapabilities2KHR 13445d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { 13455d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { 13465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->shared_surface_capabilities.sType = VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR; 13475d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->shared_surface_capabilities.pNext = NULL; 13485d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->surface_capabilities2.pNext = &inst->shared_surface_capabilities; 13495d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } else { 13505d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->surface_capabilities2.pNext = NULL; 13515d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13525d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13535d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->surface_capabilities2.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR; 13545d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13555d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkPhysicalDeviceSurfaceInfo2KHR surface_info; 13565d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager surface_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR; 13575d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager surface_info.pNext = NULL; 13585d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager surface_info.surface = inst->surface; 13595d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13605d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager inst->vkGetPhysicalDeviceSurfaceCapabilities2KHR(gpu->obj, &surface_info, &inst->surface_capabilities2); 13615d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13625d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager void *place = inst->surface_capabilities2.pNext; 13635d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager while (place) { 13645d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager struct VkStructureHeader* work = (struct VkStructureHeader*) place; 13655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (work->sType == VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR) { 13665d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\nVkSharedPresentSurfaceCapabilitiesKHR:\n"); 13675d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("========================================\n"); 13685d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager VkSharedPresentSurfaceCapabilitiesKHR* shared_surface_capabilities = (VkSharedPresentSurfaceCapabilitiesKHR*)place; 13695d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("\tsharedPresentSupportedUsageFlags:\n"); 13705d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags == 0) { printf("\t\tNone\n"); } 13715d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSFER_SRC_BIT\n"); } 13725d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSFER_DST_BIT\n"); } 13735d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) { printf("\t\tVK_IMAGE_USAGE_SAMPLED_BIT\n"); } 13745d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_STORAGE_BIT) { printf("\t\tVK_IMAGE_USAGE_STORAGE_BIT\n"); } 13755d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT\n"); } 13765d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT\n"); } 13775d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT\n"); } 13785d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (shared_surface_capabilities->sharedPresentSupportedUsageFlags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) { printf("\t\tVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT\n"); } 13795d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13805d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 13815d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager place = work->pNext; 13825d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13835d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13845d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager } 13855d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager} 13865d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager 1387fad114e418ec4300c3a3d86ae30042d1a332c562Karl Schultz#endif 1388a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1389f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDevDumpFormatProps(const struct AppDev *dev, VkFormat fmt) 1390d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1391382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkFormatProperties *props = &dev->format_props[fmt]; 1392190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu struct { 1393190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu const char *name; 1394382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFlags flags; 13954b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } features[3]; 1396190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 13974b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].name = "linearTiling FormatFeatureFlags"; 13984b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[0].flags = props->linearTilingFeatures; 13994b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].name = "optimalTiling FormatFeatureFlags"; 14004b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[1].flags = props->optimalTilingFeatures; 14014b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].name = "bufferFeatures FormatFeatureFlags"; 14024b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski features[2].flags = props->bufferFeatures; 14034b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski 1404f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\nFORMAT_%s:", VkFormatString(fmt)); 1405ce165d8fd729f7ff9d2e12eac2865a6327073d1dMark Lobodzinski for (uint32_t i = 0; i < ARRAY_SIZE(features); i++) { 14064b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t%s:", features[i].name); 14074b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski if (features[i].flags == 0) { 14084b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n\t\tNone"); 14094b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } else { 14105d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 14113c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), //0x0001 14123c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), //0x0002 14133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), //0x0004 14143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), //0x0008 14153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), //0x0010 14163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), //0x0020 14173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : ""), //0x0040 14183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), //0x0080 14193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), //0x0100 14203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), //0x0200 14213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), //0x0400 14223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), //0x0800 14233c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), //0x1000 14245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG" : ""), //0x2000 14255d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager ((features[i].flags & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR) ? "\n\t\tVK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR" : ""), //0x4000 14265d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager ((features[i].flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR) ? "\n\t\tVK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR" : "")); //0x8000 14274b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski } 1428190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 14294b36dd453ecb809731dbc68ccdb50e83f5417dd6Mark Lobodzinski printf("\n"); 1430d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1431d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1432d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wustatic void 1433f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargAppDevDump(const struct AppDev *dev) 1434d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu{ 1435785034443420fe897a68fa78f2a72edb1a91dd53Rene Lindsay printf("Format Properties:\n"); 1436785034443420fe897a68fa78f2a72edb1a91dd53Rene Lindsay printf("=================="); 1437382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat fmt; 1438190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 14391f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu for (fmt = 0; fmt < VK_FORMAT_RANGE_SIZE; fmt++) { 1440f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDumpFormatProps(dev, fmt); 1441190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1442d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1443d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1444009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#ifdef _WIN32 1445009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%Iu" 1446009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#else 1447009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#define PRINTF_SIZE_T_SPECIFIER "%zu" 1448009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan#endif 1449009d8ca0c07c81adff475c48273207e170b4b5fbMike Stroyan 1450f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpFeatures(const struct AppGpu *gpu) 1451a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 1452a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes const VkPhysicalDeviceFeatures *features = &gpu->features; 1453a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 1454825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceFeatures:\n"); 1455825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=========================\n"); 1456825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1457825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); 1458825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); 1459825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\timageCubeArray = %u\n", features->imageCubeArray ); 1460825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tindependentBlend = %u\n", features->independentBlend ); 1461825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tgeometryShader = %u\n", features->geometryShader ); 1462825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttessellationShader = %u\n", features->tessellationShader ); 1463825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsampleRateShading = %u\n", features->sampleRateShading ); 1464c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); 1465825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlogicOp = %u\n", features->logicOp ); 1466825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); 14670bdccbb2032f952395823664f82726a2da0e2c05Jon Ashburn printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); 1468c04519cd6e39256351df868dc721259d904f4542Chia-I Wu printf("\tdepthClamp = %u\n", features->depthClamp ); 1469825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); 14704291d8822ec2a685ef89ec2b210ff16857e25310Chia-I Wu printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); 1471825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tdepthBounds = %u\n", features->depthBounds ); 1472825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\twideLines = %u\n", features->wideLines ); 1473825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tlargePoints = %u\n", features->largePoints ); 1474a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\talphaToOne = %u\n", features->alphaToOne ); 1475a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\tmultiViewport = %u\n", features->multiViewport ); 1476a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\tsamplerAnisotropy = %u\n", features->samplerAnisotropy ); 1477825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); 1478825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); 1479825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); 1480481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); 1481825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); 1482a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\tvertexPipelineStoresAndAtomics = %u\n", features->vertexPipelineStoresAndAtomics ); 1483a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\tfragmentStoresAndAtomics = %u\n", features->fragmentStoresAndAtomics ); 1484a0cd07209eef7aaaac689c0b2c3ce1b2b4651c24Tobias Markus printf("\tshaderTessellationAndGeometryPointSize = %u\n", features->shaderTessellationAndGeometryPointSize ); 1485825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); 1486825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); 1487825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); 1488221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); 1489221f2f20a860bb8dd33533aacf4c795501a04e43Chia-I Wu printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); 1490825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); 1491825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); 1492825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); 1493825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); 1494825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); 1495825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); 1496825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); 1497825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt64 = %u\n", features->shaderInt64 ); 1498825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderInt16 = %u\n", features->shaderInt16 ); 1499825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); 1500d3f9934956da83277b3ea10cb98954427384cb93Chia-I Wu printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); 15017dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tsparseBinding = %u\n", features->sparseBinding ); 1502825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); 1503825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); 1504825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); 1505825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); 1506825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); 1507825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); 1508825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); 1509825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); 1510d507261fef1c6877aeaa636d0b684ecee0854e74Chia-I Wu printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); 1511c1838401aa9dcc84b54ef2d63e25cf5aacb8ebfeKarl Schultz printf("\tinheritedQueries = %u\n", features->inheritedQueries ); 1512a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes} 1513a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes 1514f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDumpSparseProps(const VkPhysicalDeviceSparseProperties *sparse_props) 1515a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes{ 15167dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 15177dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceSparseProperties:\n"); 15187dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t---------------------------------\n"); 15197dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1520f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard2DBlockShape = %u\n", sparse_props->residencyStandard2DBlockShape ); 1521f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard2DMultisampleBlockShape = %u\n", sparse_props->residencyStandard2DMultisampleBlockShape); 1522f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyStandard3DBlockShape = %u\n", sparse_props->residencyStandard3DBlockShape ); 1523f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyAlignedMipSize = %u\n", sparse_props->residencyAlignedMipSize ); 1524f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\t\tresidencyNonResidentStrict = %u\n", sparse_props->residencyNonResidentStrict ); 15257dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski} 15267dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1527f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppDumpLimits(const VkPhysicalDeviceLimits *limits) 15287dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski{ 15297dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\tVkPhysicalDeviceLimits:\n"); 15307dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t-----------------------\n"); 15313c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension1D = %u\n", limits->maxImageDimension1D ); 15323c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension2D = %u\n", limits->maxImageDimension2D ); 15333c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimension3D = %u\n", limits->maxImageDimension3D ); 15343c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageDimensionCube = %u\n", limits->maxImageDimensionCube ); 15353c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxImageArrayLayers = %u\n", limits->maxImageArrayLayers ); 15367e470703805a7c93655ea18f553e225e84356429Chia-I Wu printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); 1537481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); 1538481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); 15393c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPushConstantsSize = %u\n", limits->maxPushConstantsSize ); 15403c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxMemoryAllocationCount = %u\n", limits->maxMemoryAllocationCount ); 15413c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSamplerAllocationCount = %u\n", limits->maxSamplerAllocationCount ); 15427dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); 1543a0258a51b8d4d16a26e81e321d4d8a5694031301Tony Barbour printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); 15443c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets ); 15453c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSamplers = %u\n", limits->maxPerStageDescriptorSamplers ); 15463c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorUniformBuffers = %u\n", limits->maxPerStageDescriptorUniformBuffers ); 15473c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageBuffers = %u\n", limits->maxPerStageDescriptorStorageBuffers ); 15483c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorSampledImages = %u\n", limits->maxPerStageDescriptorSampledImages ); 15493c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorStorageImages = %u\n", limits->maxPerStageDescriptorStorageImages ); 15503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageDescriptorInputAttachments = %u\n", limits->maxPerStageDescriptorInputAttachments ); 15513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxPerStageResources = %u\n", limits->maxPerStageResources ); 15523c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSamplers = %u\n", limits->maxDescriptorSetSamplers ); 15533c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffers = %u\n", limits->maxDescriptorSetUniformBuffers ); 15543c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetUniformBuffersDynamic = %u\n", limits->maxDescriptorSetUniformBuffersDynamic ); 15553c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffers = %u\n", limits->maxDescriptorSetStorageBuffers ); 15563c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageBuffersDynamic = %u\n", limits->maxDescriptorSetStorageBuffersDynamic ); 15573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetSampledImages = %u\n", limits->maxDescriptorSetSampledImages ); 15583c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetStorageImages = %u\n", limits->maxDescriptorSetStorageImages ); 15593c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDescriptorSetInputAttachments = %u\n", limits->maxDescriptorSetInputAttachments ); 15603c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputAttributes = %u\n", limits->maxVertexInputAttributes ); 15613c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexInputBindings = %u\n", limits->maxVertexInputBindings ); 15627dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); 15637dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); 15643c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxVertexOutputComponents = %u\n", limits->maxVertexOutputComponents ); 15653c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationGenerationLevel = %u\n", limits->maxTessellationGenerationLevel ); 15663c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationPatchSize = %u\n", limits->maxTessellationPatchSize ); 15673c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexInputComponents = %u\n", limits->maxTessellationControlPerVertexInputComponents ); 15683c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerVertexOutputComponents = %u\n", limits->maxTessellationControlPerVertexOutputComponents); 15693c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlPerPatchOutputComponents = %u\n", limits->maxTessellationControlPerPatchOutputComponents ); 15703c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationControlTotalOutputComponents = %u\n", limits->maxTessellationControlTotalOutputComponents ); 15713c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationInputComponents = %u\n", limits->maxTessellationEvaluationInputComponents ); 15723c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxTessellationEvaluationOutputComponents = %u\n", limits->maxTessellationEvaluationOutputComponents ); 15733c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryShaderInvocations = %u\n", limits->maxGeometryShaderInvocations ); 15743c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryInputComponents = %u\n", limits->maxGeometryInputComponents ); 15753c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputComponents = %u\n", limits->maxGeometryOutputComponents ); 15763c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryOutputVertices = %u\n", limits->maxGeometryOutputVertices ); 15773c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxGeometryTotalOutputComponents = %u\n", limits->maxGeometryTotalOutputComponents ); 15783c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentInputComponents = %u\n", limits->maxFragmentInputComponents ); 15793c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentOutputAttachments = %u\n", limits->maxFragmentOutputAttachments ); 15803c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentDualSrcAttachments = %u\n", limits->maxFragmentDualSrcAttachments ); 15813c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFragmentCombinedOutputResources = %u\n", limits->maxFragmentCombinedOutputResources ); 15827dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); 15833c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[0] = %u\n", limits->maxComputeWorkGroupCount[0] ); 15843c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[1] = %u\n", limits->maxComputeWorkGroupCount[1] ); 15853c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupCount[2] = %u\n", limits->maxComputeWorkGroupCount[2] ); 15863c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations ); 15873c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[0] = %u\n", limits->maxComputeWorkGroupSize[0] ); 15883c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[1] = %u\n", limits->maxComputeWorkGroupSize[1] ); 15893c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxComputeWorkGroupSize[2] = %u\n", limits->maxComputeWorkGroupSize[2] ); 15903c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelPrecisionBits = %u\n", limits->subPixelPrecisionBits ); 15913c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubTexelPrecisionBits = %u\n", limits->subTexelPrecisionBits ); 15923c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmipmapPrecisionBits = %u\n", limits->mipmapPrecisionBits ); 15933c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndexedIndexValue = %u\n", limits->maxDrawIndexedIndexValue ); 15943c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxDrawIndirectCount = %u\n", limits->maxDrawIndirectCount ); 15957dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); 15967dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); 15973c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewports = %u\n", limits->maxViewports ); 15983c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[0] = %u\n", limits->maxViewportDimensions[0] ); 15993c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxViewportDimensions[1] = %u\n", limits->maxViewportDimensions[1] ); 16008a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tviewportBoundsRange[0] =%13f\n", limits->viewportBoundsRange[0] ); 16018a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tviewportBoundsRange[1] =%13f\n", limits->viewportBoundsRange[1] ); 16023c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tviewportSubPixelBits = %u\n", limits->viewportSubPixelBits ); 16033ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); 16043ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); 16053ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); 16063ffcd73338dfeb8c3d9da4f5ba388311aad0d49fChia-I Wu printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); 16078a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminTexelOffset =%3d\n", limits->minTexelOffset ); 16088a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxTexelOffset =%3d\n", limits->maxTexelOffset ); 16098a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminTexelGatherOffset =%3d\n", limits->minTexelGatherOffset ); 16108a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxTexelGatherOffset =%3d\n", limits->maxTexelGatherOffset ); 16118a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tminInterpolationOffset =%9f\n", limits->minInterpolationOffset ); 16128a0cc4ba66ff6142eb4794e1f766cee5a4bd0349Rene Lindsay printf("\t\tmaxInterpolationOffset =%9f\n", limits->maxInterpolationOffset ); 16133c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsubPixelInterpolationOffsetBits = %u\n", limits->subPixelInterpolationOffsetBits ); 16143c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferWidth = %u\n", limits->maxFramebufferWidth ); 16153c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferHeight = %u\n", limits->maxFramebufferHeight ); 16163c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxFramebufferLayers = %u\n", limits->maxFramebufferLayers ); 16173c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferColorSampleCounts = %u\n", limits->framebufferColorSampleCounts ); 16183c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferDepthSampleCounts = %u\n", limits->framebufferDepthSampleCounts ); 16193c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferStencilSampleCounts = %u\n", limits->framebufferStencilSampleCounts ); 16203c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tframebufferNoAttachmentsSampleCounts = %u\n", limits->framebufferNoAttachmentsSampleCounts ); 16213c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxColorAttachments = %u\n", limits->maxColorAttachments ); 16223c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageColorSampleCounts = %u\n", limits->sampledImageColorSampleCounts ); 16233c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageDepthSampleCounts = %u\n", limits->sampledImageDepthSampleCounts ); 16243c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageStencilSampleCounts = %u\n", limits->sampledImageStencilSampleCounts ); 16253c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tsampledImageIntegerSampleCounts = %u\n", limits->sampledImageIntegerSampleCounts ); 16263c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tstorageImageSampleCounts = %u\n", limits->storageImageSampleCounts ); 16273c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxSampleMaskWords = %u\n", limits->maxSampleMaskWords ); 1628fef7f0877d971c6e3467591da1128c8909fa2cedJon Ashburn printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); 16293c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\ttimestampPeriod = %f\n", limits->timestampPeriod ); 16303c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxClipDistances = %u\n", limits->maxClipDistances ); 16313c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCullDistances = %u\n", limits->maxCullDistances ); 16323c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tmaxCombinedClipAndCullDistances = %u\n", limits->maxCombinedClipAndCullDistances ); 16333c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\t\tdiscreteQueuePriorities = %u\n", limits->discreteQueuePriorities ); 16347dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); 16357dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); 16367dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); 16377dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthRange[1] = %f\n", limits->lineWidthRange[1] ); 16387dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tpointSizeGranularity = %f\n", limits->pointSizeGranularity ); 16397dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski printf("\t\tlineWidthGranularity = %f\n", limits->lineWidthGranularity ); 16403c332106cb0750f6a5a34f58a2e0735635ee7e97Chia-I Wu printf("\t\tstrictLines = %u\n", limits->strictLines ); 1641a3939fcc66a34d14b3a473441b27d7e341515004Chia-I Wu printf("\t\tstandardSampleLocations = %u\n", limits->standardSampleLocations ); 1642ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyOffsetAlignment ); 1643ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\toptimalBufferCopyRowPitchAlignment = 0x%" PRIxLEAST64 "\n", limits->optimalBufferCopyRowPitchAlignment ); 1644ee0eaa1efc64c22968945a7b4bb27535fa04a510Chia-I Wu printf("\t\tnonCoherentAtomSize = 0x%" PRIxLEAST64 "\n", limits->nonCoherentAtomSize ); 1645d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1646d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1647f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpProps(const struct AppGpu *gpu) 164818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter{ 164918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkPhysicalDeviceProperties *props = &gpu->props; 16503c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t apiVersion=props->apiVersion; 16513c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t major = VK_VERSION_MAJOR(apiVersion); 16523c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t minor = VK_VERSION_MINOR(apiVersion); 16533c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const uint32_t patch = VK_VERSION_PATCH(apiVersion); 165418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1655825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceProperties:\n"); 1656825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("===========================\n"); 16573c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); 16583c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n",props->driverVersion, props->driverVersion); 16593c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tvendorID = 0x%04x\n", props->vendorID); 16603c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceID = 0x%04x\n", props->deviceID); 1661f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props->deviceType)); 16623c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\tdeviceName = %s\n", props->deviceName); 16637dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 1664f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpLimits(&gpu->props.limits); 1665f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpSparseProps(&gpu->props.sparseProperties); 16667dae6868682383bb8370d45784cbc94f357e745bMark Lobodzinski 166718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 166818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter} 1669481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format on 167018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1671bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinskistatic void AppDumpExtensions(const char *indent, const char *layer_name, const uint32_t extension_count, 1672bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski const VkExtensionProperties *extension_properties) { 16733c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter uint32_t i; 167418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter if (layer_name && (strlen(layer_name) > 0)) { 167518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s%s Extensions", indent, layer_name); 167618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } else { 1677cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("%sExtensions", indent); 16783c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter } 167918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\tcount = %d\n", extension_count); 1680481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (i = 0; i < extension_count; i++) { 168118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter VkExtensionProperties const *ext_prop = &extension_properties[i]; 16823c1ccf58f9f38b00cf0409e72fc65349aa11e742Courtney Goeltzenleuchter 168318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("%s\t", indent); 1684bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("%-36s: extension revision %2d\n", ext_prop->extensionName, ext_prop->specVersion); 1685ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter } 168618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1687ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter} 1688ff87c822214d31c677026f8dcf53d8f953b395fdCourtney Goeltzenleuchter 1689f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id) { 1690ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop const VkQueueFamilyProperties *props = &gpu->queue_props[id]; 1691190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1692825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkQueueFamilyProperties[%d]:\n", id); 1693a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("===========================\n"); 1694cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski char *sep = ""; // separator character 1695a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\tqueueFlags = "); 16967fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { 16977fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("GRAPHICS"); 16987fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 16997fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 17007fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { 17017fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sCOMPUTE", sep); 17027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 17037fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 17047fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { 17057fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sTRANSFER", sep); 17067fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay sep = " | "; 17077fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 17087fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { 17097fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay printf("%sSPARSE", sep); 17107fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay } 1711a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay printf("\n"); 1712a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1713481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tqueueCount = %u\n", props->queueCount); 1714481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\ttimestampValidBits = %u\n", props->timestampValidBits); 1715bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props->minImageTransferGranularity.width, 1716bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); 171718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1718d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1719d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1720bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// This prints a number of bytes in a human-readable format according to prefixes of the International System of Quantities (ISQ), 1721bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// defined in ISO/IEC 80000. The prefixes used here are not SI prefixes, but rather the binary prefixes based on powers of 1024 1722bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus// (kibi-, mebi-, gibi- etc.). 1723bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus#define kBufferSize 32 1724bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1725bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markusstatic char *HumanReadable(const size_t sz) { 1726bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus const char prefixes[] = "KMGTPEZY"; 1727bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char buf[kBufferSize]; 1728bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus int which = -1; 1729bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus double result = (double)sz; 1730bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus while (result > 1024 && which < 7) { 1731bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus result /= 1024; 1732bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus ++which; 1733bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus } 1734bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1735bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char unit[] = "\0i"; 1736bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus if (which >= 0) { 1737bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus unit[0] = prefixes[which]; 1738bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus } 1739bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus snprintf(buf, kBufferSize, "%.2f %sB", result, unit); 1740bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus return strndup(buf, kBufferSize); 1741bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus} 1742bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus 1743f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDumpMemoryProps(const struct AppGpu *gpu) { 17448205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; 1745d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1746825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("VkPhysicalDeviceMemoryProperties:\n"); 1747825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("=================================\n"); 1748825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); 1749723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryTypeCount; i++) { 1750d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\tmemoryTypes[%u] :\n", i); 1751723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); 1752bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); 17537fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay 17547fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // Print each named flag, if it is set. 17557fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay VkFlags flags = props->memoryTypes[i].propertyFlags; 1756cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define PRINT_FLAG(FLAG) \ 1757cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (flags & FLAG) printf("\t\t\t" #FLAG "\n"); 17583c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) 17593c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) 17603c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) 17613c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_CACHED_BIT) 17623c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay PRINT_FLAG(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) 17637fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay#undef PRINT_FLAG 1764723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 17653c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay printf("\n"); 1766481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); 1767723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski for (uint32_t i = 0; i < props->memoryHeapCount; i++) { 1768d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\tmemoryHeaps[%u] :\n", i); 17693c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay const VkDeviceSize memSize = props->memoryHeaps[i].size; 1770bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus char *mem_size_human_readable = HumanReadable((const size_t)memSize); 1771bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER " (0x%" PRIxLEAST64 ") (%s)\n", (size_t)memSize, memSize, 1772bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus mem_size_human_readable); 1773bcc5c8ef92b67f36ba151270cce72f595ab27beaTobias Markus free(mem_size_human_readable); 17743c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 1775f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg VkMemoryHeapFlags heap_flags = props->memoryHeaps[i].flags; 1776d2de12104f9a2b96384cdd8c606b11edc7712e8fMark Lobodzinski printf("\t\tflags:\n\t\t\t"); 1777bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf((heap_flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" : "None\n"); 1778723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski } 177918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter fflush(stdout); 1780d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1781d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1782f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunargstatic void AppGpuDump(const struct AppGpu *gpu) { 1783e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 1784190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1785cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\nDevice Properties and Extensions :\n"); 17869652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("==================================\n"); 1787190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("GPU%u\n", gpu->id); 1788f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpProps(gpu); 1789190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1790bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("", "Device", gpu->device_extension_count, gpu->device_extensions); 179118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter printf("\n"); 1792190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu for (i = 0; i < gpu->queue_count; i++) { 1793f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpQueueProps(gpu, i); 1794190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1795190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1796f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpMemoryProps(gpu); 1797190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu printf("\n"); 1798f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDumpFeatures(gpu); 1799a048b3146ed9bc094adf4d6ba7355cd8a5ef7008Chris Forbes printf("\n"); 1800f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDevDump(&gpu->dev); 1801d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu} 1802d4bae362585dff8c456fb3b906512b4d2ef17fe8Chia-I Wu 1803a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1804a3b7170656404199592bb65040621772f299a7f3Hugo Landau// Enlarges the console window to have a large scrollback size. 1805a3b7170656404199592bb65040621772f299a7f3Hugo Landaustatic void ConsoleEnlarge() { 1806f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE); 1807a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1808a3b7170656404199592bb65040621772f299a7f3Hugo Landau // make the console window bigger 1809a3b7170656404199592bb65040621772f299a7f3Hugo Landau CONSOLE_SCREEN_BUFFER_INFO csbi; 1810f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg COORD buffer_size; 1811f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg if (GetConsoleScreenBufferInfo(console_handle, &csbi)) { 1812f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg buffer_size.X = csbi.dwSize.X + 30; 1813f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg buffer_size.Y = 20000; 1814f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg SetConsoleScreenBufferSize(console_handle, buffer_size); 1815a3b7170656404199592bb65040621772f299a7f3Hugo Landau } 1816a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1817a3b7170656404199592bb65040621772f299a7f3Hugo Landau SMALL_RECT r; 1818a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Left = r.Top = 0; 1819a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Right = csbi.dwSize.X - 1 + 30; 1820a3b7170656404199592bb65040621772f299a7f3Hugo Landau r.Bottom = 50; 1821f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg SetConsoleWindowInfo(console_handle, true, &r); 1822a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1823a3b7170656404199592bb65040621772f299a7f3Hugo Landau // change the console window title 1824a3b7170656404199592bb65040621772f299a7f3Hugo Landau SetConsoleTitle(TEXT(APP_SHORT_NAME)); 1825a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1826a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1827a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1828481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint main(int argc, char **argv) { 18299784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t vulkan_major, vulkan_minor, vulkan_patch; 1830242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz struct AppGpu *gpus; 1831242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz VkPhysicalDevice *objs; 18329784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t gpu_count; 1833382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkResult err; 1834f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg struct AppInstance inst; 1835190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1836a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1837cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) ConsoleEnlarge(); 1838a3b7170656404199592bb65040621772f299a7f3Hugo Landau#endif 1839a3b7170656404199592bb65040621772f299a7f3Hugo Landau 18409784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_major = VK_VERSION_MAJOR(VK_API_VERSION_1_0); 18419784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_minor = VK_VERSION_MINOR(VK_API_VERSION_1_0); 18429784e78683f658f304062235ceb2dd2c2652c357Karl Schultz vulkan_patch = VK_VERSION_PATCH(VK_HEADER_VERSION); 18433c877cdec3dc56f422fcc2e6ffa11dd7cd666eb0Rene Lindsay 18447b4e9ec8af004566938363ba8ff06df5b88d201cDavid Pinedo printf("===========\n"); 1845481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("VULKAN INFO\n"); 1846b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo printf("===========\n\n"); 18479784e78683f658f304062235ceb2dd2c2652c357Karl Schultz printf("Vulkan API Version: %d.%d.%d\n\n", vulkan_major, vulkan_minor, vulkan_patch); 1848b5ec4c29f35458d9a072956e983563a35d9c2416David Pinedo 1849f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateInstance(&inst); 185018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1851cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\nInstance Extensions:\n"); 18529652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("====================\n"); 1853bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("", "Instance", inst.global_extension_count, inst.global_extensions); 1854825cc51df04b93f130e48788ced8e63937272b4dMark Lobodzinski 1855cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, NULL); 1856cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 1857242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz objs = malloc(sizeof(objs[0]) * gpu_count); 1858cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!objs) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 1859cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay err = vkEnumeratePhysicalDevices(inst.instance, &gpu_count, objs); 1860cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (err) ERR_EXIT(err); 1861cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 1862242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz gpus = malloc(sizeof(gpus[0]) * gpu_count); 1863cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!gpus) ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); 18649784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 18655d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager AppGpuInit(&gpus[i], &inst, i, objs[i]); 1866cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n\n"); 1867cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1868cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 1869cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay //---Layer-Device-Extensions--- 1870cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("Layers: count = %d\n", inst.global_layer_count); 1871cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("=======\n"); 187218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < inst.global_layer_count; i++) { 18739784e78683f658f304062235ceb2dd2c2652c357Karl Schultz uint32_t layer_major, layer_minor, layer_patch; 187418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter char spec_version[64], layer_version[64]; 1875bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski VkLayerProperties const *layer_prop = &inst.global_layers[i].layer_properties; 187618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 18779784e78683f658f304062235ceb2dd2c2652c357Karl Schultz ExtractVersion(layer_prop->specVersion, &layer_major, &layer_minor, &layer_patch); 18789784e78683f658f304062235ceb2dd2c2652c357Karl Schultz snprintf(spec_version, sizeof(spec_version), "%d.%d.%d", layer_major, layer_minor, layer_patch); 1879bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski snprintf(layer_version, sizeof(layer_version), "%d", layer_prop->implementationVersion); 1880bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski printf("%s (%s) Vulkan version %s, layer version %s\n", layer_prop->layerName, (char *)layer_prop->description, 1881481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz spec_version, layer_version); 188218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 1883bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppDumpExtensions("\t", "Layer", inst.global_layers[i].extension_count, inst.global_layers[i].extension_properties); 1884190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1885f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg char *layer_name = inst.global_layers[i].layer_properties.layerName; 18869652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("\tDevices \tcount = %d\n", gpu_count); 1887cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay for (uint32_t j = 0; j < gpu_count; j++) { 1888cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\t\tGPU id : %u (%s)\n", j, gpus[j].props.deviceName); 18899652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay uint32_t count = 0; 18909652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay VkExtensionProperties *props; 1891bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski AppGetPhysicalDeviceLayerExtensions(&gpus[j], layer_name, &count, &props); 1892f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDumpExtensions("\t\t", "Layer-Device", count, props); 1893cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay free(props); 1894cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1895cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n"); 1896190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu } 1897cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay fflush(stdout); 1898cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay //----------------------------- 1899190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 19007b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("Presentable Surfaces:\n"); 19017b3aadea3a889f1e04529f50649124277a47db46joey-lunarg printf("=====================\n"); 19027fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.width = 256; 19037fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay inst.height = 256; 1904f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg int format_count = 0; 1905f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg int present_mode_count = 0; 1906a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 1907b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) 1908b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour if (getenv("DISPLAY") == NULL) { 1909b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour printf("'DISPLAY' environment variable not set... Exiting!\n"); 1910b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour fflush(stdout); 1911b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour exit(1); 1912b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour } 1913b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#endif 19147fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--WIN32-- 1915a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#ifdef VK_USE_PLATFORM_WIN32_KHR 19165d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, inst.inst_extensions, inst.inst_extensions_count)) { 1917f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateWin32Window(&inst); 19189784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1919f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateWin32Surface(&inst); 19209652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 19219652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 1922f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1923f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 19245d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager AppDumpSurfaceCapabilities(&inst, &gpus[i]); 1925f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 19269652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1927f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyWin32Window(&inst); 1928a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 19297fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XCB-- 1930b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XCB_KHR 19315d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_XCB_SURFACE_EXTENSION_NAME, inst.inst_extensions, inst.inst_extensions_count)) { 1932f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXcbWindow(&inst); 19339784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1934f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXcbSurface(&inst); 19359652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 19369652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_XCB_SURFACE_EXTENSION_NAME); 1937f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1938f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 19395d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager AppDumpSurfaceCapabilities(&inst, &gpus[i]); 1940f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 19419652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1942f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyXcbWindow(&inst); 1943a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 19447fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay//--XLIB-- 1945b6bbc99f21cbe1698a6de16d2e24d667cc1da116Tony Barbour#elif VK_USE_PLATFORM_XLIB_KHR 19465d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager if (CheckExtensionEnabled(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, inst.inst_extensions, inst.inst_extensions_count)) { 1947f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXlibWindow(&inst); 19489784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1949f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppCreateXlibSurface(&inst); 19509652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); 19519652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay printf("Surface type : %s\n", VK_KHR_XLIB_SURFACE_EXTENSION_NAME); 1952f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg format_count += AppDumpSurfaceFormats(&inst, &gpus[i]); 1953f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg present_mode_count += AppDumpSurfacePresentModes(&inst, &gpus[i]); 19545d8d6b4f93daceacca1de36be6de935a8264caf6Jeremy Kniager AppDumpSurfaceCapabilities(&inst, &gpus[i]); 1955f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroySurface(&inst); 19569652e55fbd98d82c0013eb812892528ea367f035Rene Lindsay } 1957f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyXlibWindow(&inst); 1958a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay } 1959a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay#endif 19607fb1e0197fa66f1e61671d212fd1de2b21e718cdRene Lindsay // TODO: Android / Wayland / MIR 1961cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!format_count && !present_mode_count) printf("None found\n"); 1962a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay //--------- 1963a155d62f73c03dea7315ba34a7582239fdfc85d2Rene Lindsay 19649784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) { 1965f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppGpuDump(&gpus[i]); 1966cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay printf("\n\n"); 1967cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay } 1968cb6b5ca5918ef51a9c435f80aaaedc69b7978e41Rene Lindsay 19699784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < gpu_count; i++) AppGpuDestroy(&gpus[i]); 1970242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz free(gpus); 1971242a9c9379564b08b9b8ae197c4088e53ea49015Karl Schultz free(objs); 1972190ebdcce84b767d8db7a42383c834dc067b3e77Chia-I Wu 1973f0743b0e79005e46a5f9eea2f1443daa3fcfe828joey-lunarg AppDestroyInstance(&inst); 19740b9a73720abbc3e1229507a4a97e0209976b7610Chia-I Wu 1975ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott fflush(stdout); 1976a3b7170656404199592bb65040621772f299a7f3Hugo Landau#ifdef _WIN32 1977cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (ConsoleIsExclusive()) Sleep(INFINITE); 1978ea95f5c3967480a57ceb03a98e8370225094ce42Ian Elliott#endif 1979a3b7170656404199592bb65040621772f299a7f3Hugo Landau 1980a3b7170656404199592bb65040621772f299a7f3Hugo Landau return 0; 1981a3b7170656404199592bb65040621772f299a7f3Hugo Landau} 1982