1a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong/* 2cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Copyright (c) 2015-2016 The Khronos Group Inc. 3cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Copyright (c) 2015-2016 Valve Corporation 4cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Copyright (c) 2015-2016 LunarG, Inc. 5cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * 6cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Licensed under the Apache License, Version 2.0 (the "License"); 7cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * you may not use this file except in compliance with the License. 8cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * You may obtain a copy of the License at 9cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * 10cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * http://www.apache.org/licenses/LICENSE-2.0 11cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * 12cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Unless required by applicable law or agreed to in writing, software 13cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * distributed under the License is distributed on an "AS IS" BASIS, 14cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * See the License for the specific language governing permissions and 16cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * limitations under the License. 17cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * 18cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Chia-I Wu <olv@lunarg.com> 19cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> 20cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Ian Elliott <ian@LunarG.com> 21cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Ian Elliott <ianelliott@google.com> 22cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Jon Ashburn <jon@lunarg.com> 23cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Gwan-gyeong Mun <elongbug@gmail.com> 24cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Tony Barbour <tony@LunarG.com> 25cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott * Author: Bill Hollings <bill.hollings@brenwill.com> 26cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott */ 27481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 281722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter#define _GNU_SOURCE 294e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#include <stdio.h> 30cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#include <stdarg.h> 314e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#include <stdlib.h> 324e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#include <string.h> 334e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#include <stdbool.h> 344e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#include <assert.h> 35ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter#include <signal.h> 36787b627282489b56b4ed111f152008fe66d33488Mun Gwan-gyeong#if defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR) 37a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour#include <X11/Xutil.h> 38ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 39ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek#include <linux/input.h> 40a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour#endif 414e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 42e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott#ifdef _WIN32 43e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott#pragma comment(linker, "/subsystem:windows") 44e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott#define APP_NAME_STR_LEN 80 45cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#endif // _WIN32 46e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 470394191ea288611bb919194d46fde101947df54aTony Barbour#if defined(VK_USE_PLATFORM_MIR_KHR) 480394191ea288611bb919194d46fde101947df54aTony Barbour#warning "Cube does not have code for Mir at this time" 490394191ea288611bb919194d46fde101947df54aTony Barbour#endif 500394191ea288611bb919194d46fde101947df54aTony Barbour 51e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#ifdef ANDROID 52e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#include "vulkan_wrapper.h" 53e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#else 54329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vulkan.h> 55e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#endif 56b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott 57a31fe0bdb3bd5ce67f8bb330264941b196c22677David Pinedo#include <vulkan/vk_sdk_platform.h> 586f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter#include "linmath.h" 596f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter 60cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#include "gettime.h" 61cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#include "inttypes.h" 62cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#define MILLION 1000000L 63cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#define BILLION 1000000000L 64cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 654e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter#define DEMO_TEXTURE_COUNT 1 664e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_SHORT_NAME "cube" 674e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott#define APP_LONG_NAME "The Vulkan Cube Demo Program" 684e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 696b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour// Allow a maximum of two outstanding presentation operations. 706b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour#define FRAME_LAG 2 716b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 728c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) 738c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter 7422a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__) 7522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused)) 7622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else 7722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY 7822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif 7922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour 80a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#if defined(__GNUC__) 81a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#define UNUSED __attribute__((unused)) 82a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#else 83a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#define UNUSED 84a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#endif 85a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 86caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott#ifdef _WIN32 8745c0906c01533675d27207ff07212adf80ab5187Tony Barbourbool in_callback = false; 88cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define ERR_EXIT(err_msg, err_class) \ 89cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 90cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!demo->suppress_popups) MessageBox(NULL, err_msg, err_class, MB_OK); \ 91cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski exit(1); \ 92481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 93cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottvoid DbgMsg(char *fmt, ...) { 94cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_list va; 95cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_start(va, fmt); 96cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott printf(fmt, va); 97cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott fflush(stdout); 98cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_end(va); 99cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 100481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 10171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined __ANDROID__ 10271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#include <android/log.h> 103cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define ERR_EXIT(err_msg, err_class) \ 104cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 105cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ((void)__android_log_print(ANDROID_LOG_INFO, "Cube", err_msg)); \ 106cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski exit(1); \ 10771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } while (0) 108cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#ifdef VARARGS_WORKS_ON_ANDROID 109cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottvoid DbgMsg(const char *fmt, ...) { 110cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_list va; 111cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_start(va, fmt); 112cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott __android_log_print(ANDROID_LOG_INFO, "Cube", fmt, va); 113cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_end(va); 114cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 115cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#else // VARARGS_WORKS_ON_ANDROID 116cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#define DbgMsg(fmt, ...) \ 117cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott do { \ 118cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott ((void)__android_log_print(ANDROID_LOG_INFO, "Cube", fmt, ##__VA_ARGS__)); \ 119cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } while (0) 120cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott#endif // VARARGS_WORKS_ON_ANDROID 12171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#else 122cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define ERR_EXIT(err_msg, err_class) \ 123cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski do { \ 124c0ee2e5a90b47a08692aae4b308bc3884eff0d5fRobert Morell printf("%s\n", err_msg); \ 125cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski fflush(stdout); \ 126cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski exit(1); \ 127481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (0) 128cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottvoid DbgMsg(char *fmt, ...) { 129cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_list va; 130cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_start(va, fmt); 131cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott printf(fmt, va); 132cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott fflush(stdout); 133cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott va_end(va); 134cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 13571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 136caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott 137cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ 138cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski { \ 139cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski demo->fp##entrypoint = (PFN_vk##entrypoint)vkGetInstanceProcAddr(inst, "vk" #entrypoint); \ 140cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (demo->fp##entrypoint == NULL) { \ 141cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ERR_EXIT("vkGetInstanceProcAddr failed to find vk" #entrypoint, "vkGetInstanceProcAddr Failure"); \ 142cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski } \ 143481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } 144e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 145ccfa841bf1082aa33479ab7691c3042bf57b9c4bJon Ashburnstatic PFN_vkGetDeviceProcAddr g_gdpa = NULL; 146ccfa841bf1082aa33479ab7691c3042bf57b9c4bJon Ashburn 147cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski#define GET_DEVICE_PROC_ADDR(dev, entrypoint) \ 148cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski { \ 149cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (!g_gdpa) g_gdpa = (PFN_vkGetDeviceProcAddr)vkGetInstanceProcAddr(demo->inst, "vkGetDeviceProcAddr"); \ 150cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski demo->fp##entrypoint = (PFN_vk##entrypoint)g_gdpa(dev, "vk" #entrypoint); \ 151cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski if (demo->fp##entrypoint == NULL) { \ 152cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ERR_EXIT("vkGetDeviceProcAddr failed to find vk" #entrypoint, "vkGetDeviceProcAddr Failure"); \ 153cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski } \ 154481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } 1551b6de09a29e07051d5d097fdb7879f6909ec2d77Ian Elliott 1567e33498fda8634e45d0f5790bbe099f84e31b601Courtney Goeltzenleuchter/* 15740a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter * structure to track all objects related to a texture. 15840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter */ 159bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchterstruct texture_object { 160382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkSampler sampler; 16140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 162382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImage image; 163382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageLayout imageLayout; 164bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 1651f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkMemoryAllocateInfo mem_alloc; 1662318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski VkDeviceMemory mem; 167382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageView view; 16840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter int32_t tex_width, tex_height; 16940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter}; 17040a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 171481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic char *tex_files[] = {"lunarg.ppm"}; 1721722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 17351940e40346835ebbf3a3fb8c06c07a3eb518e7bKarl Schultzstatic int validation_error = 0; 17451940e40346835ebbf3a3fb8c06c07a3eb518e7bKarl Schultz 1759cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterstruct vktexcube_vs_uniform { 176e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter // Must start with MVP 177481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float mvp[4][4]; 178481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float position[12 * 3][4]; 179481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float attr[12 * 3][4]; 180e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter}; 1816f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter 1824e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter//-------------------------------------------------------------------------------------- 1834e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter// Mesh and VertexFormat Data 1844e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter//-------------------------------------------------------------------------------------- 185481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format off 186e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic const float g_vertex_buffer_data[] = { 187c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f,-1.0f, // -X side 1881722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f,-1.0f, 1.0f, 1891722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f, 1.0f, 1.0f, 190c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f, 1.0f, 1.0f, 1911722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f, 1.0f,-1.0f, 1921722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f,-1.0f,-1.0f, 1931722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 194c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f,-1.0f, // -Z side 1951722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f,-1.0f, 1961722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f,-1.0f, 197c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f,-1.0f, 1981722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f, 1.0f,-1.0f, 199ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 1.0f, 1.0f,-1.0f, 2001722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 201c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f,-1.0f, // -Y side 2021722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f,-1.0f, 203ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 1.0f,-1.0f, 1.0f, 204c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f,-1.0f, 2051722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f, 1.0f, 206ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan -1.0f,-1.0f, 1.0f, 2071722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 208c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f, 1.0f,-1.0f, // +Y side 2091722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f, 1.0f, 1.0f, 2101722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f, 1.0f, 211c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f, 1.0f,-1.0f, 2121722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f, 1.0f, 213ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 1.0f, 1.0f,-1.0f, 2141722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 215c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 1.0f,-1.0f, // +X side 2161722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f, 1.0f, 2171722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f, 1.0f, 218c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f,-1.0f, 1.0f, 2191722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f,-1.0f, 2201722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f,-1.0f, 2211722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 222c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f, 1.0f, 1.0f, // +Z side 2231722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter -1.0f,-1.0f, 1.0f, 224ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 1.0f, 1.0f, 1.0f, 225c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu -1.0f,-1.0f, 1.0f, 2261722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f,-1.0f, 1.0f, 2271722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 1.0f, 1.0f, 228e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter}; 229e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 230e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinskistatic const float g_uv_buffer_data[] = { 231cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, // -X side 232ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 1.0f, 1.0f, 2331722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 0.0f, 2341722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 0.0f, 235ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 0.0f, 0.0f, 2361722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 0.0f, 1.0f, 2371722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 238cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 1.0f, // -Z side 239c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 0.0f, 0.0f, 240cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 241c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 1.0f, 2421722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1.0f, 0.0f, 243cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 0.0f, 244c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 245cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, // -Y side 246cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 1.0f, 247cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 248cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, 249ea3945cf2368b89cb47346576a7bc18435090348Mike Stroyan 0.0f, 1.0f, 250c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 0.0f, 0.0f, 251cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 252cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, // +Y side 253c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 0.0f, 0.0f, 254cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 255c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 0.0f, 256cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 257c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 1.0f, 2583eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 259cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, // +X side 2603eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 0.0f, 0.0f, 261cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 262cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 263c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 1.0f, 264c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 0.0f, 265cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 266cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 0.0f, // +Z side 267cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 268cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, 269cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 0.0f, 1.0f, 270c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu 1.0f, 1.0f, 271cb7f374bc05ba8c0a04aa11557d392ed417ad8e8Rene Lindsay 1.0f, 0.0f, 272e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter}; 273481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// clang-format on 274e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 275481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzvoid dumpMatrix(const char *note, mat4x4 MVP) { 276e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter int i; 277e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 278e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter printf("%s: \n", note); 279481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (i = 0; i < 4; i++) { 280e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter printf("%f, %f, %f, %f\n", MVP[i][0], MVP[i][1], MVP[i][2], MVP[i][3]); 281e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter } 282e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter printf("\n"); 283e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter fflush(stdout); 284e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter} 285e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 286481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzvoid dumpVec4(const char *note, vec4 vector) { 287e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter printf("%s: \n", note); 288481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz printf("%f, %f, %f, %f\n", vector[0], vector[1], vector[2], vector[3]); 289e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter printf("\n"); 290e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter fflush(stdout); 291e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter} 292e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 293bc9caa57c5583dfdf05198e78b78a7cb361da16cMark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, 294bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg, 295bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski void *pUserData) { 296ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter#ifndef WIN32 297ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter raise(SIGTRAP); 298ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter#else 299ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter DebugBreak(); 300ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter#endif 301ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter 302ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter return false; 303ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter} 304ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter 305788a43f8e47fb32cf12aef25c5eab274a016aef3Mark Lobodzinskitypedef struct { 306e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott VkImage image; 3071f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkCommandBuffer cmd; 3081ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkCommandBuffer graphics_to_present_cmd; 3091856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter VkImageView view; 310c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkBuffer uniform_buffer; 311c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkDeviceMemory uniform_memory; 312c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkFramebuffer framebuffer; 313c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkDescriptorSet descriptor_set; 314c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour} SwapchainImageResources; 315e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 3164e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchterstruct demo { 31771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 318e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott#define APP_NAME_STR_LEN 80 319cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HINSTANCE connection; // hInstance - Windows Instance 320cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski char name[APP_NAME_STR_LEN]; // Name to put on the window/icon 321cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski HWND window; // hWnd - window handle 322cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski POINT minsize; // minimum window size 323028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 324bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski Display *display; 325a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour Window xlib_window; 326a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour Atom xlib_wm_delete_window; 327028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XCB_KHR) 328bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski Display *display; 3294e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_connection_t *connection; 3304e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_screen_t *screen; 331a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour xcb_window_t xcb_window; 3325b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu xcb_intern_atom_reply_t *atom_wm_delete_window; 333a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 334a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_display *display; 335a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_registry *registry; 336a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_compositor *compositor; 337a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_surface *window; 338a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_shell *shell; 339a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_shell_surface *shell_surface; 340ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct wl_seat *seat; 341ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct wl_pointer *pointer; 342ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct wl_keyboard *keyboard; 3430394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 34471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 345bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski ANativeWindow *window; 3463cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) 3473cc29e78287eb578472567eaaca85f89690144b4Bill Hollings void *window; 34871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 349b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VkSurfaceKHR surface; 35075db0326f1f102a15a4e59504fe6984b64d0d137Cody Northrop bool prepared; 35140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter bool use_staging_buffer; 3521ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour bool separate_present_queue; 3534e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 35402f7d213d30762f60b3f15207e497574080ee038Ian Elliott bool VK_KHR_incremental_present_enabled; 35502f7d213d30762f60b3f15207e497574080ee038Ian Elliott 356cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott bool VK_GOOGLE_display_timing_enabled; 357cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott bool syncd_with_actual_presents; 358cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t refresh_duration; 359cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t refresh_duration_multiplier; 360cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t target_IPD; // image present duration (inverse of frame rate) 361cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t prev_desired_present_time; 362cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint32_t next_present_id; 363cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint32_t last_early_id; // 0 if no early images 364cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint32_t last_late_id; // 0 if no late images 365cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 366382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkInstance inst; 3678205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour VkPhysicalDevice gpu; 368382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDevice device; 369755151776f6b9a0ab34095b980819e4318a86529Tony Barbour VkQueue graphics_queue; 370755151776f6b9a0ab34095b980819e4318a86529Tony Barbour VkQueue present_queue; 371755151776f6b9a0ab34095b980819e4318a86529Tony Barbour uint32_t graphics_queue_family_index; 372755151776f6b9a0ab34095b980819e4318a86529Tony Barbour uint32_t present_queue_family_index; 3736b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour VkSemaphore image_acquired_semaphores[FRAME_LAG]; 3746b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour VkSemaphore draw_complete_semaphores[FRAME_LAG]; 3756b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour VkSemaphore image_ownership_semaphores[FRAME_LAG]; 376426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour VkPhysicalDeviceProperties gpu_props; 377ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop VkQueueFamilyProperties *queue_props; 378723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski VkPhysicalDeviceMemoryProperties memory_properties; 3794e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 3803d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour uint32_t enabled_extension_count; 3813d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour uint32_t enabled_layer_count; 3823d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour char *extension_names[64]; 38397dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz char *enabled_layers[64]; 3843d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour 3854e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter int width, height; 386382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat format; 387338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkColorSpaceKHR color_space; 388338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott 389bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceSupportKHR fpGetPhysicalDeviceSurfaceSupportKHR; 390bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR fpGetPhysicalDeviceSurfaceCapabilitiesKHR; 391bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfaceFormatsKHR fpGetPhysicalDeviceSurfaceFormatsKHR; 392bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fpGetPhysicalDeviceSurfacePresentModesKHR; 393338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott PFN_vkCreateSwapchainKHR fpCreateSwapchainKHR; 394338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott PFN_vkDestroySwapchainKHR fpDestroySwapchainKHR; 395338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott PFN_vkGetSwapchainImagesKHR fpGetSwapchainImagesKHR; 396338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott PFN_vkAcquireNextImageKHR fpAcquireNextImageKHR; 397338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott PFN_vkQueuePresentKHR fpQueuePresentKHR; 398cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott PFN_vkGetRefreshCycleDurationGOOGLE fpGetRefreshCycleDurationGOOGLE; 399cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott PFN_vkGetPastPresentationTimingGOOGLE fpGetPastPresentationTimingGOOGLE; 400338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott uint32_t swapchainImageCount; 401e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott VkSwapchainKHR swapchain; 402c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour SwapchainImageResources *swapchain_image_resources; 403d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour VkPresentModeKHR presentMode; 4046b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour VkFence fences[FRAME_LAG]; 4056b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour int frame_index; 4064e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 4071f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkCommandPool cmd_pool; 4081ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkCommandPool present_cmd_pool; 4094e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 4104e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter struct { 411382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormat format; 4124e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 413382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImage image; 4141f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkMemoryAllocateInfo mem_alloc; 4152318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski VkDeviceMemory mem; 4161856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter VkImageView view; 4174e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } depth; 4184e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 419bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter struct texture_object textures[DEMO_TEXTURE_COUNT]; 420741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour struct texture_object staging_texture; 4214e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 422cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski VkCommandBuffer cmd; // Buffer for initialization commands 423556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski VkPipelineLayout pipeline_layout; 424382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDescriptorSetLayout desc_layout; 4250d60d274605d3061e5d8ac1cf38e4e9b5ee3ff1aJon Ashburn VkPipelineCache pipelineCache; 42676cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu VkRenderPass render_pass; 427382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkPipeline pipeline; 4284e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 4296f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter mat4x4 projection_matrix; 4306f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter mat4x4 view_matrix; 4316f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter mat4x4 model_matrix; 4326f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter 433e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski float spin_angle; 434e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski float spin_increment; 4353eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter bool pause; 4363eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 4379400f09d3b3369554146ce070eb49d2fea00222cTony Barbour VkShaderModule vert_shader_module; 4389400f09d3b3369554146ce070eb49d2fea00222cTony Barbour VkShaderModule frag_shader_module; 4399400f09d3b3369554146ce070eb49d2fea00222cTony Barbour 440382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkDescriptorPool desc_pool; 44176cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu 4424e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter bool quit; 443eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo int32_t curFrame; 444eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo int32_t frameCount; 4455685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour bool validate; 44608613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis bool validate_checks_disabled; 4473230e58da9373ad93b2cf1ac9d66e7aa5c4e72f3Courtney Goeltzenleuchter bool use_break; 44820a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg bool suppress_popups; 449acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback; 450acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback; 451acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackEXT msg_callback; 452acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter PFN_vkDebugReportMessageEXT DebugReportMessage; 4531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 454e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t current_buffer; 45537a5db39edf36de91652ded72b88d33eec9db3deTony Barbour uint32_t queue_family_count; 4564e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter}; 4574e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 458bc9caa57c5583dfdf05198e78b78a7cb361da16cMark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, 459bc9caa57c5583dfdf05198e78b78a7cb361da16cMark Lobodzinski int32_t msgCode, const char *pLayerPrefix, const char *pMsg, void *pUserData) { 46081fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop // clang-format off 46120a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg char *message = (char *)malloc(strlen(pMsg) + 100); 46220a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg 46320a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg assert(message); 46420a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg 46581fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 46681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop sprintf(message, "INFORMATION: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 46720a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg validation_error = 1; 46820a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 46981fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 47081fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop validation_error = 1; 47181fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) { 472a0508c7a27d892907dbd5fb16b488eba2cd914f1Mike Weiblen sprintf(message, "PERFORMANCE WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 47381fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop validation_error = 1; 47481fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 47581fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 47681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop validation_error = 1; 47781fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 47881fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop sprintf(message, "DEBUG: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 47920a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg validation_error = 1; 48020a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg } else { 48181fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop sprintf(message, "INFORMATION: [%s] Code %d : %s", pLayerPrefix, msgCode, pMsg); 48220a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg validation_error = 1; 48320a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg } 48420a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg 48520a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg#ifdef _WIN32 48681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 48745c0906c01533675d27207ff07212adf80ab5187Tony Barbour in_callback = true; 48820a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg struct demo *demo = (struct demo*) pUserData; 48920a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg if (!demo->suppress_popups) 49020a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg MessageBox(NULL, message, "Alert", MB_OK); 49145c0906c01533675d27207ff07212adf80ab5187Tony Barbour in_callback = false; 49281fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 49348a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop#elif defined(ANDROID) 49481fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 49548a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { 49681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_INFO, APP_SHORT_NAME, "%s", message); 49748a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { 49881fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_WARN, APP_SHORT_NAME, "%s", message); 49948a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) { 50081fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_WARN, APP_SHORT_NAME, "%s", message); 50148a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { 50281fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_ERROR, APP_SHORT_NAME, "%s", message); 50348a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { 50481fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_DEBUG, APP_SHORT_NAME, "%s", message); 50548a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } else { 50681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop __android_log_print(ANDROID_LOG_INFO, APP_SHORT_NAME, "%s", message); 50748a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop } 50881fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 50920a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg#else 51081fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 51120a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg printf("%s\n", message); 51220a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg fflush(stdout); 51381fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 51420a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg#endif 51581fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 51620a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg free(message); 51720a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg 518ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek // clang-format on 51981fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop 52020a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg /* 52120a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg * false indicates that layer should not bail-out of an 52220a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg * API call that had validation failures. This may mean that the 52320a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg * app dies inside the driver due to invalid parameter(s). 52420a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg * That's what would happen without validation layers, so we'll 52520a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg * keep that behavior here. 52620a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg */ 52720a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg return false; 52820a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg} 52920a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg 530cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottbool ActualTimeLate(uint64_t desired, uint64_t actual, uint64_t rdur) { 531cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // The desired time was the earliest time that the present should have 532cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // occured. In almost every case, the actual time should be later than the 533cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // desired time. We should only consider the actual time "late" if it is 534cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // after "desired + rdur". 535cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (actual <= desired) { 536cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // The actual time was before or equal to the desired time. This will 537cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // probably never happen, but in case it does, return false since the 538cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // present was obviously NOT late. 539cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott return false; 540cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 541cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t deadline = actual + rdur; 542cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (actual > deadline) { 543cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott return true; 544cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 545cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott return false; 546cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 547cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 548cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottbool CanPresentEarlier(uint64_t earliest, 549cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t actual, 550cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t margin, 551cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t rdur) { 552cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (earliest < actual) { 553cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Consider whether this present could have occured earlier. Make sure 554cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // that earliest time was at least 2msec earlier than actual time, and 555cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // that the margin was at least 2msec: 556cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t diff = actual - earliest; 557cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if ((diff >= (2 * MILLION)) && (margin >= (2 * MILLION))) { 558cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This present could have occured earlier because both: 1) the 559cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // earliest time was at least 2 msec before actual time, and 2) the 560cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // margin was at least 2msec. 561cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott return true; 562cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 563cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 564cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott return false; 565cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 566cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 567e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott// Forward declaration: 568e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliottstatic void demo_resize(struct demo *demo); 569e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 570481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic bool memory_type_from_properties(struct demo *demo, uint32_t typeBits, 571481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkFlags requirements_mask, 572481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint32_t *typeIndex) { 573481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Search memtypes to find first index with those properties 5747a9f75412934c8300e18e3a1c0dd2513f098a361Alexandre BACQUART for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; i++) { 575481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if ((typeBits & 1) == 1) { 576481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Type is available, does it match user properties? 577481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if ((demo->memory_properties.memoryTypes[i].propertyFlags & 578481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz requirements_mask) == requirements_mask) { 579481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz *typeIndex = i; 580481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return true; 581481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } 582481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } 583481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz typeBits >>= 1; 584481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } 585481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // No memory types matched, return failure 586481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return false; 587723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski} 588723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski 589481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_flush_init_cmd(struct demo *demo) { 59022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 591bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 592a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour // This function could get called twice if the texture uses a staging buffer 593a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour // In that case the second call should be ignored 5949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter if (demo->cmd == VK_NULL_HANDLE) 595bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter return; 596bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 5979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter err = vkEndCommandBuffer(demo->cmd); 598bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter assert(!err); 599bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 600a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour VkFence fence; 601a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour VkFenceCreateInfo fence_ci = {.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 602a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .pNext = NULL, 603a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .flags = 0}; 604c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkCreateFence(demo->device, &fence_ci, NULL, &fence); 605c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 606c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour 607481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const VkCommandBuffer cmd_bufs[] = {demo->cmd}; 608481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, 609481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pNext = NULL, 610481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .waitSemaphoreCount = 0, 611481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pWaitSemaphores = NULL, 612481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pWaitDstStageMask = NULL, 613481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .commandBufferCount = 1, 614481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pCommandBuffers = cmd_bufs, 615481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .signalSemaphoreCount = 0, 616481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pSignalSemaphores = NULL}; 617bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 618a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour err = vkQueueSubmit(demo->graphics_queue, 1, &submit_info, fence); 619bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter assert(!err); 620bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 621a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour err = vkWaitForFences(demo->device, 1, &fence, VK_TRUE, UINT64_MAX); 622bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter assert(!err); 623bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 624831c183417705004ea225726d450b7259e7384c7Courtney Goeltzenleuchter vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs); 625a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour vkDestroyFence(demo->device, fence, NULL); 6269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter demo->cmd = VK_NULL_HANDLE; 627bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter} 628bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 629481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_set_image_layout(struct demo *demo, VkImage image, 630481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkImageAspectFlags aspectMask, 631481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkImageLayout old_image_layout, 632866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis VkImageLayout new_image_layout, 633df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VkAccessFlagBits srcAccessMask, 634df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VkPipelineStageFlags src_stages, 635df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VkPipelineStageFlags dest_stages) { 6363825f87dc62f910827b1b842213fc68b22302e23Tony Barbour assert(demo->cmd); 637bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 638382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageMemoryBarrier image_memory_barrier = { 6399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 640bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter .pNext = NULL, 641866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis .srcAccessMask = srcAccessMask, 642989de845e6627fecee8dceef882955149b7538baChia-I Wu .dstAccessMask = 0, 643bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter .oldLayout = old_image_layout, 644bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter .newLayout = new_image_layout, 645bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter .image = image, 646481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .subresourceRange = {aspectMask, 0, 1, 0, 1}}; 647bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 648e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour switch (new_image_layout) { 649e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: 650bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter /* Make sure anything that was copying from this image has completed */ 651e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 652e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 653bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 654e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: 655481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz image_memory_barrier.dstAccessMask = 656481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 657e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 658fd61894f0ee23900127d320440cb251aa19d0fcbMark Lobodzinski 659e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: 660481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz image_memory_barrier.dstAccessMask = 661481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; 662e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 663fd61894f0ee23900127d320440cb251aa19d0fcbMark Lobodzinski 664e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: 665481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz image_memory_barrier.dstAccessMask = 666481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; 667e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 668bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 669e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: 670e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; 671e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 672e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour 673e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: 6743d7b1e39e7763ee8d60c8fae7a65a8c22ae3b6d1Tony Barbour image_memory_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; 675e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 676e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour 677e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour default: 678e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour image_memory_barrier.dstAccessMask = 0; 679e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour break; 6803d7b1e39e7763ee8d60c8fae7a65a8c22ae3b6d1Tony Barbour } 6813d7b1e39e7763ee8d60c8fae7a65a8c22ae3b6d1Tony Barbour 682e4dd74afb4dc6f9701f9bf19c23574adae816ed3Tony Barbour 683382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageMemoryBarrier *pmemory_barrier = &image_memory_barrier; 684bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 685481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCmdPipelineBarrier(demo->cmd, src_stages, dest_stages, 0, 0, NULL, 0, 686481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL, 1, pmemory_barrier); 687bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter} 688bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 689481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_draw_build_cmd(struct demo *demo, VkCommandBuffer cmd_buf) { 690a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn const VkCommandBufferBeginInfo cmd_buf_info = { 691a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 692a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .pNext = NULL, 693a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, 6941213c570f44b1314c96eafccad4b09f1d2707f24Rene Lindsay .pInheritanceInfo = NULL, 695a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn }; 696c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu const VkClearValue clear_values[2] = { 697481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [0] = {.color.float32 = {0.2f, 0.2f, 0.2f, 0.2f}}, 698481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [1] = {.depthStencil = {1.0f, 0}}, 699c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu }; 700c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu const VkRenderPassBeginInfo rp_begin = { 701c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, 702c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .pNext = NULL, 70376cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu .renderPass = demo->render_pass, 704c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .framebuffer = demo->swapchain_image_resources[demo->current_buffer].framebuffer, 705c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .renderArea.offset.x = 0, 706c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .renderArea.offset.y = 0, 707c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .renderArea.extent.width = demo->width, 708c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .renderArea.extent.height = demo->height, 709c332eefa3e8b7e97ca70abd8cfaa0d4f4e1b0fc2Cody Northrop .clearValueCount = 2, 710c332eefa3e8b7e97ca70abd8cfaa0d4f4e1b0fc2Cody Northrop .pClearValues = clear_values, 7113325d6b8ffdef53d826177f16c84d4d8ee752c11Jon Ashburn }; 71276cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu VkResult U_ASSERT_ONLY err; 7134e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 7149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter err = vkBeginCommandBuffer(cmd_buf, &cmd_buf_info); 7154e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 716c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu vkCmdBeginRenderPass(cmd_buf, &rp_begin, VK_SUBPASS_CONTENTS_INLINE); 717481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, demo->pipeline); 718481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, 719c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->pipeline_layout, 0, 1, 720c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[demo->current_buffer].descriptor_set, 721c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour 0, NULL); 72209772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter VkViewport viewport; 72309772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter memset(&viewport, 0, sizeof(viewport)); 724481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz viewport.height = (float)demo->height; 725481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz viewport.width = (float)demo->width; 726481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz viewport.minDepth = (float)0.0f; 727481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz viewport.maxDepth = (float)1.0f; 728f25165255ccfd9bce7c80b77942fc4f2132947a2Jon Ashburn vkCmdSetViewport(cmd_buf, 0, 1, &viewport); 72909772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter 73009772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter VkRect2D scissor; 73109772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter memset(&scissor, 0, sizeof(scissor)); 73209772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter scissor.extent.width = demo->width; 73309772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter scissor.extent.height = demo->height; 73409772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter scissor.offset.x = 0; 73509772bb64bc1c6577edef89074cbd9132191f402Courtney Goeltzenleuchter scissor.offset.y = 0; 736f25165255ccfd9bce7c80b77942fc4f2132947a2Jon Ashburn vkCmdSetScissor(cmd_buf, 0, 1, &scissor); 7374ff11cc681bf32052b69573eb1418173f6b0262bCourtney Goeltzenleuchter vkCmdDraw(cmd_buf, 12 * 3, 1, 0, 0); 738a5b04f44d06af86b917f3866f8e05404ff3aa052Tony Barbour // Note that ending the renderpass changes the image's layout from 7391ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // COLOR_ATTACHMENT_OPTIMAL to PRESENT_SRC_KHR 74088eaa3bf0c7874f8b62cf35e3b649201ecc47c36Chia-I Wu vkCmdEndRenderPass(cmd_buf); 7414e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 7421ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 7431ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // We have to transfer ownership from the graphics queue family to the 7441ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // present queue family to be able to present. Note that we don't have 7451ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // to transfer from present queue family back to graphics queue family at 7461ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // the start of the next frame because we don't care about the image's 7471ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // contents at that point. 7481ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkImageMemoryBarrier image_ownership_barrier = { 7491ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 7501ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pNext = NULL, 7511ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .srcAccessMask = 0, 7521ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 7531ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 7541ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 7551ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .srcQueueFamilyIndex = demo->graphics_queue_family_index, 7561ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .dstQueueFamilyIndex = demo->present_queue_family_index, 757c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .image = demo->swapchain_image_resources[demo->current_buffer].image, 7581ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}}; 7591ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 7601ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour vkCmdPipelineBarrier(cmd_buf, 7611ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 762746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 7631ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 0, NULL, 0, NULL, 1, &image_ownership_barrier); 7641ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 7659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter err = vkEndCommandBuffer(cmd_buf); 7664e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 7674e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 7684e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 7691ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbourvoid demo_build_image_ownership_cmd(struct demo *demo, int i) { 7701ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkResult U_ASSERT_ONLY err; 7711ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 7721ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour const VkCommandBufferBeginInfo cmd_buf_info = { 7731ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 7741ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pNext = NULL, 7751ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, 7761ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pInheritanceInfo = NULL, 7771ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour }; 778c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkBeginCommandBuffer(demo->swapchain_image_resources[i].graphics_to_present_cmd, 7791ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour &cmd_buf_info); 7801ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 7811ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 7821ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkImageMemoryBarrier image_ownership_barrier = { 7831ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 7841ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pNext = NULL, 7851ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .srcAccessMask = 0, 7861ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 7871ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 7881ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 7891ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .srcQueueFamilyIndex = demo->graphics_queue_family_index, 7901ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .dstQueueFamilyIndex = demo->present_queue_family_index, 791c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .image = demo->swapchain_image_resources[i].image, 7921ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}}; 7931ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 794c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkCmdPipelineBarrier(demo->swapchain_image_resources[i].graphics_to_present_cmd, 7951ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 7961ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, 7971ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour NULL, 0, NULL, 1, &image_ownership_barrier); 798c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkEndCommandBuffer(demo->swapchain_image_resources[i].graphics_to_present_cmd); 7991ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 8001ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour} 8011ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 802481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzvoid demo_update_data_buffer(struct demo *demo) { 8036f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter mat4x4 MVP, Model, VP; 8046f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter int matrixSize = sizeof(MVP); 805e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint8_t *pData; 80622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 8074e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 8086f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix); 8094e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 810a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz // Rotate around the Y axis 811e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter mat4x4_dup(Model, demo->model_matrix); 812481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz mat4x4_rotate(demo->model_matrix, Model, 0.0f, 1.0f, 0.0f, 813481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (float)degreesToRadians(demo->spin_angle)); 814e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter mat4x4_mul(MVP, VP, demo->model_matrix); 8154e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 816c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkMapMemory(demo->device, 817c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->swapchain_image_resources[demo->current_buffer].uniform_memory, 0, 818c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VK_WHOLE_SIZE, 0, (void **)&pData); 8196f88d4c7f5cbca061f6d4c6e64b7c12719a38b2dCourtney Goeltzenleuchter assert(!err); 8204e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 821481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz memcpy(pData, (const void *)&MVP[0][0], matrixSize); 8224e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 823c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkUnmapMemory(demo->device, demo->swapchain_image_resources[demo->current_buffer].uniform_memory); 8244e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 8254e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 826cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliottvoid DemoUpdateTargetIPD(struct demo *demo) { 827cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Look at what happened to previous presents, and make appropriate 828cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // adjustments in timing: 829cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VkResult U_ASSERT_ONLY err; 830cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VkPastPresentationTimingGOOGLE* past = NULL; 831cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint32_t count = 0; 832cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 833cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott err = demo->fpGetPastPresentationTimingGOOGLE(demo->device, 834cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->swapchain, 835cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott &count, 836cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott NULL); 837cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott assert(!err); 838cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (count) { 839cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past = (VkPastPresentationTimingGOOGLE*) malloc(sizeof(VkPastPresentationTimingGOOGLE) * count); 840cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott assert(past); 841cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott err = demo->fpGetPastPresentationTimingGOOGLE(demo->device, 842cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->swapchain, 843cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott &count, 844cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past); 845cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott assert(!err); 846cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 847cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott bool early = false; 848cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott bool late = false; 849cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott bool calibrate_next = false; 850cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott for (uint32_t i = 0 ; i < count ; i++) { 851cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (!demo->syncd_with_actual_presents) { 852cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This is the first time that we've received an 853cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // actualPresentTime for this swapchain. In order to not 854cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // perceive these early frames as "late", we need to sync-up 855cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // our future desiredPresentTime's with the 856cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // actualPresentTime(s) that we're receiving now. 857cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott calibrate_next = true; 858cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 859cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // So that we don't suspect any pending presents as late, 860cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // record them all as suspected-late presents: 861cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_late_id = demo->next_present_id - 1; 862cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_early_id = 0; 863cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->syncd_with_actual_presents = true; 864cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott break; 865cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else if (CanPresentEarlier(past[i].earliestPresentTime, 866cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past[i].actualPresentTime, 867cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past[i].presentMargin, 868cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration)) { 869cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This image could have been presented earlier. We don't want 870cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // to decrease the target_IPD until we've seen early presents 871cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // for at least two seconds. 872cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->last_early_id == past[i].presentID) { 873cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // We've now seen two seconds worth of early presents. 874cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Flag it as such, and reset the counter: 875cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott early = true; 876cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_early_id = 0; 877cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else if (demo->last_early_id == 0) { 878cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This is the first early present we've seen. 879cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Calculate the presentID for two seconds from now. 880cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t lastEarlyTime = 881cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past[i].actualPresentTime + (2 * BILLION); 882cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint32_t howManyPresents = 883cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott (uint32_t)((lastEarlyTime - past[i].actualPresentTime) / demo->target_IPD); 884cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_early_id = past[i].presentID + howManyPresents; 885cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 886cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // We are in the midst of a set of early images, 887cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // and so we won't do anything. 888cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 889cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott late = false; 890cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_late_id = 0; 891cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else if (ActualTimeLate(past[i].desiredPresentTime, 892cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott past[i].actualPresentTime, 893cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration)) { 894cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This image was presented after its desired time. Since 895cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // there's a delay between calling vkQueuePresentKHR and when 896cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // we get the timing data, several presents may have been late. 897cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Thus, we need to threat all of the outstanding presents as 898cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // being likely late, so that we only increase the target_IPD 899cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // once for all of those presents. 900cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if ((demo->last_late_id == 0) || 901cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott (demo->last_late_id < past[i].presentID)) { 902cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott late = true; 903cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Record the last suspected-late present: 904cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_late_id = demo->next_present_id - 1; 905cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 906cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // We are in the midst of a set of likely-late images, 907cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // and so we won't do anything. 908cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 909cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott early = false; 910cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_early_id = 0; 911cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 912cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Since this image was not presented early or late, reset 913cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // any sets of early or late presentIDs: 914cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott early = false; 915cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott late = false; 916cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott calibrate_next = true; 917cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_early_id = 0; 918cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->last_late_id = 0; 919cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 920cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 921cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 922cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (early) { 923cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Since we've seen at least two-seconds worth of presnts that 924cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // could have occured earlier than desired, let's decrease the 925cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // target_IPD (i.e. increase the frame rate): 926cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // 927cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // TODO(ianelliott): Try to calculate a better target_IPD based 928cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // on the most recently-seen present (this is overly-simplistic). 929cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration_multiplier--; 930cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->refresh_duration_multiplier == 0) { 931cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This should never happen, but in case it does, don't 932cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // try to go faster. 933cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration_multiplier = 1; 934cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 935cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->target_IPD = 936cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration * demo->refresh_duration_multiplier; 937cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 938cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (late) { 939cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Since we found a new instance of a late present, we want to 940cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // increase the target_IPD (i.e. decrease the frame rate): 941cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // 942cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // TODO(ianelliott): Try to calculate a better target_IPD based 943cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // on the most recently-seen present (this is overly-simplistic). 944cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration_multiplier++; 945cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->target_IPD = 946cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration * demo->refresh_duration_multiplier; 947cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 948cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 949cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (calibrate_next) { 950cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott int64_t multiple = demo->next_present_id - past[count-1].presentID; 951cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->prev_desired_present_time = 952cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott (past[count-1].actualPresentTime + 953cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott (multiple * demo->target_IPD)); 954cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 955cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 956cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott} 957cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 958481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_draw(struct demo *demo) { 959e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott VkResult U_ASSERT_ONLY err; 9609e816866fc9593792a6b88ebff456697018aa547Tony Barbour 961f06ab9cba631acdd64e8009b2290e3656073a499Damien Leone // Ensure no more than FRAME_LAG renderings are outstanding 962ed0cd2f95c18b3d3f267c45b149ba435b7d3a0eeszdarkhack vkWaitForFences(demo->device, 1, &demo->fences[demo->frame_index], VK_TRUE, UINT64_MAX); 963ed0cd2f95c18b3d3f267c45b149ba435b7d3a0eeszdarkhack vkResetFences(demo->device, 1, &demo->fences[demo->frame_index]); 9646b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 965e7edf7372260c94dbbeb908134bcca1610335b1aTony Barbour do { 966982232b591f4aec3e474c3c9242afb41be961adeTony Barbour // Get the index of the next available swapchain image: 967982232b591f4aec3e474c3c9242afb41be961adeTony Barbour err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX, 968982232b591f4aec3e474c3c9242afb41be961adeTony Barbour demo->image_acquired_semaphores[demo->frame_index], 969982232b591f4aec3e474c3c9242afb41be961adeTony Barbour VK_NULL_HANDLE, &demo->current_buffer); 970982232b591f4aec3e474c3c9242afb41be961adeTony Barbour 971982232b591f4aec3e474c3c9242afb41be961adeTony Barbour if (err == VK_ERROR_OUT_OF_DATE_KHR) { 972982232b591f4aec3e474c3c9242afb41be961adeTony Barbour // demo->swapchain is out of date (e.g. the window was resized) and 973982232b591f4aec3e474c3c9242afb41be961adeTony Barbour // must be recreated: 974982232b591f4aec3e474c3c9242afb41be961adeTony Barbour demo_resize(demo); 975982232b591f4aec3e474c3c9242afb41be961adeTony Barbour } else if (err == VK_SUBOPTIMAL_KHR) { 976982232b591f4aec3e474c3c9242afb41be961adeTony Barbour // demo->swapchain is not as optimal as it could be, but the platform's 977982232b591f4aec3e474c3c9242afb41be961adeTony Barbour // presentation engine will still present the image correctly. 978982232b591f4aec3e474c3c9242afb41be961adeTony Barbour break; 979982232b591f4aec3e474c3c9242afb41be961adeTony Barbour } else { 980982232b591f4aec3e474c3c9242afb41be961adeTony Barbour assert(!err); 981982232b591f4aec3e474c3c9242afb41be961adeTony Barbour } 982e7edf7372260c94dbbeb908134bcca1610335b1aTony Barbour } while (err != VK_SUCCESS); 983982232b591f4aec3e474c3c9242afb41be961adeTony Barbour 9841e487b2d162a40bdf795a11b99cba350617e5898Tony Barbour demo_update_data_buffer(demo); 9851e487b2d162a40bdf795a11b99cba350617e5898Tony Barbour 986cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 987cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Look at what happened to previous presents, and make appropriate 988cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // adjustments in timing: 989cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott DemoUpdateTargetIPD(demo); 990cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 991cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Note: a real application would position its geometry to that it's in 992cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // the correct locatoin for when the next image is presented. It might 993cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // also wait, so that there's less latency between any input and when 994cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // the next image is rendered/presented. This demo program is so 995cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // simple that it doesn't do either of those. 996cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 997cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 998a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour // Wait for the image acquired semaphore to be signaled to ensure 9993ec31629900b5a52fa112d6670ffb6771fe9adcaCourtney Goeltzenleuchter // that the image won't be rendered to until the presentation 10003ec31629900b5a52fa112d6670ffb6771fe9adcaCourtney Goeltzenleuchter // engine has fully released ownership to the application, and it is 10013ec31629900b5a52fa112d6670ffb6771fe9adcaCourtney Goeltzenleuchter // okay to render to the image. 10021ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkPipelineStageFlags pipe_stage_flags; 10031ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkSubmitInfo submit_info; 10041ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 10051ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.pNext = NULL; 10061ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.pWaitDstStageMask = &pipe_stage_flags; 10071ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; 10081ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.waitSemaphoreCount = 1; 10096b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour submit_info.pWaitSemaphores = &demo->image_acquired_semaphores[demo->frame_index]; 10101ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.commandBufferCount = 1; 1011c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour submit_info.pCommandBuffers = &demo->swapchain_image_resources[demo->current_buffer].cmd; 10121ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.signalSemaphoreCount = 1; 10136b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour submit_info.pSignalSemaphores = &demo->draw_complete_semaphores[demo->frame_index]; 1014c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkQueueSubmit(demo->graphics_queue, 1, &submit_info, 1015f06ab9cba631acdd64e8009b2290e3656073a499Damien Leone demo->fences[demo->frame_index]); 10164e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 10174e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 10181ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 10191ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // If we are using separate queues, change image ownership to the 10201ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // present queue before presenting, waiting for the draw complete 10211ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // semaphore and signalling the ownership released semaphore when finished 1022c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkFence nullFence = VK_NULL_HANDLE; 10231ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; 10241ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.waitSemaphoreCount = 1; 10256b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour submit_info.pWaitSemaphores = &demo->draw_complete_semaphores[demo->frame_index]; 10261ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.commandBufferCount = 1; 10271ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.pCommandBuffers = 1028c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[demo->current_buffer].graphics_to_present_cmd; 10291ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour submit_info.signalSemaphoreCount = 1; 10306b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour submit_info.pSignalSemaphores = &demo->image_ownership_semaphores[demo->frame_index]; 10311ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour err = vkQueueSubmit(demo->present_queue, 1, &submit_info, nullFence); 10321ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 10331ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 10341ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 10351ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // If we are using separate queues we have to wait for image ownership, 10361ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour // otherwise wait for draw complete 1037338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkPresentInfoKHR present = { 1038338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, 1039e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott .pNext = NULL, 1040b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott .waitSemaphoreCount = 1, 10411ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pWaitSemaphores = (demo->separate_present_queue) 10426b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour ? &demo->image_ownership_semaphores[demo->frame_index] 10436b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour : &demo->draw_complete_semaphores[demo->frame_index], 1044338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott .swapchainCount = 1, 1045b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .pSwapchains = &demo->swapchain, 1046b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .pImageIndices = &demo->current_buffer, 1047e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott }; 1048e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 104902f7d213d30762f60b3f15207e497574080ee038Ian Elliott if (demo->VK_KHR_incremental_present_enabled) { 105002f7d213d30762f60b3f15207e497574080ee038Ian Elliott // If using VK_KHR_incremental_present, we provide a hint of the region 105102f7d213d30762f60b3f15207e497574080ee038Ian Elliott // that contains changed content relative to the previously-presented 105202f7d213d30762f60b3f15207e497574080ee038Ian Elliott // image. The implementation can use this hint in order to save 105302f7d213d30762f60b3f15207e497574080ee038Ian Elliott // work/power (by only copying the region in the hint). The 105402f7d213d30762f60b3f15207e497574080ee038Ian Elliott // implementation is free to ignore the hint though, and so we must 105502f7d213d30762f60b3f15207e497574080ee038Ian Elliott // ensure that the entire image has the correctly-drawn content. 105602f7d213d30762f60b3f15207e497574080ee038Ian Elliott uint32_t eighthOfWidth = demo->width / 8; 105702f7d213d30762f60b3f15207e497574080ee038Ian Elliott uint32_t eighthOfHeight = demo->height / 8; 105802f7d213d30762f60b3f15207e497574080ee038Ian Elliott VkRectLayerKHR rect = { 105902f7d213d30762f60b3f15207e497574080ee038Ian Elliott .offset.x = eighthOfWidth, 106002f7d213d30762f60b3f15207e497574080ee038Ian Elliott .offset.y = eighthOfHeight, 106102f7d213d30762f60b3f15207e497574080ee038Ian Elliott .extent.width = eighthOfWidth * 6, 106202f7d213d30762f60b3f15207e497574080ee038Ian Elliott .extent.height = eighthOfHeight * 6, 106302f7d213d30762f60b3f15207e497574080ee038Ian Elliott .layer = 0, 106402f7d213d30762f60b3f15207e497574080ee038Ian Elliott }; 106502f7d213d30762f60b3f15207e497574080ee038Ian Elliott VkPresentRegionKHR region = { 106602f7d213d30762f60b3f15207e497574080ee038Ian Elliott .rectangleCount = 1, 106702f7d213d30762f60b3f15207e497574080ee038Ian Elliott .pRectangles = &rect, 106802f7d213d30762f60b3f15207e497574080ee038Ian Elliott }; 106902f7d213d30762f60b3f15207e497574080ee038Ian Elliott VkPresentRegionsKHR regions = { 107002f7d213d30762f60b3f15207e497574080ee038Ian Elliott .sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, 107102f7d213d30762f60b3f15207e497574080ee038Ian Elliott .pNext = present.pNext, 107202f7d213d30762f60b3f15207e497574080ee038Ian Elliott .swapchainCount = present.swapchainCount, 107302f7d213d30762f60b3f15207e497574080ee038Ian Elliott .pRegions = ®ion, 107402f7d213d30762f60b3f15207e497574080ee038Ian Elliott }; 107502f7d213d30762f60b3f15207e497574080ee038Ian Elliott present.pNext = ®ions; 107602f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 107702f7d213d30762f60b3f15207e497574080ee038Ian Elliott 1078cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 1079cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VkPresentTimeGOOGLE ptime; 1080cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->prev_desired_present_time == 0) { 1081cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // This must be the first present for this swapchain. 1082cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // 1083cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // We don't know where we are relative to the presentation engine's 1084cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // display's refresh cycle. We also don't know how long rendering 1085cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // takes. Let's make a grossly-simplified assumption that the 1086cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // desiredPresentTime should be half way between now and 1087cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // now+target_IPD. We will adjust over time. 1088cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott uint64_t curtime = getTimeInNanoseconds(); 1089cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (curtime == 0) { 1090cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Since we didn't find out the current time, don't give a 1091cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // desiredPresentTime: 1092cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott ptime.desiredPresentTime = 0; 1093cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 1094cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott ptime.desiredPresentTime = curtime + (demo->target_IPD >> 1); 1095cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 1096cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } else { 1097cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott ptime.desiredPresentTime = (demo->prev_desired_present_time + 1098cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->target_IPD); 1099cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 1100cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott ptime.presentID = demo->next_present_id++; 1101cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->prev_desired_present_time = ptime.desiredPresentTime; 1102cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 1103cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VkPresentTimesInfoGOOGLE present_time = { 1104cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott .sType = VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE, 1105cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott .pNext = present.pNext, 1106cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott .swapchainCount = present.swapchainCount, 1107cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott .pTimes = &ptime, 1108cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott }; 1109cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 1110cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott present.pNext = &present_time; 1111cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 1112cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 1113cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 1114755151776f6b9a0ab34095b980819e4318a86529Tony Barbour err = demo->fpQueuePresentKHR(demo->present_queue, &present); 11156b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour demo->frame_index += 1; 11166b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour demo->frame_index %= FRAME_LAG; 11176b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 1118e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott if (err == VK_ERROR_OUT_OF_DATE_KHR) { 1119e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // demo->swapchain is out of date (e.g. the window was resized) and 1120e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // must be recreated: 1121e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott demo_resize(demo); 1122e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } else if (err == VK_SUBOPTIMAL_KHR) { 1123e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // demo->swapchain is not as optimal as it could be, but the platform's 1124e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // presentation engine will still present the image correctly. 1125e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } else { 1126e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott assert(!err); 1127e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 11284e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 11294e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1130481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_buffers(struct demo *demo) { 1131e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott VkResult U_ASSERT_ONLY err; 1132e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott VkSwapchainKHR oldSwapchain = demo->swapchain; 1133e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 1134b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott // Check the surface capabilities and formats 1135b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott VkSurfaceCapabilitiesKHR surfCapabilities; 1136481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->fpGetPhysicalDeviceSurfaceCapabilitiesKHR( 1137481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->gpu, demo->surface, &surfCapabilities); 1138e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 1139e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 11407fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott uint32_t presentModeCount; 1141481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR( 1142481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->gpu, demo->surface, &presentModeCount, NULL); 1143e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 1144338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkPresentModeKHR *presentModes = 1145338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott (VkPresentModeKHR *)malloc(presentModeCount * sizeof(VkPresentModeKHR)); 11467fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott assert(presentModes); 1147481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR( 1148481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->gpu, demo->surface, &presentModeCount, presentModes); 1149e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 1150e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 1151338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkExtent2D swapchainExtent; 1152b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF. 1153b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) { 1154b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // If the surface size is undefined, the size is set to the size 1155b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // of the images requested, which must fit within the minimum and 1156b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // maximum values. 1157338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott swapchainExtent.width = demo->width; 1158338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott swapchainExtent.height = demo->height; 1159b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott 1160b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott if (swapchainExtent.width < surfCapabilities.minImageExtent.width) { 1161b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott swapchainExtent.width = surfCapabilities.minImageExtent.width; 1162b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott } else if (swapchainExtent.width > surfCapabilities.maxImageExtent.width) { 1163b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott swapchainExtent.width = surfCapabilities.maxImageExtent.width; 1164b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott } 1165b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott 1166b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott if (swapchainExtent.height < surfCapabilities.minImageExtent.height) { 1167b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott swapchainExtent.height = surfCapabilities.minImageExtent.height; 1168b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott } else if (swapchainExtent.height > surfCapabilities.maxImageExtent.height) { 1169b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott swapchainExtent.height = surfCapabilities.maxImageExtent.height; 1170b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott } 1171481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else { 1172e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // If the surface size is defined, the swap chain size must match 1173b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott swapchainExtent = surfCapabilities.currentExtent; 1174b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott demo->width = surfCapabilities.currentExtent.width; 1175b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott demo->height = surfCapabilities.currentExtent.height; 1176e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 1177e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 11786b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour // The FIFO present mode is guaranteed by the spec to be supported 11796455efbcfbea3117d3eaded354318126a1252927Ian Elliott // and to have no tearing. It's a great default present mode to use. 1180338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR; 1181d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour 11826455efbcfbea3117d3eaded354318126a1252927Ian Elliott // There are times when you may wish to use another present mode. The 11836455efbcfbea3117d3eaded354318126a1252927Ian Elliott // following code shows how to select them, and the comments provide some 11846455efbcfbea3117d3eaded354318126a1252927Ian Elliott // reasons you may wish to use them. 11856455efbcfbea3117d3eaded354318126a1252927Ian Elliott // 11866455efbcfbea3117d3eaded354318126a1252927Ian Elliott // It should be noted that Vulkan 1.0 doesn't provide a method for 11876455efbcfbea3117d3eaded354318126a1252927Ian Elliott // synchronizing rendering with the presentation engine's display. There 11886455efbcfbea3117d3eaded354318126a1252927Ian Elliott // is a method provided for throttling rendering with the display, but 11896455efbcfbea3117d3eaded354318126a1252927Ian Elliott // there are some presentation engines for which this method will not work. 11906455efbcfbea3117d3eaded354318126a1252927Ian Elliott // If an application doesn't throttle its rendering, and if it renders much 11916455efbcfbea3117d3eaded354318126a1252927Ian Elliott // faster than the refresh rate of the display, this can waste power on 11926455efbcfbea3117d3eaded354318126a1252927Ian Elliott // mobile devices. That is because power is being spent rendering images 11936455efbcfbea3117d3eaded354318126a1252927Ian Elliott // that may never be seen. 1194d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour 11956455efbcfbea3117d3eaded354318126a1252927Ian Elliott // VK_PRESENT_MODE_IMMEDIATE_KHR is for applications that don't care about 11966455efbcfbea3117d3eaded354318126a1252927Ian Elliott // tearing, or have some way of synchronizing their rendering with the 11976455efbcfbea3117d3eaded354318126a1252927Ian Elliott // display. 11986455efbcfbea3117d3eaded354318126a1252927Ian Elliott // VK_PRESENT_MODE_MAILBOX_KHR may be useful for applications that 11996455efbcfbea3117d3eaded354318126a1252927Ian Elliott // generally render a new presentable image every refresh cycle, but are 12006455efbcfbea3117d3eaded354318126a1252927Ian Elliott // occasionally early. In this case, the application wants the new image 12016455efbcfbea3117d3eaded354318126a1252927Ian Elliott // to be displayed instead of the previously-queued-for-presentation image 12026455efbcfbea3117d3eaded354318126a1252927Ian Elliott // that has not yet been displayed. 12036455efbcfbea3117d3eaded354318126a1252927Ian Elliott // VK_PRESENT_MODE_FIFO_RELAXED_KHR is for applications that generally 12046455efbcfbea3117d3eaded354318126a1252927Ian Elliott // render a new presentable image every refresh cycle, but are occasionally 12056455efbcfbea3117d3eaded354318126a1252927Ian Elliott // late. In this case (perhaps because of stuttering/latency concerns), 12066455efbcfbea3117d3eaded354318126a1252927Ian Elliott // the application wants the late image to be immediately displayed, even 12076455efbcfbea3117d3eaded354318126a1252927Ian Elliott // though that may mean some tearing. 1208d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour 1209d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour if (demo->presentMode != swapchainPresentMode) { 1210d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour 1211d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour for (size_t i = 0; i < presentModeCount; ++i) { 1212d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour if (presentModes[i] == demo->presentMode) { 1213d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour swapchainPresentMode = demo->presentMode; 1214d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour break; 1215d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour } 12166455efbcfbea3117d3eaded354318126a1252927Ian Elliott } 12176455efbcfbea3117d3eaded354318126a1252927Ian Elliott } 1218d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour if (swapchainPresentMode != demo->presentMode) { 1219d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour ERR_EXIT("Present mode specified is not supported\n", "Present mode unsupported"); 1220d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour } 1221e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 1222b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour // Determine the number of VkImages to use in the swap chain. 1223b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour // Application desires to acquire 3 images at a time for triple 1224b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour // buffering 1225b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour uint32_t desiredNumOfSwapchainImages = 3; 1226b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour if (desiredNumOfSwapchainImages < surfCapabilities.minImageCount) { 1227b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour desiredNumOfSwapchainImages = surfCapabilities.minImageCount; 1228b0fbf713a99a20567bfee964bbbf9a745035385eTony Barbour } 1229b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // If maxImageCount is 0, we can ask for as many images as we want; 1230b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott // otherwise we're limited to maxImageCount 1231b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott if ((surfCapabilities.maxImageCount > 0) && 1232b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott (desiredNumOfSwapchainImages > surfCapabilities.maxImageCount)) { 1233e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // Application must settle for fewer images than desired: 1234b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott desiredNumOfSwapchainImages = surfCapabilities.maxImageCount; 1235e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 1236e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 1237d161c54f8fc84e3447cb1162a3a7fd6d94ffc6ceTony Barbour VkSurfaceTransformFlagsKHR preTransform; 1238481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (surfCapabilities.supportedTransforms & 1239481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) { 1240da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; 1241e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } else { 1242b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott preTransform = surfCapabilities.currentTransform; 1243e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 1244e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 12456c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour // Find a supported composite alpha mode - one of these is guaranteed to be set 12466c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VkCompositeAlphaFlagBitsKHR compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; 12476c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[4] = { 12486c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, 12496c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR, 12506c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR, 12516c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR, 12526c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour }; 1253663d1d05575017a2ce336516638d2e510a2c7fb2Tony Barbour for (uint32_t i = 0; i < ARRAY_SIZE(compositeAlphaFlags); i++) { 12546c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour if (surfCapabilities.supportedCompositeAlpha & compositeAlphaFlags[i]) { 12556c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour compositeAlpha = compositeAlphaFlags[i]; 12566c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour break; 12576c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour } 12586c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour } 12596c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour 1260755151776f6b9a0ab34095b980819e4318a86529Tony Barbour VkSwapchainCreateInfoKHR swapchain_ci = { 1261434d222a014e1ac8cf656ef8fc17faa1d224ad2fIan Elliott .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, 12625b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu .pNext = NULL, 1263b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .surface = demo->surface, 1264b3cc6ce5cccdb1e47e1766e4faa39683b33eca53Ian Elliott .minImageCount = desiredNumOfSwapchainImages, 12655b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu .imageFormat = demo->format, 12667fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott .imageColorSpace = demo->color_space, 1267481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .imageExtent = 1268481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1269481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .width = swapchainExtent.width, .height = swapchainExtent.height, 1270481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1271b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 1272e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott .preTransform = preTransform, 12736c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour .compositeAlpha = compositeAlpha, 1274b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .imageArrayLayers = 1, 1275b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, 1276b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott .queueFamilyIndexCount = 0, 12777fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott .pQueueFamilyIndices = NULL, 1278338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott .presentMode = swapchainPresentMode, 1279e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott .oldSwapchain = oldSwapchain, 1280e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott .clipped = true, 128168040a41017a2e9e81a86af2d083a3079e882b96Chia-I Wu }; 1282e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 1283755151776f6b9a0ab34095b980819e4318a86529Tony Barbour err = demo->fpCreateSwapchainKHR(demo->device, &swapchain_ci, NULL, 1284481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->swapchain); 12855b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu assert(!err); 12865b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu 1287e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // If we just re-created an existing swapchain, we should destroy the old 1288e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // swapchain at this point. 1289e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // Note: destroying the swapchain also cleans up all its associated 1290e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // presentable images once the platform is done with them. 1291e420a33ff7bdcf67b8a487592af78a3ca2f29ee6Chia-I Wu if (oldSwapchain != VK_NULL_HANDLE) { 1292b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott demo->fpDestroySwapchainKHR(demo->device, oldSwapchain, NULL); 1293e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 1294e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 1295e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain, 1296338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott &demo->swapchainImageCount, NULL); 1297e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 12985b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu 1299481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkImage *swapchainImages = 1300481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage)); 1301338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott assert(swapchainImages); 1302e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain, 1303338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott &demo->swapchainImageCount, 1304338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott swapchainImages); 1305e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 1306e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 1307c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->swapchain_image_resources = (SwapchainImageResources *)malloc(sizeof(SwapchainImageResources) * 1308481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->swapchainImageCount); 1309c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(demo->swapchain_image_resources); 1310c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour 1311338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott for (i = 0; i < demo->swapchainImageCount; i++) { 13121856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter VkImageViewCreateInfo color_image_view = { 13131856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 13144e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 13154e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .format = demo->format, 1316481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .components = 1317481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1318481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .r = VK_COMPONENT_SWIZZLE_R, 1319481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .g = VK_COMPONENT_SWIZZLE_G, 1320481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .b = VK_COMPONENT_SWIZZLE_B, 1321481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .a = VK_COMPONENT_SWIZZLE_A, 1322481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1323481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, 1324481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .baseMipLevel = 0, 1325481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .levelCount = 1, 1326481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .baseArrayLayer = 0, 1327481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .layerCount = 1}, 13281856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .viewType = VK_IMAGE_VIEW_TYPE_2D, 13291856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .flags = 0, 13304e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 13314e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1332c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->swapchain_image_resources[i].image = swapchainImages[i]; 13334e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1334c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour color_image_view.image = demo->swapchain_image_resources[i].image; 13354e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1336481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateImageView(demo->device, &color_image_view, NULL, 1337c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].view); 13384e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 13394e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } 1340481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 1341cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 1342cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VkRefreshCycleDurationGOOGLE rc_dur; 1343cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott err = demo->fpGetRefreshCycleDurationGOOGLE(demo->device, 1344cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->swapchain, 1345cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott &rc_dur); 1346cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott assert(!err); 1347cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration = rc_dur.refreshDuration; 1348cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 1349cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->syncd_with_actual_presents = false; 1350cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Initially target 1X the refresh duration: 1351cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->target_IPD = demo->refresh_duration; 1352cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->refresh_duration_multiplier = 1; 1353cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->prev_desired_present_time = 0; 1354cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->next_present_id = 1; 1355cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 1356cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 1357842f94166580a40cfcd631a11681db600ed42821Mark Young if (NULL != presentModes) { 1358842f94166580a40cfcd631a11681db600ed42821Mark Young free(presentModes); 1359842f94166580a40cfcd631a11681db600ed42821Mark Young } 13604e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 13614e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1362481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_depth(struct demo *demo) { 13638205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkFormat depth_format = VK_FORMAT_D16_UNORM; 1364382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkImageCreateInfo image = { 13659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 13664e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 13678205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour .imageType = VK_IMAGE_TYPE_2D, 13684e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .format = depth_format, 1369481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .extent = {demo->width, demo->height, 1}, 13704e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .mipLevels = 1, 13712ebc234580f41270585dfbbe2925358dd41b125eCourtney Goeltzenleuchter .arrayLayers = 1, 13723138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu .samples = VK_SAMPLE_COUNT_1_BIT, 13738205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour .tiling = VK_IMAGE_TILING_OPTIMAL, 1374c3b8eea2f5e66db11651068575f4712cf195f542Courtney Goeltzenleuchter .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 13754e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .flags = 0, 13764e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 1377e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak 13781856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter VkImageViewCreateInfo view = { 13791856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 13804e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 1381e420a33ff7bdcf67b8a487592af78a3ca2f29ee6Chia-I Wu .image = VK_NULL_HANDLE, 13824ab40c4acb0e4c17283a889dfe4fff9f29ff2ec3Courtney Goeltzenleuchter .format = depth_format, 1383481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, 1384481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .baseMipLevel = 0, 1385481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .levelCount = 1, 1386481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .baseArrayLayer = 0, 1387481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .layerCount = 1}, 13884e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .flags = 0, 13891856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .viewType = VK_IMAGE_VIEW_TYPE_2D, 13904e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 1391230e62505478ab0d9b05003e0e48baa5f090c6a0Mike Stroyan 13922318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski VkMemoryRequirements mem_reqs; 139322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 139437a43a64af08599b5fe5429c6c331f42f765fca9Courtney Goeltzenleuchter bool U_ASSERT_ONLY pass; 13954e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 13964e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo->depth.format = depth_format; 13974e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 13984e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter /* create image */ 1399481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image); 14004e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 14014e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1402481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs); 1403c109827920fd0991102d4979728eee74b6ac15fbTony Barbour assert(!err); 1404723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski 1405c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu demo->depth.mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 1406e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak demo->depth.mem_alloc.pNext = NULL; 1407e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak demo->depth.mem_alloc.allocationSize = mem_reqs.size; 1408e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak demo->depth.mem_alloc.memoryTypeIndex = 0; 1409e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak 1410481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits, 141185d81f43efa200d9d907a020e34c1ad0efabcc7aJeremy Hayes VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 1412481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->depth.mem_alloc.memoryTypeIndex); 141337a43a64af08599b5fe5429c6c331f42f765fca9Courtney Goeltzenleuchter assert(pass); 14144e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 14152318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski /* allocate memory */ 1416481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkAllocateMemory(demo->device, &demo->depth.mem_alloc, NULL, 1417481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->depth.mem); 14182318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski assert(!err); 14192318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski 14202318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski /* bind memory */ 1421481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = 1422481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0); 14232318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski assert(!err); 14244e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 14254e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter /* create image view */ 14264e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter view.image = demo->depth.image; 142769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view); 14284e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 14294e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 14304e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1431a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour/* Load a ppm file into memory */ 143240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchterbool loadTexture(const char *filename, uint8_t *rgba_data, 1433481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkSubresourceLayout *layout, int32_t *width, int32_t *height) { 14343cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 14353cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) 14367f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour filename =[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @(filename)].UTF8String; 14373cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#endif 14387f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour 143971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#ifdef __ANDROID__ 144071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#include <lunarg.ppm.h> 144171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine char *cPtr; 1442788a43f8e47fb32cf12aef25c5eab274a016aef3Mark Lobodzinski cPtr = (char*)lunarg_ppm; 1443788a43f8e47fb32cf12aef25c5eab274a016aef3Mark Lobodzinski if ((unsigned char*)cPtr >= (lunarg_ppm + lunarg_ppm_len) || strncmp(cPtr, "P6\n", 3)) { 144471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return false; 144571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 144671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine while(strncmp(cPtr++, "\n", 1)); 14473d20e26455a6f01b405373ebc6991be78b94fd1cAlexandre BACQUART sscanf(cPtr, "%u %u", width, height); 144871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (rgba_data == NULL) { 144971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return true; 145071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 145171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine while(strncmp(cPtr++, "\n", 1)); 1452788a43f8e47fb32cf12aef25c5eab274a016aef3Mark Lobodzinski if ((unsigned char*)cPtr >= (lunarg_ppm + lunarg_ppm_len) || strncmp(cPtr, "255\n", 4)) { 145371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return false; 145471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 145571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine while(strncmp(cPtr++, "\n", 1)); 145671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 145771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine for (int y = 0; y < *height; y++) { 145871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine uint8_t *rowPtr = rgba_data; 145971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine for (int x = 0; x < *width; x++) { 146071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine memcpy(rowPtr, cPtr, 3); 146171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine rowPtr[3] = 255; /* Alpha of 1 */ 146271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine rowPtr += 4; 146371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine cPtr += 3; 146471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 146571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine rgba_data += layout->rowPitch; 146671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 146771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 146871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return true; 146971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#else 1470481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz FILE *fPtr = fopen(filename, "rb"); 1471e92af7e35e235faf650de0ffd413aa2e8417fd2dCourtney Goeltzenleuchter char header[256], *cPtr, *tmp; 14721722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1473a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour if (!fPtr) 1474a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour return false; 14751722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1476a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour cPtr = fgets(header, 256, fPtr); // P6 147785180252441dad59e6967261a0a744af29e87968Mike Stroyan if (cPtr == NULL || strncmp(header, "P6\n", 3)) { 147885180252441dad59e6967261a0a744af29e87968Mike Stroyan fclose(fPtr); 1479a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour return false; 148085180252441dad59e6967261a0a744af29e87968Mike Stroyan } 1481a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour 1482a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour do { 1483a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour cPtr = fgets(header, 256, fPtr); 148485180252441dad59e6967261a0a744af29e87968Mike Stroyan if (cPtr == NULL) { 148585180252441dad59e6967261a0a744af29e87968Mike Stroyan fclose(fPtr); 1486a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour return false; 148785180252441dad59e6967261a0a744af29e87968Mike Stroyan } 1488481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } while (!strncmp(header, "#", 1)); 1489a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour 14903d20e26455a6f01b405373ebc6991be78b94fd1cAlexandre BACQUART sscanf(header, "%u %u", width, height); 149185180252441dad59e6967261a0a744af29e87968Mike Stroyan if (rgba_data == NULL) { 149285180252441dad59e6967261a0a744af29e87968Mike Stroyan fclose(fPtr); 1493a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour return true; 149485180252441dad59e6967261a0a744af29e87968Mike Stroyan } 1495e92af7e35e235faf650de0ffd413aa2e8417fd2dCourtney Goeltzenleuchter tmp = fgets(header, 256, fPtr); // Format 1496481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (void)tmp; 149785180252441dad59e6967261a0a744af29e87968Mike Stroyan if (cPtr == NULL || strncmp(header, "255\n", 3)) { 149885180252441dad59e6967261a0a744af29e87968Mike Stroyan fclose(fPtr); 1499a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour return false; 150085180252441dad59e6967261a0a744af29e87968Mike Stroyan } 15011722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1502481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (int y = 0; y < *height; y++) { 1503a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour uint8_t *rowPtr = rgba_data; 1504481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (int x = 0; x < *width; x++) { 1505e92af7e35e235faf650de0ffd413aa2e8417fd2dCourtney Goeltzenleuchter size_t s = fread(rowPtr, 3, 1, fPtr); 1506481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (void)s; 1507a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour rowPtr[3] = 255; /* Alpha of 1 */ 1508a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour rowPtr += 4; 1509a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour } 1510a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour rgba_data += layout->rowPitch; 1511a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour } 1512a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour fclose(fPtr); 151385180252441dad59e6967261a0a744af29e87968Mike Stroyan return true; 151471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 15151722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter} 15161722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1517481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_texture_image(struct demo *demo, const char *filename, 1518bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter struct texture_object *tex_obj, 1519382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageTiling tiling, 1520cb67a3299b59f9b992956d3d49181090c0cb932eCourtney Goeltzenleuchter VkImageUsageFlags usage, 1521481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkFlags required_props) { 1522de24a6fa4333020ee03b8024b4c1d12196ade31fMike Stroyan const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM; 1523e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski int32_t tex_width; 1524e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski int32_t tex_height; 152522a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 152637a43a64af08599b5fe5429c6c331f42f765fca9Courtney Goeltzenleuchter bool U_ASSERT_ONLY pass; 152740a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1528481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (!loadTexture(filename, NULL, NULL, &tex_width, &tex_height)) { 152971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine ERR_EXIT("Failed to load textures", "Load Texture Failure"); 153061e773861568e3cadefba8effeb4e7e12e36e6ddDavid Pinedo } 153140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1532bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter tex_obj->tex_width = tex_width; 1533bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter tex_obj->tex_height = tex_height; 153440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1535382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkImageCreateInfo image_create_info = { 15369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 153740a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .pNext = NULL, 15388205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour .imageType = VK_IMAGE_TYPE_2D, 153940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .format = tex_format, 1540481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .extent = {tex_width, tex_height, 1}, 154140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .mipLevels = 1, 15422ebc234580f41270585dfbbe2925358dd41b125eCourtney Goeltzenleuchter .arrayLayers = 1, 15433138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu .samples = VK_SAMPLE_COUNT_1_BIT, 154440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .tiling = tiling, 1545cb67a3299b59f9b992956d3d49181090c0cb932eCourtney Goeltzenleuchter .usage = usage, 154640a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .flags = 0, 1547866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis .initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED, 154840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter }; 154940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 15502318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski VkMemoryRequirements mem_reqs; 155140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1552481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = 1553481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image); 155440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter assert(!err); 155540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 155601d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs); 155740a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1558c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu tex_obj->mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 1559e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak tex_obj->mem_alloc.pNext = NULL; 1560e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak tex_obj->mem_alloc.allocationSize = mem_reqs.size; 1561e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak tex_obj->mem_alloc.memoryTypeIndex = 0; 15622318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski 1563481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits, 1564481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz required_props, 1565481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &tex_obj->mem_alloc.memoryTypeIndex); 156637a43a64af08599b5fe5429c6c331f42f765fca9Courtney Goeltzenleuchter assert(pass); 1567723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski 15682318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski /* allocate memory */ 15691f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu err = vkAllocateMemory(demo->device, &tex_obj->mem_alloc, NULL, 1570481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &(tex_obj->mem)); 15712318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski assert(!err); 157240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 15732318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski /* bind memory */ 1574481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0); 15752318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski assert(!err); 157640a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1577f1eceb98219334d5540106fd024d6aee9e397802Tony Barbour if (required_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { 1578382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkImageSubresource subres = { 1579195c9e1571bc33a143af6a1adf7f6083a3b41f8dChia-I Wu .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, 158040a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .mipLevel = 0, 15813dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter .arrayLayer = 0, 158240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter }; 1583382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkSubresourceLayout layout; 158440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter void *data; 158540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1586481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres, 1587481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &layout); 158840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1589481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkMapMemory(demo->device, tex_obj->mem, 0, 1590481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz tex_obj->mem_alloc.allocationSize, 0, &data); 159140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter assert(!err); 159240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 159340a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter if (!loadTexture(filename, data, &layout, &tex_width, &tex_height)) { 159440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter fprintf(stderr, "Error loading texture: %s\n", filename); 159540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter } 159640a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 159767b42b7bde3163f662452cd8ed20e0b69e1afa4fMark Lobodzinski vkUnmapMemory(demo->device, tex_obj->mem); 159840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter } 1599bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 16009cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter tex_obj->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; 160140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter} 160240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1603481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_destroy_texture_image(struct demo *demo, 1604481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz struct texture_object *tex_objs) { 160540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter /* clean up staging resources */ 160669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkFreeMemory(demo->device, tex_objs->mem, NULL); 160769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImage(demo->device, tex_objs->image, NULL); 160840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter} 160940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1610481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_textures(struct demo *demo) { 16118205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM; 1612382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkFormatProperties props; 1613e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t i; 16144e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 161501d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props); 161640a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 16174e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { 161801d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 161940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1620481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if ((props.linearTilingFeatures & 1621481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) && 1622481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz !demo->use_staging_buffer) { 162340a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter /* Device can texture using linear textures */ 162447bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour demo_prepare_texture_image( 162547bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour demo, tex_files[i], &demo->textures[i], VK_IMAGE_TILING_LINEAR, 162647bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_IMAGE_USAGE_SAMPLED_BIT, 162747bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 162847bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); 1629df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour // Nothing in the pipeline needs to be complete to start, and don't allow fragment 1630df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour // shader to run until layout transition completes 1631df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour demo_set_image_layout(demo, demo->textures[i].image, VK_IMAGE_ASPECT_COLOR_BIT, 1632df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_IMAGE_LAYOUT_PREINITIALIZED, demo->textures[i].imageLayout, 1633d9da0a31fcaed22bf07448e7cafee17024994bf1Karl Schultz 0, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 1634df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); 1635741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo->staging_texture.image = 0; 1636481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else if (props.optimalTilingFeatures & 1637481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) { 163840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter /* Must use staging buffer to copy linear texture to optimized */ 163940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1640741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour memset(&demo->staging_texture, 0, sizeof(demo->staging_texture)); 164147bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour demo_prepare_texture_image( 1642741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo, tex_files[i], &demo->staging_texture, VK_IMAGE_TILING_LINEAR, 164347bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 164447bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 164547bb7bcca3e51dd2d74b534e53a0003f1a6b863bTony Barbour VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); 164640a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1647481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo_prepare_texture_image( 1648481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo, tex_files[i], &demo->textures[i], VK_IMAGE_TILING_OPTIMAL, 1649481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT), 1650481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); 165140a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1652741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo_set_image_layout(demo, demo->staging_texture.image, 1653481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_ASPECT_COLOR_BIT, 1654df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_IMAGE_LAYOUT_PREINITIALIZED, 1655866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 1656d9da0a31fcaed22bf07448e7cafee17024994bf1Karl Schultz 0, 1657d9da0a31fcaed22bf07448e7cafee17024994bf1Karl Schultz VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 1658df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_TRANSFER_BIT); 165940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1660bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter demo_set_image_layout(demo, demo->textures[i].image, 1661481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_ASPECT_COLOR_BIT, 1662df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_IMAGE_LAYOUT_PREINITIALIZED, 1663866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 16649455b5ed214aac547a9fbe88da3ea52415025f91Tony Barbour 0, 1665df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 1666df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_TRANSFER_BIT); 166740a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1668382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageCopy copy_region = { 1669481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, 1670481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .srcOffset = {0, 0, 0}, 1671481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, 1672481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .dstOffset = {0, 0, 0}, 1673741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour .extent = {demo->staging_texture.tex_width, 1674741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo->staging_texture.tex_height, 1}, 167540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter }; 1676481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCmdCopyImage( 1677741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo->cmd, demo->staging_texture.image, 1678481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image, 1679481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_region); 168040a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1681bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter demo_set_image_layout(demo, demo->textures[i].image, 1682481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_ASPECT_COLOR_BIT, 1683481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1684866af6ca38e3bcde21ea9235de1b7a044279e6b8Tobin Ehlis demo->textures[i].imageLayout, 1685df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_ACCESS_TRANSFER_WRITE_BIT, 1686df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_TRANSFER_BIT, 1687df48463191cc6b75a02c1a3c2d505977e992e370Tony Barbour VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); 168840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 168940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter } else { 1690de24a6fa4333020ee03b8024b4c1d12196ade31fMike Stroyan /* Can't support VK_FORMAT_R8G8B8A8_UNORM !? */ 1691de24a6fa4333020ee03b8024b4c1d12196ade31fMike Stroyan assert(!"No support for R8G8B8A8_UNORM as texture image format"); 169240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter } 169340a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 1694382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkSamplerCreateInfo sampler = { 16959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, 16964e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 16973603b0843e868bd46b11eaf1d64ccdb260599609Chia-I Wu .magFilter = VK_FILTER_NEAREST, 16983603b0843e868bd46b11eaf1d64ccdb260599609Chia-I Wu .minFilter = VK_FILTER_NEAREST, 1699a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, 1700ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, 1701ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, 1702ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, 17034e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .mipLodBias = 0.0f, 17040717ed5c31632fcc0f7fc1e553b1e67ca03df2abJon Ashburn .anisotropyEnable = VK_FALSE, 170540a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .maxAnisotropy = 1, 17068205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour .compareOp = VK_COMPARE_OP_NEVER, 17074e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .minLod = 0.0f, 17084e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .maxLod = 0.0f, 17092c4e7c76b02d4ad0c09ff14bf9026dfcc0b9fa0cTony Barbour .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE, 1710513acdfaef018860ab57d945d5df881e3d50c068Mark Lobodzinski .unnormalizedCoordinates = VK_FALSE, 17114e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 17121722360237895a60a62a033832b9ec94c4e6697bCourtney Goeltzenleuchter 1713382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkImageViewCreateInfo view = { 17149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 17154e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 1716e420a33ff7bdcf67b8a487592af78a3ca2f29ee6Chia-I Wu .image = VK_NULL_HANDLE, 17178205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour .viewType = VK_IMAGE_VIEW_TYPE_2D, 171840a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter .format = tex_format, 1719481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .components = 1720481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1721481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, 1722481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A, 1723481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1724481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}, 17251856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter .flags = 0, 17264e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 1727a9ae38392fd4359242fda1d2961f8347dbe970f7Jon Ashburn 17284e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter /* create sampler */ 172969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateSampler(demo->device, &sampler, NULL, 1730481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->textures[i].sampler); 17314e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 17324e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 17334e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter /* create image view */ 17344e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter view.image = demo->textures[i].image; 173569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateImageView(demo->device, &view, NULL, 1736481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->textures[i].view); 17374e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 17384e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } 17394e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 17404e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1741c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbourvoid demo_prepare_cube_data_buffers(struct demo *demo) { 1742ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter VkBufferCreateInfo buf_info; 17432318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski VkMemoryRequirements mem_reqs; 1744c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkMemoryAllocateInfo mem_alloc; 1745e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint8_t *pData; 1746e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter mat4x4 MVP, VP; 174722a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 174837a43a64af08599b5fe5429c6c331f42f765fca9Courtney Goeltzenleuchter bool U_ASSERT_ONLY pass; 17499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter struct vktexcube_vs_uniform data; 1750e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1751e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix); 1752e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter mat4x4_mul(MVP, VP, demo->model_matrix); 1753e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter memcpy(data.mvp, MVP, sizeof(MVP)); 1754481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // dumpMatrix("MVP", MVP); 1755e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 17569784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (unsigned int i = 0; i < 12 * 3; i++) { 1757481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz data.position[i][0] = g_vertex_buffer_data[i * 3]; 1758481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz data.position[i][1] = g_vertex_buffer_data[i * 3 + 1]; 1759481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz data.position[i][2] = g_vertex_buffer_data[i * 3 + 2]; 1760e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter data.position[i][3] = 1.0f; 1761481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz data.attr[i][0] = g_uv_buffer_data[2 * i]; 1762481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz data.attr[i][1] = g_uv_buffer_data[2 * i + 1]; 1763e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter data.attr[i][2] = 0; 1764e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter data.attr[i][3] = 0; 1765e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter } 1766e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1767714df45f6733792374ad4fcb6e0fef3b47fbeb89Chia-I Wu memset(&buf_info, 0, sizeof(buf_info)); 17689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 1769ad870818fc61ad8dccc8af2c4992f15efa9c4c7fCourtney Goeltzenleuchter buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; 17708604939f334616555e35ef5771bd61e4a9160c88Cody Northrop buf_info.size = sizeof(data); 1771714df45f6733792374ad4fcb6e0fef3b47fbeb89Chia-I Wu 1772c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour for (unsigned int i = 0; i < demo->swapchainImageCount; i++) { 1773c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = 1774c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkCreateBuffer(demo->device, &buf_info, NULL, 1775c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].uniform_buffer); 1776c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 1777e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1778c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkGetBufferMemoryRequirements(demo->device, 1779c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->swapchain_image_resources[i].uniform_buffer, 1780c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &mem_reqs); 1781e82d5b6d3d359f4d24b93f1b39a97ee3ed83c39fDominik Witczak 1782c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 1783c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour mem_alloc.pNext = NULL; 1784c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour mem_alloc.allocationSize = mem_reqs.size; 1785c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour mem_alloc.memoryTypeIndex = 0; 1786e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1787c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour pass = memory_type_from_properties( 1788c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 1789c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1790c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &mem_alloc.memoryTypeIndex); 1791c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(pass); 1792e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1793c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkAllocateMemory(demo->device, &mem_alloc, NULL, 1794c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].uniform_memory); 1795c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 1796e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1797c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkMapMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, 0, 1798c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VK_WHOLE_SIZE, 0, (void **)&pData); 1799c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 1800c6ae13d46c9c8a6651bf3809e2a12c69dda8a428Jon Ashburn 1801c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour memcpy(pData, &data, sizeof data); 18022318261dc2f6199f031ba9b815730ee5d649d57bMark Lobodzinski 1803c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkUnmapMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory); 1804714df45f6733792374ad4fcb6e0fef3b47fbeb89Chia-I Wu 1805c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkBindBufferMemory(demo->device, demo->swapchain_image_resources[i].uniform_buffer, 1806c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo->swapchain_image_resources[i].uniform_memory, 0); 1807c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 1808c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour } 1809e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter} 1810e3342401d163212fce30ebb04dc0e0c998a058a3Courtney Goeltzenleuchter 1811481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_descriptor_layout(struct demo *demo) { 1812382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkDescriptorSetLayoutBinding layout_bindings[2] = { 1813481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [0] = 1814481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1815481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .binding = 0, 1816481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1817481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .descriptorCount = 1, 1818481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, 1819481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pImmutableSamplers = NULL, 1820481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1821481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [1] = 1822481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1823481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .binding = 1, 1824481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1825481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .descriptorCount = DEMO_TEXTURE_COUNT, 1826481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, 1827481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pImmutableSamplers = NULL, 1828481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1829f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu }; 1830382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkDescriptorSetLayoutCreateInfo descriptor_layout = { 18319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 1832fc9d913ebe3461e4374d4264dfd5c9bad99df63dChia-I Wu .pNext = NULL, 1833763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu .bindingCount = 2, 1834adb61352bcf8a9c9080c562e7bca5d43230dd316Jon Ashburn .pBindings = layout_bindings, 18356e68a893f0364c1157789d260cdf84365cb58cf7Chia-I Wu }; 183622a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 18374e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1838481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL, 1839481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->desc_layout); 18407732cb2481328c1e94a0f308b315cc48df530dc2Chia-I Wu assert(!err); 18417732cb2481328c1e94a0f308b315cc48df530dc2Chia-I Wu 1842556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski const VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = { 1843481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 1844481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pNext = NULL, 1845763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu .setLayoutCount = 1, 1846481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pSetLayouts = &demo->desc_layout, 1847556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski }; 1848556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski 1849481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL, 1850556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski &demo->pipeline_layout); 18514e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 18524e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 18534e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1854481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_render_pass(struct demo *demo) { 1855746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // The initial layout for the color and depth attachments will be LAYOUT_UNDEFINED 1856746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // because at the start of the renderpass, we don't care about their contents. 1857746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // At the start of the subpass, the color attachment's layout will be transitioned 1858746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // to LAYOUT_COLOR_ATTACHMENT_OPTIMAL and the depth stencil attachment's layout 1859746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // will be transitioned to LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL. At the end of 1860746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // the renderpass, the color attachment's layout will be transitioned to 1861746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // LAYOUT_PRESENT_SRC_KHR to be ready to present. This is all done as part of 1862746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour // the renderpass, no barriers are necessary. 1863c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu const VkAttachmentDescription attachments[2] = { 1864481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [0] = 1865481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1866481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .format = demo->format, 18672672a35c2fda0a8db8b8b1b7c7f95922580e5b4dTony Barbour .flags = 0, 1868481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .samples = VK_SAMPLE_COUNT_1_BIT, 1869481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, 1870481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .storeOp = VK_ATTACHMENT_STORE_OP_STORE, 1871481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, 1872481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, 1873746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, 1874a5b04f44d06af86b917f3866f8e05404ff3aa052Tony Barbour .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 1875481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1876481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [1] = 1877481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 1878481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .format = demo->depth.format, 18792672a35c2fda0a8db8b8b1b7c7f95922580e5b4dTony Barbour .flags = 0, 1880481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .samples = VK_SAMPLE_COUNT_1_BIT, 1881481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, 1882481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, 1883481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, 1884481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, 1885481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .initialLayout = 1886746da8ab2a40b2ce6db5a7747f786c64ee23f68bTony Barbour VK_IMAGE_LAYOUT_UNDEFINED, 1887481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .finalLayout = 1888481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1889481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 1890c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu }; 1891c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu const VkAttachmentReference color_reference = { 1892481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .attachment = 0, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1893c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu }; 1894ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu const VkAttachmentReference depth_reference = { 1895ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .attachment = 1, 1896ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1897ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu }; 1898c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu const VkSubpassDescription subpass = { 1899c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, 1900c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .flags = 0, 1901763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu .inputAttachmentCount = 0, 19026de6b0b93a1704d673c42fea1f0e3e4e720a14ffCody Northrop .pInputAttachments = NULL, 1903763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu .colorAttachmentCount = 1, 19046de6b0b93a1704d673c42fea1f0e3e4e720a14ffCody Northrop .pColorAttachments = &color_reference, 19056de6b0b93a1704d673c42fea1f0e3e4e720a14ffCody Northrop .pResolveAttachments = NULL, 1906ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu .pDepthStencilAttachment = &depth_reference, 1907763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu .preserveAttachmentCount = 0, 19086de6b0b93a1704d673c42fea1f0e3e4e720a14ffCody Northrop .pPreserveAttachments = NULL, 190976cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu }; 191076cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu const VkRenderPassCreateInfo rp_info = { 191176cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 191276cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu .pNext = NULL, 19132672a35c2fda0a8db8b8b1b7c7f95922580e5b4dTony Barbour .flags = 0, 1914c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .attachmentCount = 2, 1915c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .pAttachments = attachments, 1916c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .subpassCount = 1, 1917c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .pSubpasses = &subpass, 1918c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .dependencyCount = 0, 1919c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu .pDependencies = NULL, 192076cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu }; 1921c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu VkResult U_ASSERT_ONLY err; 192276cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu 192369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass); 192476cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu assert(!err); 192576cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu} 192676cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu 19271a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Krausstatic VkShaderModule demo_prepare_shader_module(struct demo *demo, const uint32_t *code, size_t size) { 1928062ad15850af42c5e45ec9dfb961ff243a6e8923Chia-I Wu VkShaderModule module; 19290b29b0d0258f6a9ad46a14eb120fbb1f6dafa5a1Courtney Goeltzenleuchter VkShaderModuleCreateInfo moduleCreateInfo; 1930e92af7e35e235faf650de0ffd413aa2e8417fd2dCourtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 19314e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 19320b29b0d0258f6a9ad46a14eb120fbb1f6dafa5a1Courtney Goeltzenleuchter moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 19330b29b0d0258f6a9ad46a14eb120fbb1f6dafa5a1Courtney Goeltzenleuchter moduleCreateInfo.pNext = NULL; 19341a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus moduleCreateInfo.flags = 0; 19358961c984fc7337f83d3c1b7c720a2f37c8d57afdCourtney Goeltzenleuchter moduleCreateInfo.codeSize = size; 19368961c984fc7337f83d3c1b7c720a2f37c8d57afdCourtney Goeltzenleuchter moduleCreateInfo.pCode = code; 19371a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus 19388961c984fc7337f83d3c1b7c720a2f37c8d57afdCourtney Goeltzenleuchter err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); 19398961c984fc7337f83d3c1b7c720a2f37c8d57afdCourtney Goeltzenleuchter assert(!err); 1940062ad15850af42c5e45ec9dfb961ff243a6e8923Chia-I Wu 1941062ad15850af42c5e45ec9dfb961ff243a6e8923Chia-I Wu return module; 19424e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 19434e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 19441a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Krausstatic void demo_prepare_vs(struct demo *demo) { 19451a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus const uint32_t vs_code[] = { 19461a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus#include "cube.vert.inc" 19471a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus }; 19481a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus demo->vert_shader_module = demo_prepare_shader_module(demo, vs_code, sizeof(vs_code)); 19494e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 19504e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 19511a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Krausstatic void demo_prepare_fs(struct demo *demo) { 19521a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus const uint32_t fs_code[] = { 19531a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus#include "cube.frag.inc" 19541a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus }; 19551a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus demo->frag_shader_module = demo_prepare_shader_module(demo, fs_code, sizeof(fs_code)); 19564e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 19574e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1958481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_pipeline(struct demo *demo) { 1959382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter VkGraphicsPipelineCreateInfo pipeline; 19600d60d274605d3061e5d8ac1cf38e4e9b5ee3ff1aJon Ashburn VkPipelineCacheCreateInfo pipelineCache; 1961481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineVertexInputStateCreateInfo vi; 1962e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour VkPipelineInputAssemblyStateCreateInfo ia; 1963481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineRasterizationStateCreateInfo rs; 1964481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineColorBlendStateCreateInfo cb; 1965481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineDepthStencilStateCreateInfo ds; 1966481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineViewportStateCreateInfo vp; 1967481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineMultisampleStateCreateInfo ms; 1968481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkDynamicState dynamicStateEnables[VK_DYNAMIC_STATE_RANGE_SIZE]; 1969481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkPipelineDynamicStateCreateInfo dynamicState; 197022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 19714e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1972811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell memset(dynamicStateEnables, 0, sizeof dynamicStateEnables); 1973811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell memset(&dynamicState, 0, sizeof dynamicState); 1974811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; 1975811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell dynamicState.pDynamicStates = dynamicStateEnables; 1976811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell 19774e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter memset(&pipeline, 0, sizeof(pipeline)); 19789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter pipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 1979556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinski pipeline.layout = demo->pipeline_layout; 19804e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 1981009e865a05e0c50620497a382124cd19129eb522Jason Ekstrand memset(&vi, 0, sizeof(vi)); 1982009e865a05e0c50620497a382124cd19129eb522Jason Ekstrand vi.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; 1983009e865a05e0c50620497a382124cd19129eb522Jason Ekstrand 19844e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter memset(&ia, 0, sizeof(ia)); 1985e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour ia.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; 19868205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour ia.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; 19874e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 19884e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter memset(&rs, 0, sizeof(rs)); 1989c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu rs.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 1990c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu rs.polygonMode = VK_POLYGON_MODE_FILL; 1991ce532f7eb8ce347a0bc2c7d848d5017fa31d2533Chia-I Wu rs.cullMode = VK_CULL_MODE_BACK_BIT; 19921f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu rs.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 1993c0f9fa7f4a5e44878c491476e2ece1bacd3223c2Courtney Goeltzenleuchter rs.depthClampEnable = VK_FALSE; 1994f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop rs.rasterizerDiscardEnable = VK_FALSE; 1995f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop rs.depthBiasEnable = VK_FALSE; 1996a27508babf63d50aea75883a3702979193c23683Mark Young rs.lineWidth = 1.0f; 19974e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 19984e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter memset(&cb, 0, sizeof(cb)); 1999e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour cb.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; 2000e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour VkPipelineColorBlendAttachmentState att_state[1]; 2001fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour memset(att_state, 0, sizeof(att_state)); 2002c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu att_state[0].colorWriteMask = 0xf; 20039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter att_state[0].blendEnable = VK_FALSE; 2004fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour cb.attachmentCount = 1; 2005fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour cb.pAttachments = att_state; 2006fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour 2007fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour memset(&vp, 0, sizeof(vp)); 2008e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour vp.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 20098205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour vp.viewportCount = 1; 2010481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz dynamicStateEnables[dynamicState.dynamicStateCount++] = 2011481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_DYNAMIC_STATE_VIEWPORT; 2012811eb740b7f7ea79ca283426e093d89fd285b76bPiers Daniell vp.scissorCount = 1; 2013481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz dynamicStateEnables[dynamicState.dynamicStateCount++] = 2014481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VK_DYNAMIC_STATE_SCISSOR; 2015fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour 2016fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour memset(&ds, 0, sizeof(ds)); 2017e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour ds.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; 20189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter ds.depthTestEnable = VK_TRUE; 20199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter ds.depthWriteEnable = VK_TRUE; 20201f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu ds.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL; 2021e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop ds.depthBoundsTestEnable = VK_FALSE; 2022c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu ds.back.failOp = VK_STENCIL_OP_KEEP; 2023c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu ds.back.passOp = VK_STENCIL_OP_KEEP; 2024c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu ds.back.compareOp = VK_COMPARE_OP_ALWAYS; 20259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter ds.stencilTestEnable = VK_FALSE; 2026fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour ds.front = ds.back; 20274e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2028fa6cac730ca48f6202a8f35d79db34cb3f3b9df8Tony Barbour memset(&ms, 0, sizeof(ms)); 2029e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour ms.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; 2030e9825b7a5f81e02cdb76851ed18c8ce404cb3deeCody Northrop ms.pSampleMask = NULL; 20313138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; 20324e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 20331a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus demo_prepare_vs(demo); 20341a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus demo_prepare_fs(demo); 20351a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus 20360e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski // Two stages: vs and fs 20370e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski VkPipelineShaderStageCreateInfo shaderStages[2]; 20380e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); 20390e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski 2040481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 2041481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; 20421a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus shaderStages[0].module = demo->vert_shader_module; 2043481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[0].pName = "main"; 20440e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski 2045481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 2046481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; 20471a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus shaderStages[1].module = demo->frag_shader_module; 2048481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz shaderStages[1].pName = "main"; 20490e0fb5cdf0f53e118ad3a405c3b881ef2ef4147dMark Lobodzinski 20500d60d274605d3061e5d8ac1cf38e4e9b5ee3ff1aJon Ashburn memset(&pipelineCache, 0, sizeof(pipelineCache)); 20510d60d274605d3061e5d8ac1cf38e4e9b5ee3ff1aJon Ashburn pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 20524e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2053481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL, 2054481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->pipelineCache); 20550d60d274605d3061e5d8ac1cf38e4e9b5ee3ff1aJon Ashburn assert(!err); 2056e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour 2057481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pVertexInputState = &vi; 2058e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour pipeline.pInputAssemblyState = &ia; 2059481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pRasterizationState = &rs; 2060481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pColorBlendState = &cb; 2061481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pMultisampleState = &ms; 2062481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pViewportState = &vp; 2063481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pDepthStencilState = &ds; 20641a5b012ca90871f9018a637fa61f68c7e89e2ebfPetr Kraus pipeline.stageCount = ARRAY_SIZE(shaderStages); 2065481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pStages = shaderStages; 2066481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.renderPass = demo->render_pass; 2067481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz pipeline.pDynamicState = &dynamicState; 2068e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour 206914eb5eac6d11950c8cc9fa98f075fabc35bbc00fCourtney Goeltzenleuchter pipeline.renderPass = demo->render_pass; 207014eb5eac6d11950c8cc9fa98f075fabc35bbc00fCourtney Goeltzenleuchter 2071481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1, 2072481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &pipeline, NULL, &demo->pipeline); 20734e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 20744e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 207569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL); 207669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL); 20774e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 20784e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2079481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_descriptor_pool(struct demo *demo) { 2080c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu const VkDescriptorPoolSize type_counts[2] = { 2081481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [0] = 2082481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 2083481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2084c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .descriptorCount = demo->swapchainImageCount, 2085481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 2086481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz [1] = 2087481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz { 2088481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2089c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .descriptorCount = demo->swapchainImageCount * DEMO_TEXTURE_COUNT, 2090481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz }, 2091f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu }; 2092382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkDescriptorPoolCreateInfo descriptor_pool = { 20939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, 2094f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu .pNext = NULL, 2095c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour .maxSets = demo->swapchainImageCount, 2096c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu .poolSizeCount = 2, 2097c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu .pPoolSizes = type_counts, 2098f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu }; 209922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 2100f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 2101481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL, 2102481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->desc_pool); 2103f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu assert(!err); 2104f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu} 2105f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 2106481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_descriptor_set(struct demo *demo) { 210734aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter VkDescriptorImageInfo tex_descs[DEMO_TEXTURE_COUNT]; 21088cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu VkWriteDescriptorSet writes[2]; 210922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour VkResult U_ASSERT_ONLY err; 2110f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 21111f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu VkDescriptorSetAllocateInfo alloc_info = { 2112c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 2113831c183417705004ea225726d450b7259e7384c7Courtney Goeltzenleuchter .pNext = NULL, 2114831c183417705004ea225726d450b7259e7384c7Courtney Goeltzenleuchter .descriptorPool = demo->desc_pool, 2115a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .descriptorSetCount = 1, 2116481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pSetLayouts = &demo->desc_layout}; 2117c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour 2118c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour VkDescriptorBufferInfo buffer_info; 2119c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour buffer_info.offset = 0; 2120c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour buffer_info.range = sizeof(struct vktexcube_vs_uniform); 2121f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 21228cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu memset(&tex_descs, 0, sizeof(tex_descs)); 21239784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (unsigned int i = 0; i < DEMO_TEXTURE_COUNT; i++) { 212434aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter tex_descs[i].sampler = demo->textures[i].sampler; 212534aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter tex_descs[i].imageView = demo->textures[i].view; 212634aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter tex_descs[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL; 21278cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu } 21288cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu 21298cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu memset(&writes, 0, sizeof(writes)); 21308cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu 21318cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 2132763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu writes[0].descriptorCount = 1; 21338cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2134c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour writes[0].pBufferInfo = &buffer_info; 21358cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu 21368cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 21371f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu writes[1].dstBinding = 1; 2138763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu writes[1].descriptorCount = DEMO_TEXTURE_COUNT; 21398cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu writes[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; 214034aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter writes[1].pImageInfo = tex_descs; 21418cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu 2142c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour for (unsigned int i = 0; i < demo->swapchainImageCount; i++) { 2143c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->swapchain_image_resources[i].descriptor_set); 2144c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 2145c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour buffer_info.buffer = demo->swapchain_image_resources[i].uniform_buffer; 2146c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour writes[0].dstSet = demo->swapchain_image_resources[i].descriptor_set; 2147c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour writes[1].dstSet = demo->swapchain_image_resources[i].descriptor_set; 2148c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkUpdateDescriptorSets(demo->device, 2, writes, 0, NULL); 2149c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour } 2150f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu} 2151f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 2152481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare_framebuffers(struct demo *demo) { 21531856d6f9294c7f9544cb58823fbfddef1546229dCourtney Goeltzenleuchter VkImageView attachments[2]; 2154f110c6ea46391b57f30588bbda17e7183e8c5bd7Cody Northrop attachments[1] = demo->depth.view; 2155f110c6ea46391b57f30588bbda17e7183e8c5bd7Cody Northrop 215676cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu const VkFramebufferCreateInfo fb_info = { 2157481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 2158481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pNext = NULL, 2159481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .renderPass = demo->render_pass, 2160481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .attachmentCount = 2, 2161481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pAttachments = attachments, 2162481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .width = demo->width, 2163481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .height = demo->height, 2164481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .layers = 1, 216576cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu }; 216676cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu VkResult U_ASSERT_ONLY err; 216776cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu uint32_t i; 216876cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu 21695aabff59dba24f3fad04176f55c3135c9f4d571bTony Barbour for (i = 0; i < demo->swapchainImageCount; i++) { 2170c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour attachments[0] = demo->swapchain_image_resources[i].view; 2171481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateFramebuffer(demo->device, &fb_info, NULL, 2172c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].framebuffer); 217376cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu assert(!err); 217476cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu } 217576cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu} 217676cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu 2177481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_prepare(struct demo *demo) { 217818ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop VkResult U_ASSERT_ONLY err; 217918ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop 21801f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu const VkCommandPoolCreateInfo cmd_pool_info = { 21811f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 218218ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop .pNext = NULL, 2183755151776f6b9a0ab34095b980819e4318a86529Tony Barbour .queueFamilyIndex = demo->graphics_queue_family_index, 218418ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop .flags = 0, 218518ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop }; 2186481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, 2187481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->cmd_pool); 218818ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop assert(!err); 218918ea11b03ca9bcf3b009434a987f908bfac20324Cody Northrop 21901f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu const VkCommandBufferAllocateInfo cmd = { 2191c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 21924e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 21931f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .commandPool = demo->cmd_pool, 21941f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, 2195a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn .commandBufferCount = 1, 21964e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 21973825f87dc62f910827b1b842213fc68b22302e23Tony Barbour err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->cmd); 21983825f87dc62f910827b1b842213fc68b22302e23Tony Barbour assert(!err); 21993825f87dc62f910827b1b842213fc68b22302e23Tony Barbour VkCommandBufferBeginInfo cmd_buf_info = { 22003825f87dc62f910827b1b842213fc68b22302e23Tony Barbour .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 22013825f87dc62f910827b1b842213fc68b22302e23Tony Barbour .pNext = NULL, 22023825f87dc62f910827b1b842213fc68b22302e23Tony Barbour .flags = 0, 22033825f87dc62f910827b1b842213fc68b22302e23Tony Barbour .pInheritanceInfo = NULL, 22043825f87dc62f910827b1b842213fc68b22302e23Tony Barbour }; 22053825f87dc62f910827b1b842213fc68b22302e23Tony Barbour err = vkBeginCommandBuffer(demo->cmd, &cmd_buf_info); 22063825f87dc62f910827b1b842213fc68b22302e23Tony Barbour assert(!err); 22074e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 22084e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_prepare_buffers(demo); 22094e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_prepare_depth(demo); 22104e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_prepare_textures(demo); 2211c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo_prepare_cube_data_buffers(demo); 22124e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2213f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu demo_prepare_descriptor_layout(demo); 221476cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu demo_prepare_render_pass(demo); 22154e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_prepare_pipeline(demo); 22164e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2217338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { 2218481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = 2219c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkAllocateCommandBuffers(demo->device, &cmd, &demo->swapchain_image_resources[i].cmd); 2220bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter assert(!err); 2221bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter } 2222f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu 22231ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 22249784e78683f658f304062235ceb2dd2c2652c357Karl Schultz const VkCommandPoolCreateInfo present_cmd_pool_info = { 22251ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 22261ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pNext = NULL, 22271ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .queueFamilyIndex = demo->present_queue_family_index, 22281ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .flags = 0, 22291ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour }; 22309784e78683f658f304062235ceb2dd2c2652c357Karl Schultz err = vkCreateCommandPool(demo->device, &present_cmd_pool_info, NULL, 22311ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour &demo->present_cmd_pool); 22321ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 22339784e78683f658f304062235ceb2dd2c2652c357Karl Schultz const VkCommandBufferAllocateInfo present_cmd_info = { 22341ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 22351ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pNext = NULL, 22361ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .commandPool = demo->present_cmd_pool, 22371ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, 22381ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .commandBufferCount = 1, 22391ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour }; 22401ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { 22411ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour err = vkAllocateCommandBuffers( 22429784e78683f658f304062235ceb2dd2c2652c357Karl Schultz demo->device, &present_cmd_info, &demo->swapchain_image_resources[i].graphics_to_present_cmd); 22431ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 22441ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour demo_build_image_ownership_cmd(demo, i); 22451ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 22461ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 22471ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 22488d24b3bada572c64ef4f86f782e1f5136976f31dChia-I Wu demo_prepare_descriptor_pool(demo); 2249f838506ef976d1659c5dc5528215411c18011fcfChia-I Wu demo_prepare_descriptor_set(demo); 2250bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter 225176cd422984e4ade573413cf3dbac6209ab08dc8aChia-I Wu demo_prepare_framebuffers(demo); 2252bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter 2253338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott for (uint32_t i = 0; i < demo->swapchainImageCount; i++) { 2254bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter demo->current_buffer = i; 2255c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour demo_draw_build_cmd(demo, demo->swapchain_image_resources[i].cmd); 2256bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter } 2257bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter 2258bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter /* 2259bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter * Prepare functions above may generate pipeline commands 2260bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter * that need to be flushed before beginning the render loop. 2261bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter */ 2262bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter demo_flush_init_cmd(demo); 2263741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour if (demo->staging_texture.image) { 2264741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour demo_destroy_texture_image(demo, &demo->staging_texture); 2265741f32f5a7360cdc7f20bce75ea1d2caf321dda2Tony Barbour } 2266bfccf41a86ba670f345302ab4d7ab8a6915fb1d2Courtney Goeltzenleuchter 2267bd3b3aa599e47aa07325deb58fc53509ea672fdeCourtney Goeltzenleuchter demo->current_buffer = 0; 2268b194be6cb3e30bb904364f6ffebaf6ecb343dd71Mike Stroyan demo->prepared = true; 22694e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 22704e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2271481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_cleanup(struct demo *demo) { 2272eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo uint32_t i; 2273eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2274eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->prepared = false; 2275a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour vkDeviceWaitIdle(demo->device); 2276eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 22776b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour // Wait for fences from present operations 22786b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour for (i = 0; i < FRAME_LAG; i++) { 2279ed0cd2f95c18b3d3f267c45b149ba435b7d3a0eeszdarkhack vkWaitForFences(demo->device, 1, &demo->fences[i], VK_TRUE, UINT64_MAX); 22806b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour vkDestroyFence(demo->device, demo->fences[i], NULL); 22816b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour vkDestroySemaphore(demo->device, demo->image_acquired_semaphores[i], NULL); 22826b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour vkDestroySemaphore(demo->device, demo->draw_complete_semaphores[i], NULL); 22836b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour if (demo->separate_present_queue) { 22846b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour vkDestroySemaphore(demo->device, demo->image_ownership_semaphores[i], NULL); 22856b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour } 22866b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour } 22876b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 22885aabff59dba24f3fad04176f55c3135c9f4d571bTony Barbour for (i = 0; i < demo->swapchainImageCount; i++) { 2289c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); 2290de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour } 229169f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); 2292eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 229369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipeline(demo->device, demo->pipeline, NULL); 229469f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); 229569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyRenderPass(demo->device, demo->render_pass, NULL); 229669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); 229769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); 2298eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2299eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { 230069f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImageView(demo->device, demo->textures[i].view, NULL); 230169f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImage(demo->device, demo->textures[i].image, NULL); 230269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkFreeMemory(demo->device, demo->textures[i].mem, NULL); 230369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); 2304eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo } 2305b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); 2306eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 230769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImageView(demo->device, demo->depth.view, NULL); 230869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImage(demo->device, demo->depth.image, NULL); 230969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkFreeMemory(demo->device, demo->depth.mem, NULL); 2310eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2311338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott for (i = 0; i < demo->swapchainImageCount; i++) { 2312c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); 2313481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, 2314c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].cmd); 2315c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); 2316c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); 2317eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo } 2318c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour free(demo->swapchain_image_resources); 2319283f4a3f2233f244650b6583f3b0d9b11d49aa67Courtney Goeltzenleuchter free(demo->queue_props); 232069f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); 23216b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 23221ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 23231ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); 23241ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 2325c7e3fbda0891c48fb667f645d40d495be48f3fe8Tony Barbour vkDeviceWaitIdle(demo->device); 232669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDevice(demo->device, NULL); 2327a65ecc2039ef220af0324ef46f3c3caf623f6976Tony Barbour if (demo->validate) { 2328f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter demo->DestroyDebugReportCallback(demo->inst, demo->msg_callback, NULL); 2329a65ecc2039ef220af0324ef46f3c3caf623f6976Tony Barbour } 2330b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott vkDestroySurfaceKHR(demo->inst, demo->surface, NULL); 2331eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2332028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#if defined(VK_USE_PLATFORM_XLIB_KHR) 23339c699d0e9eb4d6b049609d57271cb216228c61cbTony Barbour XDestroyWindow(demo->display, demo->xlib_window); 23349c699d0e9eb4d6b049609d57271cb216228c61cbTony Barbour XCloseDisplay(demo->display); 233571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_XCB_KHR) 2336e95075ff904b270aea5084c1ef3fd4453eea1d73Pavol Klacansky xcb_destroy_window(demo->connection, demo->xcb_window); 233771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine xcb_disconnect(demo->connection); 233871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine free(demo->atom_wm_delete_window); 2339a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 2340ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_keyboard_destroy(demo->keyboard); 2341ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_pointer_destroy(demo->pointer); 2342ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_seat_destroy(demo->seat); 2343a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_surface_destroy(demo->shell_surface); 2344a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_surface_destroy(demo->window); 2345a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_destroy(demo->shell); 2346a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_compositor_destroy(demo->compositor); 2347a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_registry_destroy(demo->registry); 2348a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_display_disconnect(demo->display); 23490394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 235071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 23510017308648b6bf8eef10ef0ffb9470576c0c2e9eKarl Schultz 23520017308648b6bf8eef10ef0ffb9470576c0c2e9eKarl Schultz vkDestroyInstance(demo->inst, NULL); 2353eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo} 2354eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2355481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_resize(struct demo *demo) { 2356e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott uint32_t i; 2357e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2358b194be6cb3e30bb904364f6ffebaf6ecb343dd71Mike Stroyan // Don't react to resize until after first initialization. 2359b194be6cb3e30bb904364f6ffebaf6ecb343dd71Mike Stroyan if (!demo->prepared) { 2360b194be6cb3e30bb904364f6ffebaf6ecb343dd71Mike Stroyan return; 2361b194be6cb3e30bb904364f6ffebaf6ecb343dd71Mike Stroyan } 2362e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // In order to properly resize the window, we must re-create the swapchain 2363e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // AND redo the command buffers, etc. 2364e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // 2365e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // First, perform part of the demo_cleanup() function: 2366e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott demo->prepared = false; 2367a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour vkDeviceWaitIdle(demo->device); 2368e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2369e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott for (i = 0; i < demo->swapchainImageCount; i++) { 2370c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); 2371e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 237269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); 2373e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 237469f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipeline(demo->device, demo->pipeline, NULL); 237569f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); 237669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyRenderPass(demo->device, demo->render_pass, NULL); 237769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); 237869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); 2379e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2380e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { 238169f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImageView(demo->device, demo->textures[i].view, NULL); 238269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImage(demo->device, demo->textures[i].image, NULL); 238369f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkFreeMemory(demo->device, demo->textures[i].mem, NULL); 238469f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); 2385e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 2386e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 238769f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImageView(demo->device, demo->depth.view, NULL); 238869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyImage(demo->device, demo->depth.image, NULL); 238969f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkFreeMemory(demo->device, demo->depth.mem, NULL); 2390e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2391e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott for (i = 0; i < demo->swapchainImageCount; i++) { 2392c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); 2393481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, 2394c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour &demo->swapchain_image_resources[i].cmd); 2395c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); 2396c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); 2397e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 239869f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); 23991ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 24001ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); 24011ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 2402c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour free(demo->swapchain_image_resources); 2403e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2404e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // Second, re-perform the demo_prepare() function, which will re-create the 2405e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott // swapchain: 2406e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott demo_prepare(demo); 2407e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott} 2408e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott 2409eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo// On MS-Windows, make this a global, so it's available to WndProc() 2410eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedostruct demo demo; 2411eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 241271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 2413481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_run(struct demo *demo) { 2414857542bbc273de949d23515e9a36d4478ccd82e4Courtney Goeltzenleuchter if (!demo->prepared) 2415857542bbc273de949d23515e9a36d4478ccd82e4Courtney Goeltzenleuchter return; 2416e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 2417e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo_draw(demo); 2418eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->curFrame++; 2419481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (demo->frameCount != INT_MAX && demo->curFrame == demo->frameCount) { 2420501fdc2af7c60c923f2b1b0cc44187728d27b9f8Karl Schultz PostQuitMessage(validation_error); 2421eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo } 2422eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo} 2423e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 2424e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott// MS-Windows event handling function: 2425481756e168555e1bf150d3b8f1b81edca1d98c43Karl SchultzLRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 2426481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz switch (uMsg) { 2427e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott case WM_CLOSE: 242851940e40346835ebbf3a3fb8c06c07a3eb518e7bKarl Schultz PostQuitMessage(validation_error); 24295685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour break; 2430e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott case WM_PAINT: 243145c0906c01533675d27207ff07212adf80ab5187Tony Barbour // The validation callback calls MessageBox which can generate paint 243245c0906c01533675d27207ff07212adf80ab5187Tony Barbour // events - don't make more Vulkan calls if we got here from the 243345c0906c01533675d27207ff07212adf80ab5187Tony Barbour // callback 243445c0906c01533675d27207ff07212adf80ab5187Tony Barbour if (!in_callback) { 243545c0906c01533675d27207ff07212adf80ab5187Tony Barbour demo_run(&demo); 243645c0906c01533675d27207ff07212adf80ab5187Tony Barbour } 243718b53e792aad08d1d95210c372e1326bb952ef9aTony Barbour break; 2438f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay case WM_GETMINMAXINFO: // set window's minimum size 2439f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay ((MINMAXINFO*)lParam)->ptMinTrackSize = demo.minsize; 2440f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay return 0; 2441f3f8082b8cc52a5bca59e2a8713d64ee5b9df74eIan Elliott case WM_SIZE: 2442fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell // Resize the application to the new window size, except when 2443fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell // it was minimized. Vulkan doesn't support images or swapchains 2444fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell // with width=0 and height=0. 2445fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell if (wParam != SIZE_MINIMIZED) { 2446fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell demo.width = lParam & 0xffff; 2447de4760bab32374c471de1afadfbf99d0ac19ca32Tony Barbour demo.height = (lParam & 0xffff0000) >> 16; 2448fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell demo_resize(&demo); 2449fdd5af6a3d8cac9fd228eb0da773bdc54f1f90ccPiers Daniell } 2450f3f8082b8cc52a5bca59e2a8713d64ee5b9df74eIan Elliott break; 2451e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott default: 2452e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott break; 2453e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 2454e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott return (DefWindowProc(hWnd, uMsg, wParam, lParam)); 2455e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott} 2456e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 2457481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_create_window(struct demo *demo) { 2458481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz WNDCLASSEX win_class; 2459e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 2460e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott // Initialize the window class structure: 2461e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.cbSize = sizeof(WNDCLASSEX); 2462e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.style = CS_HREDRAW | CS_VREDRAW; 2463e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.lpfnWndProc = WndProc; 2464e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.cbClsExtra = 0; 2465e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.cbWndExtra = 0; 2466e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.hInstance = demo->connection; // hInstance 2467e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); 2468e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.hCursor = LoadCursor(NULL, IDC_ARROW); 2469e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 2470e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.lpszMenuName = NULL; 2471e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.lpszClassName = demo->name; 2472e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); 2473e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott // Register window class: 2474e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott if (!RegisterClassEx(&win_class)) { 2475e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott // It didn't work, so try to give a useful error: 2476e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott printf("Unexpected error trying to start the application!\n"); 2477e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott fflush(stdout); 2478e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott exit(1); 2479e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 2480e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott // Create window with the registered class: 2481481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz RECT wr = {0, 0, demo->width, demo->height}; 2482f585629f8c7ad03f2128aa90dca75d698cb1eb4bMike Stroyan AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); 2483e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo->window = CreateWindowEx(0, 2484e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo->name, // class name 2485e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo->name, // app name 2486e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott WS_OVERLAPPEDWINDOW | // window style 2487481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz WS_VISIBLE | WS_SYSMENU, 2488481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 100, 100, // x/y coords 2489481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz wr.right - wr.left, // width 2490481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz wr.bottom - wr.top, // height 2491481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL, // handle to parent 2492481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL, // handle to menu 2493481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->connection, // hInstance 2494481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL); // no extra parameters 2495e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott if (!demo->window) { 2496e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott // It didn't work, so try to give a useful error: 2497e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott printf("Cannot create a window in which to draw!\n"); 2498e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott fflush(stdout); 2499e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott exit(1); 2500e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 2501f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay // Window client area size must be at least 1 pixel high, to prevent crash. 2502f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay demo->minsize.x = GetSystemMetrics(SM_CXMINTRACK); 2503f47577419de04adea60ce9bb6ace9dae668f88d9Rene Lindsay demo->minsize.y = GetSystemMetrics(SM_CYMINTRACK)+1; 2504e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott} 25054b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 2506a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_create_xlib_window(struct demo *demo) { 2507a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2508ff5d45b96d401c172b3291490987869d7687b67dTony Barbour XInitThreads(); 2509a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->display = XOpenDisplay(NULL); 2510a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour long visualMask = VisualScreenMask; 2511a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour int numberOfVisuals; 251254cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay XVisualInfo vInfoTemplate={}; 2513a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour vInfoTemplate.screen = DefaultScreen(demo->display); 2514a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XVisualInfo *visualInfo = XGetVisualInfo(demo->display, visualMask, 2515a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour &vInfoTemplate, &numberOfVisuals); 2516a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2517a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour Colormap colormap = XCreateColormap( 2518a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->display, RootWindow(demo->display, vInfoTemplate.screen), 2519a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour visualInfo->visual, AllocNone); 2520a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 252154cf48a48c9e593f96d20a9abbdda0d48be906deRene Lindsay XSetWindowAttributes windowAttributes={}; 2522a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour windowAttributes.colormap = colormap; 2523a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour windowAttributes.background_pixel = 0xFFFFFFFF; 2524a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour windowAttributes.border_pixel = 0; 2525a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour windowAttributes.event_mask = 2526a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask; 2527a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2528a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->xlib_window = XCreateWindow( 2529a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->display, RootWindow(demo->display, vInfoTemplate.screen), 0, 0, 2530a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->width, demo->height, 0, visualInfo->depth, InputOutput, 2531a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour visualInfo->visual, 2532a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour CWBackPixel | CWBorderPixel | CWEventMask | CWColormap, &windowAttributes); 2533a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2534a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XSelectInput(demo->display, demo->xlib_window, ExposureMask | KeyPressMask); 2535a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XMapWindow(demo->display, demo->xlib_window); 2536a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XFlush(demo->display); 2537a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->xlib_wm_delete_window = 2538a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XInternAtom(demo->display, "WM_DELETE_WINDOW", False); 2539a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour} 2540a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_handle_xlib_event(struct demo *demo, const XEvent *event) { 2541a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour switch(event->type) { 2542a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case ClientMessage: 2543a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if ((Atom)event->xclient.data.l[0] == demo->xlib_wm_delete_window) 2544a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->quit = true; 2545a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2546a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case KeyPress: 2547a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour switch (event->xkey.keycode) { 2548a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case 0x9: // Escape 2549a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->quit = true; 2550a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2551a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case 0x71: // left arrow key 2552a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo->spin_angle -= demo->spin_increment; 2553a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2554a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case 0x72: // right arrow key 2555a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo->spin_angle += demo->spin_increment; 2556a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2557a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz case 0x41: // space bar 2558a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->pause = !demo->pause; 2559a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2560a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 2561a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2562a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour case ConfigureNotify: 2563a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if ((demo->width != event->xconfigure.width) || 2564a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour (demo->height != event->xconfigure.height)) { 2565a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->width = event->xconfigure.width; 2566a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->height = event->xconfigure.height; 2567a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo_resize(demo); 2568a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 2569a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2570a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour default: 2571a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour break; 2572a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 2573a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2574a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour} 2575a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2576a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_run_xlib(struct demo *demo) { 2577a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2578a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour while (!demo->quit) { 2579a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XEvent event; 2580a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2581a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if (demo->pause) { 2582a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour XNextEvent(demo->display, &event); 2583a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo_handle_xlib_event(demo, &event); 2584a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz } 2585a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz while (XPending(demo->display) > 0) { 2586a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz XNextEvent(demo->display, &event); 2587a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo_handle_xlib_event(demo, &event); 2588a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 2589a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 2590a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo_draw(demo); 2591a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->curFrame++; 2592a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) 2593a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->quit = true; 2594a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 2595a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour} 2596028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XCB_KHR) 2597a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_handle_xcb_event(struct demo *demo, 2598481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const xcb_generic_event_t *event) { 2599886be472ea5f6fc366d2e20156396e17d0947816Piers Daniell uint8_t event_code = event->response_type & 0x7f; 2600ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter switch (event_code) { 26014e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter case XCB_EXPOSE: 2602546114856d78407cceb808957798e5ab7f28cb53Courtney Goeltzenleuchter // TODO: Resize window 26034e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter break; 2604ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter case XCB_CLIENT_MESSAGE: 2605481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if ((*(xcb_client_message_event_t *)event).data.data32[0] == 2606481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (*demo->atom_wm_delete_window).atom) { 2607ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter demo->quit = true; 2608ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter } 2609ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter break; 2610481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case XCB_KEY_RELEASE: { 2611481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const xcb_key_release_event_t *key = 2612481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (const xcb_key_release_event_t *)event; 26134e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2614481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz switch (key->detail) { 2615481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case 0x9: // Escape 2616481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->quit = true; 2617481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz break; 2618481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case 0x71: // left arrow key 2619a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo->spin_angle -= demo->spin_increment; 2620481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz break; 2621481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case 0x72: // right arrow key 2622a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo->spin_angle += demo->spin_increment; 2623481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz break; 2624a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz case 0x41: // space bar 2625481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->pause = !demo->pause; 2626481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz break; 26274e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } 2628481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } break; 2629481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz case XCB_CONFIGURE_NOTIFY: { 2630481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const xcb_configure_notify_event_t *cfg = 2631481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (const xcb_configure_notify_event_t *)event; 2632481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if ((demo->width != cfg->width) || (demo->height != cfg->height)) { 26333d77c303a9ea1b9e380569af811392c56cd9d055Damien Leone demo->width = cfg->width; 26343d77c303a9ea1b9e380569af811392c56cd9d055Damien Leone demo->height = cfg->height; 2635481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo_resize(demo); 2636e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott } 2637481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } break; 26384e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter default: 26394e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter break; 26404e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } 26414e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 26424e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2643a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_run_xcb(struct demo *demo) { 26444e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_flush(demo->connection); 26454e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 26464e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter while (!demo->quit) { 26474e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_generic_event_t *event; 26484e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2649546114856d78407cceb808957798e5ab7f28cb53Courtney Goeltzenleuchter if (demo->pause) { 2650546114856d78407cceb808957798e5ab7f28cb53Courtney Goeltzenleuchter event = xcb_wait_for_event(demo->connection); 2651a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz } 2652a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz else { 2653a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz event = xcb_poll_for_event(demo->connection); 2654a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz } 2655a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz while (event) { 2656a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz demo_handle_xcb_event(demo, event); 2657a655042c300e8e4eed4ffb09cd1ea010471c6069Karl Schultz free(event); 2658546114856d78407cceb808957798e5ab7f28cb53Courtney Goeltzenleuchter event = xcb_poll_for_event(demo->connection); 2659bb3e1312f9d8151ed996962332b814b68a2b4956Courtney Goeltzenleuchter } 26603eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 2661bb3e1312f9d8151ed996962332b814b68a2b4956Courtney Goeltzenleuchter demo_draw(demo); 2662eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->curFrame++; 2663a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) 2664eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->quit = true; 26654e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter } 26664e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 26674e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2668a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbourstatic void demo_create_xcb_window(struct demo *demo) { 26694e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter uint32_t value_mask, value_list[32]; 26704e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2671a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->xcb_window = xcb_generate_id(demo->connection); 26724e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 26734e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; 26744e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter value_list[0] = demo->screen->black_pixel; 2675481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | 2676e2688a5f45a9a9638c5863c95a0521e00030db37Ian Elliott XCB_EVENT_MASK_STRUCTURE_NOTIFY; 26774e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2678a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour xcb_create_window(demo->connection, XCB_COPY_FROM_PARENT, demo->xcb_window, 2679481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->screen->root, 0, 0, demo->width, demo->height, 0, 2680481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz XCB_WINDOW_CLASS_INPUT_OUTPUT, demo->screen->root_visual, 2681481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz value_mask, value_list); 26824e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 2683ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter /* Magic code that will send notification when window is destroyed */ 2684481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom_cookie_t cookie = 2685481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom(demo->connection, 1, 12, "WM_PROTOCOLS"); 2686481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom_reply_t *reply = 2687481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom_reply(demo->connection, cookie, 0); 2688481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 2689481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom_cookie_t cookie2 = 2690481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom(demo->connection, 0, 16, "WM_DELETE_WINDOW"); 2691481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->atom_wm_delete_window = 2692481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz xcb_intern_atom_reply(demo->connection, cookie2, 0); 2693481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 2694a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour xcb_change_property(demo->connection, XCB_PROP_MODE_REPLACE, demo->xcb_window, 2695481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (*reply).atom, 4, 32, 1, 2696ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter &(*demo->atom_wm_delete_window).atom); 2697ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter free(reply); 2698ca21a21bf712837a8f15c2421a18338cb0ce7e01Courtney Goeltzenleuchter 2699a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour xcb_map_window(demo->connection, demo->xcb_window); 2700eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo 2701481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Force the x/y coordinates to 100,100 results are identical in consecutive 2702481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // runs 2703481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz const uint32_t coords[] = {100, 100}; 2704a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour xcb_configure_window(demo->connection, demo->xcb_window, 2705eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords); 27064e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 2707930cd2e549552276db828b6b296601f8c074a21dTony Barbour// VK_USE_PLATFORM_XCB_KHR 2708930cd2e549552276db828b6b296601f8c074a21dTony Barbour#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 2709a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void demo_run(struct demo *demo) { 2710a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong while (!demo->quit) { 2711ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if (demo->pause) { 2712ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_display_dispatch(demo->display); // block and wait for input 2713c0a6fd2089c017b567ff7ea8840d6cf69d4fd1adJoey Bzdek } else { 2714ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_display_dispatch_pending(demo->display); // don't block 2715ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo_draw(demo); 2716ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->curFrame++; 2717ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) demo->quit = true; 2718ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } 2719a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 2720a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong} 2721a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2722a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void handle_ping(void *data UNUSED, 2723a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_shell_surface *shell_surface, 2724a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong uint32_t serial) { 2725a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_surface_pong(shell_surface, serial); 2726a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong} 2727a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2728a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void handle_configure(void *data UNUSED, 2729a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_shell_surface *shell_surface UNUSED, 2730a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong uint32_t edges UNUSED, int32_t width UNUSED, 2731a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong int32_t height UNUSED) {} 2732a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2733a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void handle_popup_done(void *data UNUSED, 2734a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_shell_surface *shell_surface UNUSED) {} 2735a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2736a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic const struct wl_shell_surface_listener shell_surface_listener = { 2737a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong handle_ping, handle_configure, handle_popup_done}; 2738a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2739a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void demo_create_window(struct demo *demo) { 2740a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo->window = wl_compositor_create_surface(demo->compositor); 2741a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong if (!demo->window) { 2742a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong printf("Can not create wayland_surface from compositor!\n"); 2743a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong fflush(stdout); 2744a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong exit(1); 2745a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 2746a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 2747a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo->shell_surface = wl_shell_get_shell_surface(demo->shell, demo->window); 2748a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong if (!demo->shell_surface) { 2749a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong printf("Can not get shell_surface from wayland_surface!\n"); 2750a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong fflush(stdout); 2751a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong exit(1); 2752a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 2753a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_surface_add_listener(demo->shell_surface, &shell_surface_listener, 2754a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo); 2755a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_surface_set_toplevel(demo->shell_surface); 2756a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_shell_surface_set_title(demo->shell_surface, APP_SHORT_NAME); 2757a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong} 275871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 275971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestatic void demo_run(struct demo *demo) { 276071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (!demo->prepared) 276171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return; 276271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 276371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo_draw(demo); 276471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo->curFrame++; 276571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine} 27660394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 2767c35891c60db77ac9d70561e42f37548f335042b8Damien Leone#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) 2768c35891c60db77ac9d70561e42f37548f335042b8Damien Leonestatic VkResult demo_create_display_surface(struct demo *demo) { 2769c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkResult U_ASSERT_ONLY err; 2770c35891c60db77ac9d70561e42f37548f335042b8Damien Leone uint32_t display_count; 2771c35891c60db77ac9d70561e42f37548f335042b8Damien Leone uint32_t mode_count; 2772c35891c60db77ac9d70561e42f37548f335042b8Damien Leone uint32_t plane_count; 2773c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplayPropertiesKHR display_props; 2774c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplayKHR display; 2775c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplayModePropertiesKHR mode_props; 2776c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplayPlanePropertiesKHR *plane_props; 2777c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkBool32 found_plane = VK_FALSE; 2778c35891c60db77ac9d70561e42f37548f335042b8Damien Leone uint32_t plane_index; 2779c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkExtent2D image_extent; 2780c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplaySurfaceCreateInfoKHR create_info; 2781c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2782c35891c60db77ac9d70561e42f37548f335042b8Damien Leone // Get the first display 2783c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetPhysicalDeviceDisplayPropertiesKHR(demo->gpu, &display_count, NULL); 2784c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2785c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2786c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (display_count == 0) { 2787c35891c60db77ac9d70561e42f37548f335042b8Damien Leone printf("Cannot find any display!\n"); 2788c35891c60db77ac9d70561e42f37548f335042b8Damien Leone fflush(stdout); 2789c35891c60db77ac9d70561e42f37548f335042b8Damien Leone exit(1); 2790c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2791c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2792c35891c60db77ac9d70561e42f37548f335042b8Damien Leone display_count = 1; 2793c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetPhysicalDeviceDisplayPropertiesKHR(demo->gpu, &display_count, &display_props); 2794c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err || (err == VK_INCOMPLETE)); 2795c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2796c35891c60db77ac9d70561e42f37548f335042b8Damien Leone display = display_props.display; 2797c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2798c35891c60db77ac9d70561e42f37548f335042b8Damien Leone // Get the first mode of the display 2799c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetDisplayModePropertiesKHR(demo->gpu, display, &mode_count, NULL); 2800c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2801c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2802c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (mode_count == 0) { 2803c35891c60db77ac9d70561e42f37548f335042b8Damien Leone printf("Cannot find any mode for the display!\n"); 2804c35891c60db77ac9d70561e42f37548f335042b8Damien Leone fflush(stdout); 2805c35891c60db77ac9d70561e42f37548f335042b8Damien Leone exit(1); 2806c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2807c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2808c35891c60db77ac9d70561e42f37548f335042b8Damien Leone mode_count = 1; 2809c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetDisplayModePropertiesKHR(demo->gpu, display, &mode_count, &mode_props); 2810c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err || (err == VK_INCOMPLETE)); 2811c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2812c35891c60db77ac9d70561e42f37548f335042b8Damien Leone // Get the list of planes 2813c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetPhysicalDeviceDisplayPlanePropertiesKHR(demo->gpu, &plane_count, NULL); 2814c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2815c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2816c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (plane_count == 0) { 2817c35891c60db77ac9d70561e42f37548f335042b8Damien Leone printf("Cannot find any plane!\n"); 2818c35891c60db77ac9d70561e42f37548f335042b8Damien Leone fflush(stdout); 2819c35891c60db77ac9d70561e42f37548f335042b8Damien Leone exit(1); 2820c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2821c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2822c35891c60db77ac9d70561e42f37548f335042b8Damien Leone plane_props = malloc(sizeof(VkDisplayPlanePropertiesKHR) * plane_count); 2823c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(plane_props); 2824c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2825c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetPhysicalDeviceDisplayPlanePropertiesKHR(demo->gpu, &plane_count, plane_props); 2826c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2827c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2828c35891c60db77ac9d70561e42f37548f335042b8Damien Leone // Find a plane compatible with the display 2829c35891c60db77ac9d70561e42f37548f335042b8Damien Leone for (plane_index = 0; plane_index < plane_count; plane_index++) { 2830c35891c60db77ac9d70561e42f37548f335042b8Damien Leone uint32_t supported_count; 2831c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VkDisplayKHR *supported_displays; 2832c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2833c35891c60db77ac9d70561e42f37548f335042b8Damien Leone // Disqualify planes that are bound to a different display 2834c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if ((plane_props[plane_index].currentDisplay != VK_NULL_HANDLE) && 2835c35891c60db77ac9d70561e42f37548f335042b8Damien Leone (plane_props[plane_index].currentDisplay != display)) { 2836c35891c60db77ac9d70561e42f37548f335042b8Damien Leone continue; 2837c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2838c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2839c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetDisplayPlaneSupportedDisplaysKHR(demo->gpu, plane_index, &supported_count, NULL); 2840c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2841c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2842c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (supported_count == 0) { 2843c35891c60db77ac9d70561e42f37548f335042b8Damien Leone continue; 2844c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2845c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2846c35891c60db77ac9d70561e42f37548f335042b8Damien Leone supported_displays = malloc(sizeof(VkDisplayKHR) * supported_count); 2847c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(supported_displays); 2848c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2849c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = vkGetDisplayPlaneSupportedDisplaysKHR(demo->gpu, plane_index, &supported_count, supported_displays); 2850c35891c60db77ac9d70561e42f37548f335042b8Damien Leone assert(!err); 2851c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2852c35891c60db77ac9d70561e42f37548f335042b8Damien Leone for (uint32_t i = 0; i < supported_count; i++) { 2853c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (supported_displays[i] == display) { 2854c35891c60db77ac9d70561e42f37548f335042b8Damien Leone found_plane = VK_TRUE; 2855c35891c60db77ac9d70561e42f37548f335042b8Damien Leone break; 2856c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2857c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2858c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2859c35891c60db77ac9d70561e42f37548f335042b8Damien Leone free(supported_displays); 2860c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2861c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (found_plane) { 2862c35891c60db77ac9d70561e42f37548f335042b8Damien Leone break; 2863c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2864c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2865c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2866c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (!found_plane) { 2867c35891c60db77ac9d70561e42f37548f335042b8Damien Leone printf("Cannot find a plane compatible with the display!\n"); 2868c35891c60db77ac9d70561e42f37548f335042b8Damien Leone fflush(stdout); 2869c35891c60db77ac9d70561e42f37548f335042b8Damien Leone exit(1); 2870c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2871c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2872c35891c60db77ac9d70561e42f37548f335042b8Damien Leone free(plane_props); 2873c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 28746c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VkDisplayPlaneCapabilitiesKHR planeCaps; 28756c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour vkGetDisplayPlaneCapabilitiesKHR(demo->gpu, mode_props.displayMode, plane_index, &planeCaps); 28766c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour // Find a supported alpha mode 2877ab88f5e377534a321607996ffeeb6e4754cf3cebWladimir J. van der Laan VkDisplayPlaneAlphaFlagBitsKHR alphaMode = VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR; 2878ab88f5e377534a321607996ffeeb6e4754cf3cebWladimir J. van der Laan VkDisplayPlaneAlphaFlagBitsKHR alphaModes[4] = { 28796c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR, 28806c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR, 28816c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR, 28826c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR, 28836c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour }; 28846c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour for (uint32_t i = 0; i < sizeof(alphaModes); i++) { 28856c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour if (planeCaps.supportedAlpha & alphaModes[i]) { 28866c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour alphaMode = alphaModes[i]; 28876c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour break; 28886c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour } 28896c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour } 2890c35891c60db77ac9d70561e42f37548f335042b8Damien Leone image_extent.width = mode_props.parameters.visibleRegion.width; 2891c35891c60db77ac9d70561e42f37548f335042b8Damien Leone image_extent.height = mode_props.parameters.visibleRegion.height; 2892c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2893c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.sType = VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR; 2894c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.pNext = NULL; 2895c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.flags = 0; 2896c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.displayMode = mode_props.displayMode; 2897c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.planeIndex = plane_index; 2898c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.planeStackIndex = plane_props[plane_index].currentStackIndex; 2899c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; 29006c86e3c5d3ae2958dbf04abc0edc0087556fc399Tony Barbour create_info.alphaMode = alphaMode; 2901c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.globalAlpha = 1.0f; 2902c35891c60db77ac9d70561e42f37548f335042b8Damien Leone create_info.imageExtent = image_extent; 2903c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2904c35891c60db77ac9d70561e42f37548f335042b8Damien Leone return vkCreateDisplayPlaneSurfaceKHR(demo->inst, &create_info, NULL, &demo->surface); 2905c35891c60db77ac9d70561e42f37548f335042b8Damien Leone} 2906c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2907c35891c60db77ac9d70561e42f37548f335042b8Damien Leonestatic void demo_run_display(struct demo *demo) 2908c35891c60db77ac9d70561e42f37548f335042b8Damien Leone{ 2909c35891c60db77ac9d70561e42f37548f335042b8Damien Leone while (!demo->quit) { 2910c35891c60db77ac9d70561e42f37548f335042b8Damien Leone demo_draw(demo); 2911c35891c60db77ac9d70561e42f37548f335042b8Damien Leone demo->curFrame++; 2912c35891c60db77ac9d70561e42f37548f335042b8Damien Leone 2913c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) { 2914c35891c60db77ac9d70561e42f37548f335042b8Damien Leone demo->quit = true; 2915c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2916c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 2917c35891c60db77ac9d70561e42f37548f335042b8Damien Leone} 291871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 29194e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 29208c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter/* 29218c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter * Return 1 (true) if all layer names specified in check_names 29228c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter * can be found in given layer properties. 29238c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter */ 29241f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchterstatic VkBool32 demo_check_layers(uint32_t check_count, char **check_names, 2925481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz uint32_t layer_count, 2926481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkLayerProperties *layers) { 29278c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter for (uint32_t i = 0; i < check_count; i++) { 29281f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 found = 0; 29298c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter for (uint32_t j = 0; j < layer_count; j++) { 29308c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter if (!strcmp(check_names[i], layers[j].layerName)) { 29318c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter found = 1; 2932beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves break; 29338c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter } 29348c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter } 29358c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter if (!found) { 29368c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter fprintf(stderr, "Cannot find layer: %s\n", check_names[i]); 29378c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter return 0; 29388c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter } 29398c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter } 29408c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter return 1; 29418c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter} 29428c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter 2943481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_init_vk(struct demo *demo) { 29443536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis VkResult err; 29451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t instance_extension_count = 0; 294618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter uint32_t instance_layer_count = 0; 294797dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz uint32_t validation_layer_count = 0; 294850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz char **instance_validation_layers = NULL; 294950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->enabled_extension_count = 0; 295050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->enabled_layer_count = 0; 295118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 295250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz char *instance_validation_layers_alt1[] = { 295350f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz "VK_LAYER_LUNARG_standard_validation" 295450f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz }; 295550f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz 295650f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz char *instance_validation_layers_alt2[] = { 2957e166c8694d42d28c4964a1c9e239b4c7d3cca23eMark Lobodzinski "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", 2958e166c8694d42d28c4964a1c9e239b4c7d3cca23eMark Lobodzinski "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation", 2959928523b81d984439f4d63d9e6015ad159df58f94Mark Lobodzinski "VK_LAYER_GOOGLE_unique_objects" 29608c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter }; 29618c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter 296218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter /* Look for validation layers */ 29631f41f54bc20d57faed702aec3074eacdfc34680dCourtney Goeltzenleuchter VkBool32 validation_found = 0; 296450f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz if (demo->validate) { 296518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 296650f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz err = vkEnumerateInstanceLayerProperties(&instance_layer_count, NULL); 2967beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves assert(!err); 29688c15fc56eb9a8d1f7d395f29f092ccda3430d829Courtney Goeltzenleuchter 296950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_validation_layers = instance_validation_layers_alt1; 297050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz if (instance_layer_count > 0) { 297150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz VkLayerProperties *instance_layers = 297250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz malloc(sizeof (VkLayerProperties) * instance_layer_count); 297350f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz err = vkEnumerateInstanceLayerProperties(&instance_layer_count, 297450f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_layers); 297550f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz assert(!err); 2976beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 2977beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 297850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz validation_found = demo_check_layers( 297950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz ARRAY_SIZE(instance_validation_layers_alt1), 298050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_validation_layers, instance_layer_count, 298150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_layers); 298250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz if (validation_found) { 298350f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1); 298497dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz demo->enabled_layers[0] = "VK_LAYER_LUNARG_standard_validation"; 298597dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz validation_layer_count = 1; 298650f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz } else { 298750f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz // use alternative set of validation layers 298850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_validation_layers = instance_validation_layers_alt2; 298950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2); 299050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz validation_found = demo_check_layers( 299150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz ARRAY_SIZE(instance_validation_layers_alt2), 299250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_validation_layers, instance_layer_count, 299350f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz instance_layers); 299497dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz validation_layer_count = 299597dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz ARRAY_SIZE(instance_validation_layers_alt2); 299697dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz for (uint32_t i = 0; i < validation_layer_count; i++) { 299797dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz demo->enabled_layers[i] = instance_validation_layers[i]; 299850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz } 299950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz } 300050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz free(instance_layers); 300150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz } 300218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 300350f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz if (!validation_found) { 30042a5eaf00906107deae34a407f0e0db902e496d20Karl Schultz ERR_EXIT("vkEnumerateInstanceLayerProperties failed to find " 300550f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz "required validation layer.\n\n" 300650f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz "Please look at the Getting Started guide for additional " 300750f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz "information.\n", 300850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz "vkCreateInstance Failure"); 300950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz } 3010beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 30113536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis 3012beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves /* Look for instance extensions */ 3013f1d90139557362249b96f5331c587ad1134edb99Ian Elliott VkBool32 surfaceExtFound = 0; 3014f1d90139557362249b96f5331c587ad1134edb99Ian Elliott VkBool32 platformSurfaceExtFound = 0; 301550f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz memset(demo->extension_names, 0, sizeof(demo->extension_names)); 3016beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3017481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = vkEnumerateInstanceExtensionProperties( 3018beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves NULL, &instance_extension_count, NULL); 301918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 3020beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3021beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (instance_extension_count > 0) { 3022beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VkExtensionProperties *instance_extensions = 3023beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves malloc(sizeof(VkExtensionProperties) * instance_extension_count); 3024beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves err = vkEnumerateInstanceExtensionProperties( 3025beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves NULL, &instance_extension_count, instance_extensions); 3026beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves assert(!err); 3027beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves for (uint32_t i = 0; i < instance_extension_count; i++) { 3028beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, 3029beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves instance_extensions[i].extensionName)) { 3030beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves surfaceExtFound = 1; 303150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->extension_names[demo->enabled_extension_count++] = 3032beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VK_KHR_SURFACE_EXTENSION_NAME; 3033beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 303471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 3035beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, 3036beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves instance_extensions[i].extensionName)) { 3037beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves platformSurfaceExtFound = 1; 303850f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->extension_names[demo->enabled_extension_count++] = 3039beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VK_KHR_WIN32_SURFACE_EXTENSION_NAME; 3040beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 3041028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 3042a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, 3043a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour instance_extensions[i].extensionName)) { 3044a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour platformSurfaceExtFound = 1; 3045a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour demo->extension_names[demo->enabled_extension_count++] = 3046a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour VK_KHR_XLIB_SURFACE_EXTENSION_NAME; 3047a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 3048028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XCB_KHR) 3049beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, 3050beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves instance_extensions[i].extensionName)) { 3051beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves platformSurfaceExtFound = 1; 305250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->extension_names[demo->enabled_extension_count++] = 3053beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VK_KHR_XCB_SURFACE_EXTENSION_NAME; 3054beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 3055028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 3056a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong if (!strcmp(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, 3057a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong instance_extensions[i].extensionName)) { 3058a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong platformSurfaceExtFound = 1; 3059a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo->extension_names[demo->enabled_extension_count++] = 3060a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME; 3061a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 30620394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 3063c35891c60db77ac9d70561e42f37548f335042b8Damien Leone#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) 3064c35891c60db77ac9d70561e42f37548f335042b8Damien Leone if (!strcmp(VK_KHR_DISPLAY_EXTENSION_NAME, 3065c35891c60db77ac9d70561e42f37548f335042b8Damien Leone instance_extensions[i].extensionName)) { 3066c35891c60db77ac9d70561e42f37548f335042b8Damien Leone platformSurfaceExtFound = 1; 3067c35891c60db77ac9d70561e42f37548f335042b8Damien Leone demo->extension_names[demo->enabled_extension_count++] = 3068c35891c60db77ac9d70561e42f37548f335042b8Damien Leone VK_KHR_DISPLAY_EXTENSION_NAME; 3069c35891c60db77ac9d70561e42f37548f335042b8Damien Leone } 3070028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 307171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 307271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine instance_extensions[i].extensionName)) { 307371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine platformSurfaceExtFound = 1; 307471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo->extension_names[demo->enabled_extension_count++] = 307571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; 307671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 30773cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_IOS_MVK) 30783cc29e78287eb578472567eaaca85f89690144b4Bill Hollings if (!strcmp(VK_MVK_IOS_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { 30793cc29e78287eb578472567eaaca85f89690144b4Bill Hollings platformSurfaceExtFound = 1; 30803cc29e78287eb578472567eaaca85f89690144b4Bill Hollings demo->extension_names[demo->enabled_extension_count++] = VK_MVK_IOS_SURFACE_EXTENSION_NAME; 30813cc29e78287eb578472567eaaca85f89690144b4Bill Hollings } 30823cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_MACOS_MVK) 30833cc29e78287eb578472567eaaca85f89690144b4Bill Hollings if (!strcmp(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { 30843cc29e78287eb578472567eaaca85f89690144b4Bill Hollings platformSurfaceExtFound = 1; 30853cc29e78287eb578472567eaaca85f89690144b4Bill Hollings demo->extension_names[demo->enabled_extension_count++] = VK_MVK_MACOS_SURFACE_EXTENSION_NAME; 30863cc29e78287eb578472567eaaca85f89690144b4Bill Hollings } 308771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 3088beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (!strcmp(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, 3089beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves instance_extensions[i].extensionName)) { 3090beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (demo->validate) { 309150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz demo->extension_names[demo->enabled_extension_count++] = 3092beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VK_EXT_DEBUG_REPORT_EXTENSION_NAME; 3093beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 309418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 309550f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz assert(demo->enabled_extension_count < 64); 3096a65ecc2039ef220af0324ef46f3c3caf623f6976Tony Barbour } 3097beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3098beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves free(instance_extensions); 30993536b44d5d907e6ce3d97c40366f12a988c8036dTobin Ehlis } 3100beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3101f1d90139557362249b96f5331c587ad1134edb99Ian Elliott if (!surfaceExtFound) { 3102481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3103481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "the " VK_KHR_SURFACE_EXTENSION_NAME 3104481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz " extension.\n\nDo you have a compatible " 31053b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "Vulkan installable client driver (ICD) installed?\nPlease " 31063b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "look at the Getting Started guide for additional " 31073b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "information.\n", 31083b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "vkCreateInstance Failure"); 31093b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott } 3110f1d90139557362249b96f5331c587ad1134edb99Ian Elliott if (!platformSurfaceExtFound) { 311171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 3112481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3113481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "the " VK_KHR_WIN32_SURFACE_EXTENSION_NAME 3114481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz " extension.\n\nDo you have a compatible " 3115051ae4bd4545590437d46268ac6992358cb48c13Mark Lobodzinski "Vulkan installable client driver (ICD) installed?\nPlease " 3116051ae4bd4545590437d46268ac6992358cb48c13Mark Lobodzinski "look at the Getting Started guide for additional " 3117051ae4bd4545590437d46268ac6992358cb48c13Mark Lobodzinski "information.\n", 3118051ae4bd4545590437d46268ac6992358cb48c13Mark Lobodzinski "vkCreateInstance Failure"); 31193cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_IOS_MVK) 31207f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find the " 31217f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour VK_MVK_IOS_SURFACE_EXTENSION_NAME" extension.\n\nDo you have a compatible " 31227f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "Vulkan installable client driver (ICD) installed?\nPlease " 31237f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "look at the Getting Started guide for additional " 31247f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "information.\n", 31257f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "vkCreateInstance Failure"); 31263cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_MACOS_MVK) 31277f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find the " 31287f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour VK_MVK_MACOS_SURFACE_EXTENSION_NAME" extension.\n\nDo you have a compatible " 31297f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "Vulkan installable client driver (ICD) installed?\nPlease " 31307f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "look at the Getting Started guide for additional " 31317f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "information.\n", 31327f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour "vkCreateInstance Failure"); 313371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_XCB_KHR) 3134481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3135481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "the " VK_KHR_XCB_SURFACE_EXTENSION_NAME 3136481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz " extension.\n\nDo you have a compatible " 3137f1d90139557362249b96f5331c587ad1134edb99Ian Elliott "Vulkan installable client driver (ICD) installed?\nPlease " 3138f1d90139557362249b96f5331c587ad1134edb99Ian Elliott "look at the Getting Started guide for additional " 3139f1d90139557362249b96f5331c587ad1134edb99Ian Elliott "information.\n", 3140f1d90139557362249b96f5331c587ad1134edb99Ian Elliott "vkCreateInstance Failure"); 3141a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 3142a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3143a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "the " VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME 3144a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong " extension.\n\nDo you have a compatible " 3145a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "Vulkan installable client driver (ICD) installed?\nPlease " 3146a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "look at the Getting Started guide for additional " 3147a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "information.\n", 3148a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "vkCreateInstance Failure"); 31490394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 3150c35891c60db77ac9d70561e42f37548f335042b8Damien Leone#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) 3151c35891c60db77ac9d70561e42f37548f335042b8Damien Leone ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3152c35891c60db77ac9d70561e42f37548f335042b8Damien Leone "the " VK_KHR_DISPLAY_EXTENSION_NAME 3153c35891c60db77ac9d70561e42f37548f335042b8Damien Leone " extension.\n\nDo you have a compatible " 3154c35891c60db77ac9d70561e42f37548f335042b8Damien Leone "Vulkan installable client driver (ICD) installed?\nPlease " 3155c35891c60db77ac9d70561e42f37548f335042b8Damien Leone "look at the Getting Started guide for additional " 3156c35891c60db77ac9d70561e42f37548f335042b8Damien Leone "information.\n", 3157c35891c60db77ac9d70561e42f37548f335042b8Damien Leone "vkCreateInstance Failure"); 315871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 315971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 316071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine "the " VK_KHR_ANDROID_SURFACE_EXTENSION_NAME 316171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine " extension.\n\nDo you have a compatible " 316271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine "Vulkan installable client driver (ICD) installed?\nPlease " 316371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine "look at the Getting Started guide for additional " 316471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine "information.\n", 316571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine "vkCreateInstance Failure"); 3166028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 3167a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find " 3168a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour "the " VK_KHR_XLIB_SURFACE_EXTENSION_NAME 3169a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour " extension.\n\nDo you have a compatible " 3170a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour "Vulkan installable client driver (ICD) installed?\nPlease " 3171a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour "look at the Getting Started guide for additional " 3172a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour "information.\n", 3173a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour "vkCreateInstance Failure"); 317471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 3175028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour } 3176382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter const VkApplicationInfo app = { 31779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 31784e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .pNext = NULL, 31791f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationName = APP_SHORT_NAME, 31801f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .applicationVersion = 0, 31814e19ed0ed322e45993bac7917a1a253dbaaf88f9Ian Elliott .pEngineName = APP_SHORT_NAME, 31824e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter .engineVersion = 0, 3183d3995c987ba7e47700ceb54535880e782c6b04c1Jon Ashburn .apiVersion = VK_API_VERSION_1_0, 31844e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter }; 31855685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour VkInstanceCreateInfo inst_info = { 31869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 318729669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn .pNext = NULL, 31881f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu .pApplicationInfo = &app, 318950f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz .enabledLayerCount = demo->enabled_layer_count, 319050f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz .ppEnabledLayerNames = (const char *const *)instance_validation_layers, 319150f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz .enabledExtensionCount = demo->enabled_extension_count, 319250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz .ppEnabledExtensionNames = (const char *const *)demo->extension_names, 319329669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn }; 31947c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz 31957c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz /* 31967c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz * This is info for a temp callback to use during CreateInstance. 31977c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz * After the instance is created, we use the instance-based 31987c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz * function to register the final callback. 31997c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz */ 32009784e78683f658f304062235ceb2dd2c2652c357Karl Schultz VkDebugReportCallbackCreateInfoEXT dbgCreateInfoTemp; 320108613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis VkValidationFlagsEXT val_flags; 3202d9fac52a86bcf49f1a6c0c00ba57166bd2540e24Ian Elliott if (demo->validate) { 32039784e78683f658f304062235ceb2dd2c2652c357Karl Schultz dbgCreateInfoTemp.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 32049784e78683f658f304062235ceb2dd2c2652c357Karl Schultz dbgCreateInfoTemp.pNext = NULL; 32059784e78683f658f304062235ceb2dd2c2652c357Karl Schultz dbgCreateInfoTemp.pfnCallback = demo->use_break ? BreakCallback : dbgFunc; 32069784e78683f658f304062235ceb2dd2c2652c357Karl Schultz dbgCreateInfoTemp.pUserData = demo; 32079784e78683f658f304062235ceb2dd2c2652c357Karl Schultz dbgCreateInfoTemp.flags = 3208d9fac52a86bcf49f1a6c0c00ba57166bd2540e24Ian Elliott VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; 320908613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis if (demo->validate_checks_disabled) { 321008613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis val_flags.sType = VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT; 321108613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis val_flags.pNext = NULL; 321208613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis val_flags.disabledValidationCheckCount = 1; 321308613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis VkValidationCheckEXT disabled_check = VK_VALIDATION_CHECK_ALL_EXT; 321408613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis val_flags.pDisabledValidationChecks = &disabled_check; 321508613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis dbgCreateInfoTemp.pNext = (void*)&val_flags; 321608613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis } 32179784e78683f658f304062235ceb2dd2c2652c357Karl Schultz inst_info.pNext = &dbgCreateInfoTemp; 3218d9fac52a86bcf49f1a6c0c00ba57166bd2540e24Ian Elliott } 3219ff6dab510e7a43155926704eee930c9ed5b9d5efIan Elliott 3220e2d07a5a3810d83d0ea7ecb396d61477893b74a4Mark Lobodzinski uint32_t gpu_count; 32214e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 322269f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateInstance(&inst_info, NULL, &demo->inst); 3223caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { 3224caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott ERR_EXIT("Cannot find a compatible Vulkan installable client driver " 32253b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "(ICD).\n\nPlease look at the Getting Started guide for " 3226caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott "additional information.\n", 3227caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott "vkCreateInstance Failure"); 3228ac544f3737b45a5b35251100a3396aa8be397d8dCourtney Goeltzenleuchter } else if (err == VK_ERROR_EXTENSION_NOT_PRESENT) { 32295685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour ERR_EXIT("Cannot find a specified extension library" 3230beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves ".\nMake sure your layers path is set appropriately.\n", 32315685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour "vkCreateInstance Failure"); 3232caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott } else if (err) { 32333b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott ERR_EXIT("vkCreateInstance failed.\n\nDo you have a compatible Vulkan " 32343b375cf83e99df2ddb0d3508dce57c9857a15991Ian Elliott "installable client driver (ICD) installed?\nPlease look at " 3235caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott "the Getting Started guide for additional information.\n", 3236caa9f27703cec208d4d8fa0ae5939eda1bdbf35bIan Elliott "vkCreateInstance Failure"); 3237dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott } 323829669a43755f6caa97c4c1d447f494514ba343d9Jon Ashburn 32394f482a71352bd542188a787ba1d747fe7605606cTobin Ehlis /* Make initial call to query gpu_count, then second call for gpu info*/ 32404f482a71352bd542188a787ba1d747fe7605606cTobin Ehlis err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL); 32414f482a71352bd542188a787ba1d747fe7605606cTobin Ehlis assert(!err && gpu_count > 0); 3242beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3243beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (gpu_count > 0) { 3244beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VkPhysicalDevice *physical_devices = malloc(sizeof(VkPhysicalDevice) * gpu_count); 3245beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, physical_devices); 3246beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves assert(!err); 3247beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves /* For cube demo we just grab the first physical device */ 3248beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves demo->gpu = physical_devices[0]; 3249beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves free(physical_devices); 3250beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } else { 3251beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves ERR_EXIT("vkEnumeratePhysicalDevices reported zero accessible devices.\n\n" 3252beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves "Do you have a compatible Vulkan installable client driver (ICD) " 3253beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves "installed?\nPlease look at the Getting Started guide for " 3254beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves "additional information.\n", 3255beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves "vkEnumeratePhysicalDevices Failure"); 3256beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 32574e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 3258beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves /* Look for device extensions */ 3259beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves uint32_t device_extension_count = 0; 3260f1d90139557362249b96f5331c587ad1134edb99Ian Elliott VkBool32 swapchainExtFound = 0; 32613d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour demo->enabled_extension_count = 0; 326250f9bc7014544e04fb737221471e4fdbb3e57cb0Karl Schultz memset(demo->extension_names, 0, sizeof(demo->extension_names)); 3263beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3264beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL, 3265beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves &device_extension_count, NULL); 326618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter assert(!err); 3267e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 3268beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (device_extension_count > 0) { 3269beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VkExtensionProperties *device_extensions = 3270beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves malloc(sizeof(VkExtensionProperties) * device_extension_count); 3271beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves err = vkEnumerateDeviceExtensionProperties( 3272beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves demo->gpu, NULL, &device_extension_count, device_extensions); 3273beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves assert(!err); 3274beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3275beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves for (uint32_t i = 0; i < device_extension_count; i++) { 3276beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves if (!strcmp(VK_KHR_SWAPCHAIN_EXTENSION_NAME, 3277beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves device_extensions[i].extensionName)) { 3278beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves swapchainExtFound = 1; 3279beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves demo->extension_names[demo->enabled_extension_count++] = 3280beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves VK_KHR_SWAPCHAIN_EXTENSION_NAME; 3281beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves } 3282beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves assert(demo->enabled_extension_count < 64); 328318061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 3284beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 328502f7d213d30762f60b3f15207e497574080ee038Ian Elliott if (demo->VK_KHR_incremental_present_enabled) { 328602f7d213d30762f60b3f15207e497574080ee038Ian Elliott // Even though the user "enabled" the extension via the command 328702f7d213d30762f60b3f15207e497574080ee038Ian Elliott // line, we must make sure that it's enumerated for use with the 328802f7d213d30762f60b3f15207e497574080ee038Ian Elliott // device. Therefore, disable it here, and re-enable it again if 328902f7d213d30762f60b3f15207e497574080ee038Ian Elliott // enumerated. 329002f7d213d30762f60b3f15207e497574080ee038Ian Elliott demo->VK_KHR_incremental_present_enabled = false; 329102f7d213d30762f60b3f15207e497574080ee038Ian Elliott for (uint32_t i = 0; i < device_extension_count; i++) { 329202f7d213d30762f60b3f15207e497574080ee038Ian Elliott if (!strcmp(VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 329302f7d213d30762f60b3f15207e497574080ee038Ian Elliott device_extensions[i].extensionName)) { 329402f7d213d30762f60b3f15207e497574080ee038Ian Elliott demo->extension_names[demo->enabled_extension_count++] = 329502f7d213d30762f60b3f15207e497574080ee038Ian Elliott VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME; 329602f7d213d30762f60b3f15207e497574080ee038Ian Elliott demo->VK_KHR_incremental_present_enabled = true; 329702f7d213d30762f60b3f15207e497574080ee038Ian Elliott DbgMsg("VK_KHR_incremental_present extension enabled\n"); 329802f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 329902f7d213d30762f60b3f15207e497574080ee038Ian Elliott assert(demo->enabled_extension_count < 64); 330002f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 330102f7d213d30762f60b3f15207e497574080ee038Ian Elliott if (!demo->VK_KHR_incremental_present_enabled) { 330202f7d213d30762f60b3f15207e497574080ee038Ian Elliott DbgMsg("VK_KHR_incremental_present extension NOT AVAILABLE\n"); 330302f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 330402f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 330502f7d213d30762f60b3f15207e497574080ee038Ian Elliott 3306cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 3307cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // Even though the user "enabled" the extension via the command 3308cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // line, we must make sure that it's enumerated for use with the 3309cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // device. Therefore, disable it here, and re-enable it again if 3310cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott // enumerated. 3311cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->VK_GOOGLE_display_timing_enabled = false; 3312cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott for (uint32_t i = 0; i < device_extension_count; i++) { 3313cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (!strcmp(VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 3314cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott device_extensions[i].extensionName)) { 3315cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->extension_names[demo->enabled_extension_count++] = 3316cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME; 3317cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->VK_GOOGLE_display_timing_enabled = true; 33188b10c5b7fefec4c0bfc710b338f8b1aba12694dfIan Elliott DbgMsg("VK_GOOGLE_display_timing extension enabled\n"); 3319cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 3320cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott assert(demo->enabled_extension_count < 64); 3321cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 3322cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (!demo->VK_GOOGLE_display_timing_enabled) { 33238b10c5b7fefec4c0bfc710b338f8b1aba12694dfIan Elliott DbgMsg("VK_GOOGLE_display_timing extension NOT AVAILABLE\n"); 3324cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 3325cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 3326cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott 3327beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves free(device_extensions); 332818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 3329beebf7d6163262eceb61ac1ca145a179383717dbDustin Graves 3330d9955e4e5584aaab9dc4b5df4b4fea86bc6f5e30Tony Barbour if (!swapchainExtFound) { 3331481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT("vkEnumerateDeviceExtensionProperties failed to find " 3332481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "the " VK_KHR_SWAPCHAIN_EXTENSION_NAME 3333481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz " extension.\n\nDo you have a compatible " 333418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter "Vulkan installable client driver (ICD) installed?\nPlease " 333518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter "look at the Getting Started guide for additional " 333618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter "information.\n", 333718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter "vkCreateInstance Failure"); 333818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 333918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 33405685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour if (demo->validate) { 3341481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->CreateDebugReportCallback = 3342481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr( 3343481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->inst, "vkCreateDebugReportCallbackEXT"); 3344481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->DestroyDebugReportCallback = 3345481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr( 3346481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->inst, "vkDestroyDebugReportCallbackEXT"); 3347f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter if (!demo->CreateDebugReportCallback) { 3348481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT( 3349481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "GetProcAddr: Unable to find vkCreateDebugReportCallbackEXT\n", 3350481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "vkGetProcAddr Failure"); 33511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 3352f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter if (!demo->DestroyDebugReportCallback) { 3353481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz ERR_EXIT( 3354481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "GetProcAddr: Unable to find vkDestroyDebugReportCallbackEXT\n", 3355481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz "vkGetProcAddr Failure"); 3356a65ecc2039ef220af0324ef46f3c3caf623f6976Tony Barbour } 3357481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->DebugReportMessage = 3358481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz (PFN_vkDebugReportMessageEXT)vkGetInstanceProcAddr( 3359481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->inst, "vkDebugReportMessageEXT"); 3360ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter if (!demo->DebugReportMessage) { 3361acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter ERR_EXIT("GetProcAddr: Unable to find vkDebugReportMessageEXT\n", 3362ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter "vkGetProcAddr Failure"); 3363ea026a691de468b4187d7f821314f867f1a7fb6dCourtney Goeltzenleuchter } 336469d4893b673bd552e445ba999ad0e73463d35007Jon Ashburn 3365acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter VkDebugReportCallbackCreateInfoEXT dbgCreateInfo; 33667c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz PFN_vkDebugReportCallbackEXT callback; 33677c5f63efbdf1b13464664623d6d2f46bd2f405e1Karl Schultz callback = demo->use_break ? BreakCallback : dbgFunc; 3368acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; 3369f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter dbgCreateInfo.pNext = NULL; 3370f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter dbgCreateInfo.pfnCallback = callback; 337120a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg dbgCreateInfo.pUserData = demo; 3372481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz dbgCreateInfo.flags = 33735c13d4d87fd0356003a3441e887a172b991e880fMark Lobodzinski VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; 3374481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL, 3375481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz &demo->msg_callback); 33761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter switch (err) { 33771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter case VK_SUCCESS: 33781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 33791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter case VK_ERROR_OUT_OF_HOST_MEMORY: 3380f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter ERR_EXIT("CreateDebugReportCallback: out of host memory\n", 3381f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter "CreateDebugReportCallback Failure"); 33821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 33831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter default: 3384f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter ERR_EXIT("CreateDebugReportCallback: unknown failure\n", 3385f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter "CreateDebugReportCallback Failure"); 33861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 33871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 33885685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour } 338901d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props); 33903bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis 33913bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis /* Call with NULL data to get count */ 339237a5db39edf36de91652ded72b88d33eec9db3deTony Barbour vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, 339337a5db39edf36de91652ded72b88d33eec9db3deTony Barbour &demo->queue_family_count, NULL); 339437a5db39edf36de91652ded72b88d33eec9db3deTony Barbour assert(demo->queue_family_count >= 1); 33953bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis 3396481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->queue_props = (VkQueueFamilyProperties *)malloc( 339737a5db39edf36de91652ded72b88d33eec9db3deTony Barbour demo->queue_family_count * sizeof(VkQueueFamilyProperties)); 339837a5db39edf36de91652ded72b88d33eec9db3deTony Barbour vkGetPhysicalDeviceQueueFamilyProperties( 339937a5db39edf36de91652ded72b88d33eec9db3deTony Barbour demo->gpu, &demo->queue_family_count, demo->queue_props); 340037a5db39edf36de91652ded72b88d33eec9db3deTony Barbour 3401795460a0578a501c1e8d15ee4156a5fd1c13310cTobin Ehlis // Query fine-grained feature support for this device. 3402481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // If app has specific feature requirements it should check supported 3403481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // features based on this query 34046454cd96df644d51bd4d71bfb5067345e8d2dd47Tobin Ehlis VkPhysicalDeviceFeatures physDevFeatures; 340501d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceFeatures(demo->gpu, &physDevFeatures); 3406795460a0578a501c1e8d15ee4156a5fd1c13310cTobin Ehlis 34073d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceSupportKHR); 34083d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceCapabilitiesKHR); 34093d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceFormatsKHR); 34103d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfacePresentModesKHR); 34113d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_INSTANCE_PROC_ADDR(demo->inst, GetSwapchainImagesKHR); 34123d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour} 34133d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour 3414481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_create_device(struct demo *demo) { 34153d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour VkResult U_ASSERT_ONLY err; 3416481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz float queue_priorities[1] = {0.0}; 34171ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour VkDeviceQueueCreateInfo queues[2]; 34181ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 34191ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].pNext = NULL; 34201ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].queueFamilyIndex = demo->graphics_queue_family_index; 34211ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].queueCount = 1; 34221ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].pQueuePriorities = queue_priorities; 34231ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[0].flags = 0; 34243bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis 34253bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis VkDeviceCreateInfo device = { 34263bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 34273bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis .pNext = NULL, 3428045654f003fa47a4a15cba6709222c75b5e72e41Chia-I Wu .queueCreateInfoCount = 1, 34291ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour .pQueueCreateInfos = queues, 343097dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz .enabledLayerCount = 0, 343197dc22bdc2e5e96e79f0d8ca4326701e0ce9fcffKarl Schultz .ppEnabledLayerNames = NULL, 34323d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour .enabledExtensionCount = demo->enabled_extension_count, 3433481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .ppEnabledExtensionNames = (const char *const *)demo->extension_names, 3434481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz .pEnabledFeatures = 3435481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz NULL, // If specific features are required, pass them in here 34363bd5dc46e236b0ee2157f8f0d609801196cef545Tobin Ehlis }; 34371ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (demo->separate_present_queue) { 34381ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 34391ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].pNext = NULL; 34401ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].queueFamilyIndex = demo->present_queue_family_index; 34411ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].queueCount = 1; 34421ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].pQueuePriorities = queue_priorities; 34431ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour queues[1].flags = 0; 34441ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour device.queueCreateInfoCount = 2; 34451ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 344669f40128cce0970d10aaa30ea8c6b56a7dda3f36Chia-I Wu err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device); 34474e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter assert(!err); 344889147b4c6e540869f2a8c1a43aa54c44848cde4cCourtney Goeltzenleuchter} 344989147b4c6e540869f2a8c1a43aa54c44848cde4cCourtney Goeltzenleuchter 3450481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_init_vk_swapchain(struct demo *demo) { 3451e92af7e35e235faf650de0ffd413aa2e8417fd2dCourtney Goeltzenleuchter VkResult U_ASSERT_ONLY err; 3452f316806ced61ba68efb7be2335bd1d1138e5234dCourtney Goeltzenleuchter 3453481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz// Create a WSI surface for the window: 345471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 3455da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott VkWin32SurfaceCreateInfoKHR createInfo; 3456da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 3457da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott createInfo.pNext = NULL; 3458da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott createInfo.flags = 0; 345909338b5ff0968d9a40cd0e26e3cfb947add33354Jon Ashburn createInfo.hinstance = demo->connection; 346009338b5ff0968d9a40cd0e26e3cfb947add33354Jon Ashburn createInfo.hwnd = demo->window; 3461da44dfef7703f795e9de97fe6bda17b68864bc24Ian Elliott 3462481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = 3463481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz vkCreateWin32SurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); 3464028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 3465a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong VkWaylandSurfaceCreateInfoKHR createInfo; 3466a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; 3467a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong createInfo.pNext = NULL; 3468a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong createInfo.flags = 0; 3469a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong createInfo.display = demo->display; 3470a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong createInfo.surface = demo->window; 3471a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3472a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong err = vkCreateWaylandSurfaceKHR(demo->inst, &createInfo, NULL, 3473a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong &demo->surface); 34740394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 347571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 347671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine VkAndroidSurfaceCreateInfoKHR createInfo; 347771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; 347871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine createInfo.pNext = NULL; 347971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine createInfo.flags = 0; 348071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine createInfo.window = (ANativeWindow*)(demo->window); 3481b5fad79e4bb8089a6a9519d248c378079822d2c6Ian Elliott 348271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine err = vkCreateAndroidSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); 3483028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 3484028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour VkXlibSurfaceCreateInfoKHR createInfo; 3485028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; 3486028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.pNext = NULL; 3487028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.flags = 0; 3488028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.dpy = demo->display; 3489028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.window = demo->xlib_window; 3490028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour 3491028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour err = vkCreateXlibSurfaceKHR(demo->inst, &createInfo, NULL, 3492a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour &demo->surface); 3493028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#elif defined(VK_USE_PLATFORM_XCB_KHR) 3494028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour VkXcbSurfaceCreateInfoKHR createInfo; 3495028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; 3496028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.pNext = NULL; 3497028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.flags = 0; 3498028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.connection = demo->connection; 3499028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour createInfo.window = demo->xcb_window; 3500028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour 3501028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour err = vkCreateXcbSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); 3502c35891c60db77ac9d70561e42f37548f335042b8Damien Leone#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) 3503c35891c60db77ac9d70561e42f37548f335042b8Damien Leone err = demo_create_display_surface(demo); 35043cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_IOS_MVK) 35053cc29e78287eb578472567eaaca85f89690144b4Bill Hollings VkIOSSurfaceCreateInfoMVK surface; 35063cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK; 35073cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.pNext = NULL; 35083cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.flags = 0; 35093cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.pView = demo->window; 35103cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 35113cc29e78287eb578472567eaaca85f89690144b4Bill Hollings err = vkCreateIOSSurfaceMVK(demo->inst, &surface, NULL, &demo->surface); 35123cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_MACOS_MVK) 35133cc29e78287eb578472567eaaca85f89690144b4Bill Hollings VkMacOSSurfaceCreateInfoMVK surface; 35143cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; 35153cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.pNext = NULL; 35163cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.flags = 0; 35173cc29e78287eb578472567eaaca85f89690144b4Bill Hollings surface.pView = demo->window; 35183cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 35193cc29e78287eb578472567eaaca85f89690144b4Bill Hollings err = vkCreateMacOSSurfaceMVK(demo->inst, &surface, NULL, &demo->surface); 352071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 3521a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour assert(!err); 3522e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 3523d9955e4e5584aaab9dc4b5df4b4fea86bc6f5e30Tony Barbour // Iterate over each queue to learn whether it supports presenting: 3524481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz VkBool32 *supportsPresent = 352537a5db39edf36de91652ded72b88d33eec9db3deTony Barbour (VkBool32 *)malloc(demo->queue_family_count * sizeof(VkBool32)); 35269784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < demo->queue_family_count; i++) { 3527481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->fpGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface, 3528e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott &supportsPresent[i]); 3529f316806ced61ba68efb7be2335bd1d1138e5234dCourtney Goeltzenleuchter } 3530e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 3531e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // Search for a graphics and a present queue in the array of queue 3532e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // families, try to find one that supports both 353337a5db39edf36de91652ded72b88d33eec9db3deTony Barbour uint32_t graphicsQueueFamilyIndex = UINT32_MAX; 353437a5db39edf36de91652ded72b88d33eec9db3deTony Barbour uint32_t presentQueueFamilyIndex = UINT32_MAX; 35359784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < demo->queue_family_count; i++) { 353637a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) { 353737a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if (graphicsQueueFamilyIndex == UINT32_MAX) { 353837a5db39edf36de91652ded72b88d33eec9db3deTony Barbour graphicsQueueFamilyIndex = i; 353937a5db39edf36de91652ded72b88d33eec9db3deTony Barbour } 354037a5db39edf36de91652ded72b88d33eec9db3deTony Barbour 354137a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if (supportsPresent[i] == VK_TRUE) { 354237a5db39edf36de91652ded72b88d33eec9db3deTony Barbour graphicsQueueFamilyIndex = i; 354337a5db39edf36de91652ded72b88d33eec9db3deTony Barbour presentQueueFamilyIndex = i; 354437a5db39edf36de91652ded72b88d33eec9db3deTony Barbour break; 354537a5db39edf36de91652ded72b88d33eec9db3deTony Barbour } 3546e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 354737a5db39edf36de91652ded72b88d33eec9db3deTony Barbour } 3548755151776f6b9a0ab34095b980819e4318a86529Tony Barbour 354937a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if (presentQueueFamilyIndex == UINT32_MAX) { 355037a5db39edf36de91652ded72b88d33eec9db3deTony Barbour // If didn't find a queue that supports both graphics and present, then 355137a5db39edf36de91652ded72b88d33eec9db3deTony Barbour // find a separate present queue. 35529784e78683f658f304062235ceb2dd2c2652c357Karl Schultz for (uint32_t i = 0; i < demo->queue_family_count; ++i) { 355337a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if (supportsPresent[i] == VK_TRUE) { 355437a5db39edf36de91652ded72b88d33eec9db3deTony Barbour presentQueueFamilyIndex = i; 355537a5db39edf36de91652ded72b88d33eec9db3deTony Barbour break; 355637a5db39edf36de91652ded72b88d33eec9db3deTony Barbour } 3557e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 3558e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 3559e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 3560e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // Generate error if could not find both a graphics and a present queue 356137a5db39edf36de91652ded72b88d33eec9db3deTony Barbour if (graphicsQueueFamilyIndex == UINT32_MAX || 356237a5db39edf36de91652ded72b88d33eec9db3deTony Barbour presentQueueFamilyIndex == UINT32_MAX) { 3563755151776f6b9a0ab34095b980819e4318a86529Tony Barbour ERR_EXIT("Could not find both graphics and present queues\n", 3564d9955e4e5584aaab9dc4b5df4b4fea86bc6f5e30Tony Barbour "Swapchain Initialization Failure"); 3565e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 3566e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott 356737a5db39edf36de91652ded72b88d33eec9db3deTony Barbour demo->graphics_queue_family_index = graphicsQueueFamilyIndex; 356837a5db39edf36de91652ded72b88d33eec9db3deTony Barbour demo->present_queue_family_index = presentQueueFamilyIndex; 35691ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour demo->separate_present_queue = 35701ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour (demo->graphics_queue_family_index != demo->present_queue_family_index); 357137a5db39edf36de91652ded72b88d33eec9db3deTony Barbour free(supportsPresent); 3572f316806ced61ba68efb7be2335bd1d1138e5234dCourtney Goeltzenleuchter 35733d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour demo_create_device(demo); 35743d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour 35753d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_DEVICE_PROC_ADDR(demo->device, CreateSwapchainKHR); 35763d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_DEVICE_PROC_ADDR(demo->device, DestroySwapchainKHR); 35773d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_DEVICE_PROC_ADDR(demo->device, GetSwapchainImagesKHR); 35783d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_DEVICE_PROC_ADDR(demo->device, AcquireNextImageKHR); 35793d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour GET_DEVICE_PROC_ADDR(demo->device, QueuePresentKHR); 3580cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (demo->VK_GOOGLE_display_timing_enabled) { 3581cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott GET_DEVICE_PROC_ADDR(demo->device, GetRefreshCycleDurationGOOGLE); 3582cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott GET_DEVICE_PROC_ADDR(demo->device, GetPastPresentationTimingGOOGLE); 3583cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 35843d03a4a1c4f3b90cb2923f1f0a1aacdf91d9692eTony Barbour 3585755151776f6b9a0ab34095b980819e4318a86529Tony Barbour vkGetDeviceQueue(demo->device, demo->graphics_queue_family_index, 0, 3586755151776f6b9a0ab34095b980819e4318a86529Tony Barbour &demo->graphics_queue); 3587755151776f6b9a0ab34095b980819e4318a86529Tony Barbour 35881ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour if (!demo->separate_present_queue) { 3589755151776f6b9a0ab34095b980819e4318a86529Tony Barbour demo->present_queue = demo->graphics_queue; 3590755151776f6b9a0ab34095b980819e4318a86529Tony Barbour } else { 3591755151776f6b9a0ab34095b980819e4318a86529Tony Barbour vkGetDeviceQueue(demo->device, demo->present_queue_family_index, 0, 3592755151776f6b9a0ab34095b980819e4318a86529Tony Barbour &demo->present_queue); 3593755151776f6b9a0ab34095b980819e4318a86529Tony Barbour } 35945685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour 3595e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // Get the list of VkFormat's that are supported: 35967fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott uint32_t formatCount; 3597481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface, 35988d2a2eb5eff6a7c53a9239017d8327020467fbb6Ian Elliott &formatCount, NULL); 3599e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 3600338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott VkSurfaceFormatKHR *surfFormats = 3601338dedb8c82676fded0ab72e32d029292875ce71Ian Elliott (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR)); 3602481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface, 36038d2a2eb5eff6a7c53a9239017d8327020467fbb6Ian Elliott &formatCount, surfFormats); 3604e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(!err); 3605e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // If the format list includes just one entry of VK_FORMAT_UNDEFINED, 3606e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // the surface has no preferred format. Otherwise, at least one 3607e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott // supported format will be returned. 3608481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (formatCount == 1 && surfFormats[0].format == VK_FORMAT_UNDEFINED) { 3609e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott demo->format = VK_FORMAT_B8G8R8A8_UNORM; 3610481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else { 3611e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott assert(formatCount >= 1); 3612e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott demo->format = surfFormats[0].format; 3613e36b208f32a0959cd7590b1717aac3ef19631b1aIan Elliott } 36147fe115db80cf5ffdfa5d08ac90b1aadedd59ca26Ian Elliott demo->color_space = surfFormats[0].colorSpace; 361532536f966d1b2d9034a467b36e398545ef54e9d1Ian Elliott 3616eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->quit = false; 3617eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo demo->curFrame = 0; 3618723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski 3619a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour // Create semaphores to synchronize acquiring presentable buffers before 3620a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour // rendering and waiting for drawing to be complete before presenting 3621a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour VkSemaphoreCreateInfo semaphoreCreateInfo = { 3622a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, 3623a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .pNext = NULL, 3624a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour .flags = 0, 3625a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour }; 3626a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour 36276b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour // Create fences that we can use to throttle if we get too far 36286b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour // ahead of the image presents 36296b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour VkFenceCreateInfo fence_ci = { 36306b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 36316b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour .pNext = NULL, 3632ed0cd2f95c18b3d3f267c45b149ba435b7d3a0eeszdarkhack .flags = VK_FENCE_CREATE_SIGNALED_BIT 36336b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour }; 36346b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour for (uint32_t i = 0; i < FRAME_LAG; i++) { 3635c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour err = vkCreateFence(demo->device, &fence_ci, NULL, &demo->fences[i]); 3636c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour assert(!err); 3637c44ffcd5b0bd5b895ddd90ad97f22b81dffadcaeTony Barbour 36386b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, 36396b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour &demo->image_acquired_semaphores[i]); 36406b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour assert(!err); 3641a2a90bea4b1cf8d45e5f9ca4caeb759ccc02fdfeTony Barbour 36421ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, 36436b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour &demo->draw_complete_semaphores[i]); 36441ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour assert(!err); 36456b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour 36466b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour if (demo->separate_present_queue) { 36476b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo, NULL, 36486b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour &demo->image_ownership_semaphores[i]); 36496b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour assert(!err); 36506b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour } 36511ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour } 36526b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour demo->frame_index = 0; 36531ba48968162b1c49e5708d5ef4ef01a4786baa09Tony Barbour 3654723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski // Get Memory information and properties 365501d2ae18f05184e04eb29a2ab30480f8d4660d25Courtney Goeltzenleuchter vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties); 36564e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 36574e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 3658028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#if defined(VK_USE_PLATFORM_WAYLAND_KHR) 3659ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void pointer_handle_enter(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t sx, 3660ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_fixed_t sy) {} 3661ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3662ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void pointer_handle_leave(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface) {} 3663ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3664ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void pointer_handle_motion(void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy) {} 3665ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3666ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, 3667ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek uint32_t state) { 3668ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct demo *demo = data; 3669ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED) { 3670ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_shell_surface_move(demo->shell_surface, demo->seat, serial); 3671ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } 3672ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek} 3673ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3674ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void pointer_handle_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) {} 3675ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3676ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic const struct wl_pointer_listener pointer_listener = { 3677ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek pointer_handle_enter, pointer_handle_leave, pointer_handle_motion, pointer_handle_button, pointer_handle_axis, 3678ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek}; 3679ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3680ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) {} 3681ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3682ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, 3683ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct wl_array *keys) {} 3684ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3685ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface) {} 3686ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3687ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, 3688ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek uint32_t state) { 3689ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if (state != WL_KEYBOARD_KEY_STATE_RELEASED) return; 3690ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct demo *demo = data; 3691ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek switch (key) { 3692ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek case KEY_ESC: // Escape 3693ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->quit = true; 3694ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek break; 3695ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek case KEY_LEFT: // left arrow key 3696ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->spin_angle -= demo->spin_increment; 3697ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek break; 3698ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek case KEY_RIGHT: // right arrow key 3699ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->spin_angle += demo->spin_increment; 3700ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek break; 3701ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek case KEY_SPACE: // space bar 3702ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->pause = !demo->pause; 3703ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek break; 3704ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } 3705ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek} 3706ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3707ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, 3708ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek uint32_t mods_latched, uint32_t mods_locked, uint32_t group) {} 3709ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3710ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic const struct wl_keyboard_listener keyboard_listener = { 3711ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek keyboard_handle_keymap, keyboard_handle_enter, keyboard_handle_leave, keyboard_handle_key, keyboard_handle_modifiers, 3712ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek}; 3713ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3714ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void seat_handle_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps) { 3715ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek // Subscribe to pointer events 3716ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek struct demo *demo = data; 3717ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if ((caps & WL_SEAT_CAPABILITY_POINTER) && !demo->pointer) { 3718ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->pointer = wl_seat_get_pointer(seat); 3719ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_pointer_add_listener(demo->pointer, &pointer_listener, demo); 3720ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && demo->pointer) { 3721ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_pointer_destroy(demo->pointer); 3722ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->pointer = NULL; 3723ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } 3724ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek // Subscribe to keyboard events 3725ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek if (caps & WL_SEAT_CAPABILITY_KEYBOARD) { 3726ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->keyboard = wl_seat_get_keyboard(seat); 3727ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_keyboard_add_listener(demo->keyboard, &keyboard_listener, demo); 3728ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD)) { 3729ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_keyboard_destroy(demo->keyboard); 3730ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->keyboard = NULL; 3731ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } 3732ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek} 3733ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3734ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic const struct wl_seat_listener seat_listener = { 3735ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek seat_handle_capabilities, 3736ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek}; 3737ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek 3738ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdekstatic void registry_handle_global(void *data, struct wl_registry *registry, uint32_t id, const char *interface, 3739a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong uint32_t version UNUSED) { 3740a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct demo *demo = data; 3741ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek // pickup wayland objects when they appear 3742a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong if (strcmp(interface, "wl_compositor") == 0) { 3743ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->compositor = wl_registry_bind(registry, id, &wl_compositor_interface, 1); 3744a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } else if (strcmp(interface, "wl_shell") == 0) { 3745ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->shell = wl_registry_bind(registry, id, &wl_shell_interface, 1); 3746ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek } else if (strcmp(interface, "wl_seat") == 0) { 3747ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek demo->seat = wl_registry_bind(registry, id, &wl_seat_interface, 1); 3748ea4fd3901c0350d7d4f5bcaa90543c9c6892fc84Joey Bzdek wl_seat_add_listener(demo->seat, &seat_listener, demo); 3749a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 3750a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong} 3751a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3752a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic void registry_handle_global_remove(void *data UNUSED, 3753a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong struct wl_registry *registry UNUSED, 3754a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong uint32_t name UNUSED) {} 3755a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3756a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeongstatic const struct wl_registry_listener registry_listener = { 3757a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong registry_handle_global, registry_handle_global_remove}; 37580394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 3759a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#endif 3760a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3761481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_init_connection(struct demo *demo) { 376271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_XCB_KHR) 37634e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter const xcb_setup_t *setup; 37644e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_screen_iterator_t iter; 37654e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter int scr; 37664e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 37674e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo->connection = xcb_connect(NULL, &scr); 37680c9d488562f4b6c16806bbd182c6e7181c18da3eLenny Komow if (xcb_connection_has_error(demo->connection) > 0) { 3769dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott printf("Cannot find a compatible Vulkan installable client driver " 3770dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott "(ICD).\nExiting ...\n"); 3771dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott fflush(stdout); 3772dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott exit(1); 3773dfe55f7cf6e23d7bf2ff0076a7347cbc99d4a6f9Ian Elliott } 37744e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 37754e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter setup = xcb_get_setup(demo->connection); 37764e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter iter = xcb_setup_roots_iterator(setup); 37774e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter while (scr-- > 0) 37784e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter xcb_screen_next(&iter); 37794e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 37804e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo->screen = iter.data; 3781a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 3782a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo->display = wl_display_connect(NULL); 3783a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3784a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong if (demo->display == NULL) { 3785a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong printf("Cannot find a compatible Vulkan installable client driver " 3786a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong "(ICD).\nExiting ...\n"); 3787a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong fflush(stdout); 3788a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong exit(1); 3789a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong } 3790a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong 3791a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo->registry = wl_display_get_registry(demo->display); 3792a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_registry_add_listener(demo->registry, ®istry_listener, demo); 3793a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong wl_display_dispatch(demo->display); 37940394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 379571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 37964e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 37974e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 3798481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzstatic void demo_init(struct demo *demo, int argc, char **argv) { 37993eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter vec3 eye = {0.0f, 3.0f, 5.0f}; 38003eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter vec3 origin = {0, 0, 0}; 3801c3487c272a160e78f7f4e62f4869ab96b623d276Chia-I Wu vec3 up = {0.0f, 1.0f, 0.0}; 38023eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 38034e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter memset(demo, 0, sizeof(*demo)); 3804d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour demo->presentMode = VK_PRESENT_MODE_FIFO_KHR; 3805a26fb7dfff6ccb2964ec7c63a49c4fc69a5d48dbTony Barbour demo->frameCount = INT32_MAX; 38064e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 3807886be472ea5f6fc366d2e20156396e17d0947816Piers Daniell for (int i = 1; i < argc; i++) { 38085685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour if (strcmp(argv[i], "--use_staging") == 0) { 380940a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter demo->use_staging_buffer = true; 38105685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour continue; 3811e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 3812d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour if ((strcmp(argv[i], "--present_mode") == 0) && 3813d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour (i < argc - 1)) { 3814d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour demo->presentMode = atoi(argv[i+1]); 3815d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour i++; 3816d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour continue; 3817d7153adbc5528dc050351f3f823cb162a30efed9Tony Barbour } 38183230e58da9373ad93b2cf1ac9d66e7aa5c4e72f3Courtney Goeltzenleuchter if (strcmp(argv[i], "--break") == 0) { 38193230e58da9373ad93b2cf1ac9d66e7aa5c4e72f3Courtney Goeltzenleuchter demo->use_break = true; 38203230e58da9373ad93b2cf1ac9d66e7aa5c4e72f3Courtney Goeltzenleuchter continue; 38213230e58da9373ad93b2cf1ac9d66e7aa5c4e72f3Courtney Goeltzenleuchter } 38225685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour if (strcmp(argv[i], "--validate") == 0) { 38235685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour demo->validate = true; 38245685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour continue; 38255685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour } 382608613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis if (strcmp(argv[i], "--validate-checks-disabled") == 0) { 382708613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis demo->validate = true; 382808613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis demo->validate_checks_disabled = true; 382908613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis continue; 383008613200034f5a9e98438c30dc10f466d3a0c447Tobin Ehlis } 3831a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour if (strcmp(argv[i], "--xlib") == 0) { 3832028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour fprintf(stderr, "--xlib is deprecated and no longer does anything"); 3833a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour continue; 3834a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour } 3835481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (strcmp(argv[i], "--c") == 0 && demo->frameCount == INT32_MAX && 3836481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz i < argc - 1 && sscanf(argv[i + 1], "%d", &demo->frameCount) == 1 && 3837481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz demo->frameCount >= 0) { 3838eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo i++; 3839eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo continue; 3840eeca2a260355a0680275ddb3dc2d1c7c2d61bf14David Pinedo } 384120a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg if (strcmp(argv[i], "--suppress_popups") == 0) { 384220a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg demo->suppress_popups = true; 384320a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg continue; 384420a497b97273bbbc0f853f12c0cf6db57a2aef9dlenny-lunarg } 3845cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott if (strcmp(argv[i], "--display_timing") == 0) { 3846cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott demo->VK_GOOGLE_display_timing_enabled = true; 3847cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott continue; 3848cf379cbc2ac59ca03581697ce7c89f9f8edbbd88Ian Elliott } 384902f7d213d30762f60b3f15207e497574080ee038Ian Elliott if (strcmp(argv[i], "--incremental_present") == 0) { 385002f7d213d30762f60b3f15207e497574080ee038Ian Elliott demo->VK_KHR_incremental_present_enabled = true; 385102f7d213d30762f60b3f15207e497574080ee038Ian Elliott continue; 385202f7d213d30762f60b3f15207e497574080ee038Ian Elliott } 38535685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour 385481fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop#if defined(ANDROID) 385581fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop ERR_EXIT("Usage: cube [--validate]\n", "Usage"); 385681fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop#else 3857f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt fprintf(stderr, 3858f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt "Usage:\n %s [--use_staging] [--validate] [--validate-checks-disabled]\n" 3859f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " [--break] [--c <framecount>] [--suppress_popups]\n" 3860f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " [--incremental_present] [--display_timing]\n" 3861f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " [--present_mode {0,1,2,3}]\n" 3862f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt "\n" 3863f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt "Options for --present_mode:\n" 3864f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " %d: VK_PRESENT_MODE_IMMEDIATE_KHR\n" 3865f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " %d: VK_PRESENT_MODE_MAILBOX_KHR\n" 3866f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " %d: VK_PRESENT_MODE_FIFO_KHR (default)\n" 3867f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt " %d: VK_PRESENT_MODE_FIFO_RELAXED_KHR\n", 3868f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt APP_SHORT_NAME, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_FIFO_KHR, 3869f9267841ea8009e3c78db8c14ad0df033cc78b6cMike Schuchardt VK_PRESENT_MODE_FIFO_RELAXED_KHR); 3870e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott fflush(stderr); 3871e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott exit(1); 387281fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop#endif 387340a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter } 387440a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter 3875028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour demo_init_connection(demo); 3876a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 38779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter demo_init_vk(demo); 38784e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 38793eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter demo->width = 500; 38803eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter demo->height = 500; 38813eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 38826b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour demo->spin_angle = 4.0f; 38836b7e78663bec13ba8e66568a47a111f6adf592cdTony Barbour demo->spin_increment = 0.2f; 38843eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter demo->pause = false; 38853eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter 3886481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz mat4x4_perspective(demo->projection_matrix, (float)degreesToRadians(45.0f), 3887481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 1.0f, 0.1f, 100.0f); 38883eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter mat4x4_look_at(demo->view_matrix, eye, origin, up); 38893eeff43ff1f39a6c765904f0730949e94a2660f4Courtney Goeltzenleuchter mat4x4_identity(demo->model_matrix); 3890d0b68068c4002b26e53e22aabce93c6948d0b507Rene Lindsay 3891d0b68068c4002b26e53e22aabce93c6948d0b507Rene Lindsay demo->projection_matrix[1][1]*=-1; //Flip projection matrix from GL to Vulkan orientation. 38924e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 38934e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 389471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#if defined(VK_USE_PLATFORM_WIN32_KHR) 3895cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark// Include header required for parsing the command line options. 3896cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark#include <shellapi.h> 38977595eeeb9f9d0b0568df04e19c442ed22f7d7b5fIan Elliott 3898481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, 3899481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz int nCmdShow) { 3900481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz MSG msg; // message 3901481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz bool done; // flag saying when app is complete 39025685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour int argc; 3903481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz char **argv; 3904481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz 390572d7ec308c6367526ba1415fb977c92e372726afJamie Madill // Ensure wParam is initialized. 390672d7ec308c6367526ba1415fb977c92e372726afJamie Madill msg.wParam = 0; 390772d7ec308c6367526ba1415fb977c92e372726afJamie Madill 3908481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Use the CommandLine functions to get the command line arguments. 3909481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Unfortunately, Microsoft outputs 3910481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // this information as wide characters for Unicode, and we simply want the 3911481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Ascii version to be compatible 3912481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // with the non-Windows side. So, we have to convert the information to 3913481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz // Ascii character strings. 3914481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz LPWSTR *commandLineArgs = CommandLineToArgvW(GetCommandLineW(), &argc); 3915481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (NULL == commandLineArgs) { 3916cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark argc = 0; 3917cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3918cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark 3919481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (argc > 0) { 3920481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz argv = (char **)malloc(sizeof(char *) * argc); 3921481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (argv == NULL) { 3922cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark argc = 0; 3923481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else { 3924481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (int iii = 0; iii < argc; iii++) { 3925481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz size_t wideCharLen = wcslen(commandLineArgs[iii]); 3926cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark size_t numConverted = 0; 3927cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark 3928481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz argv[iii] = (char *)malloc(sizeof(char) * (wideCharLen + 1)); 3929481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (argv[iii] != NULL) { 3930481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz wcstombs_s(&numConverted, argv[iii], wideCharLen + 1, 3931481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz commandLineArgs[iii], wideCharLen + 1); 3932cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3933cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3934cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3935481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else { 3936cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark argv = NULL; 3937cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 39385685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour 39395685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour demo_init(&demo, argc, argv); 3940cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark 3941cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark // Free up the items we had to allocate for the command line arguments. 3942481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (argc > 0 && argv != NULL) { 3943481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz for (int iii = 0; iii < argc; iii++) { 3944481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (argv[iii] != NULL) { 3945cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark free(argv[iii]); 3946cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3947cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3948cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark free(argv); 3949cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark } 3950cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark 39515685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour demo.connection = hInstance; 39525685ad7549b281c6c4a297a58dfb303db89af1a1Tony Barbour strncpy(demo.name, "cube", APP_NAME_STR_LEN); 3953e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo_create_window(&demo); 3954d9955e4e5584aaab9dc4b5df4b4fea86bc6f5e30Tony Barbour demo_init_vk_swapchain(&demo); 3955e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 3956e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo_prepare(&demo); 3957e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 3958481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz done = false; // initialize loop condition variable 3959cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark 3960cbd7c6be558f81a398521400e7c4991e2f2da129Mark Young <Mark // main message loop 3961481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz while (!done) { 3962421107f97492e625626a91e6b153e38d889bbbb9Ian Elliott PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); 3963481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz if (msg.message == WM_QUIT) // check for a quit message 3964e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott { 3965481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz done = true; // if found, quit app 3966481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz } else { 3967e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott /* Translate and dispatch to event queue*/ 3968481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz TranslateMessage(&msg); 3969e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott DispatchMessage(&msg); 3970e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 397118b53e792aad08d1d95210c372e1326bb952ef9aTony Barbour RedrawWindow(demo.window, NULL, NULL, RDW_INTERNALPAINT); 3972e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott } 3973e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 3974e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott demo_cleanup(&demo); 3975e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott 3976481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultz return (int)msg.wParam; 3977e14e9f9a4b3b2409b8475e7f7568e17f78f878f4Ian Elliott} 39783cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 39793cc29e78287eb578472567eaaca85f89690144b4Bill Hollings#elif defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) 39803cc29e78287eb578472567eaaca85f89690144b4Bill Hollingsstatic void demo_main(struct demo *demo, void* view) { 39817f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour const char* argv[] = { "CubeSample" }; 39827f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour int argc = sizeof(argv) / sizeof(char*); 39837f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour 39847f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo_init(demo, argc, (char**)argv); 39857f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo->window = view; 39867f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo_init_vk_swapchain(demo); 39877f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo_prepare(demo); 39887f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo->spin_angle = 0.4f; 39893cc29e78287eb578472567eaaca85f89690144b4Bill Hollings} 39903cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 39913cc29e78287eb578472567eaaca85f89690144b4Bill Hollingsstatic void demo_update_and_draw(struct demo *demo) { 39927f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour // Wait for work to finish before updating MVP. 39937f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour vkDeviceWaitIdle(demo->device); 39947f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo_update_data_buffer(demo); 39953cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 39967f8a254eba49a07e5c6ee50f2bc7e2802f6054fdTony Barbour demo_draw(demo); 39973cc29e78287eb578472567eaaca85f89690144b4Bill Hollings} 39983cc29e78287eb578472567eaaca85f89690144b4Bill Hollings 399971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#elif defined(VK_USE_PLATFORM_ANDROID_KHR) 400071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#include <android/log.h> 400171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#include <android_native_app_glue.h> 400248a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop#include "android_util.h" 400348a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 400471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestatic bool initialized = false; 400571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestatic bool active = false; 400671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestruct demo demo; 400771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 400871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestatic int32_t processInput(struct android_app* app, AInputEvent* event) { 400971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return 0; 401071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine} 401171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 401271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinestatic void processCommand(struct android_app* app, int32_t cmd) { 401371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine switch(cmd) { 401471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine case APP_CMD_INIT_WINDOW: { 401571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (app->window) { 4016815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // We're getting a new window. If the app is starting up, we 4017815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // need to initialize. If the app has already been 4018815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // initialized, that means that we lost our previous window, 4019815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // which means that we have a lot of work to do. At a minimum, 4020815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // we need to destroy the swapchain and surface associated with 4021815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // the old window, and create a new surface and swapchain. 4022815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // However, since there are a lot of other objects/state that 4023815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // is tied to the swapchain, it's easiest to simply cleanup and 4024815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // start over (i.e. use a brute-force approach of re-starting 4025815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott // the app) 4026815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott if (demo.prepared) { 4027815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott demo_cleanup(&demo); 4028815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott } 402948a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 403048a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop // Parse Intents into argc, argv 403148a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop // Use the following key to send arguments, i.e. 403248a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop // --es args "--validate" 403348a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop const char key[] = "args"; 403481fddbbf55ec04a4355c99434784d8f6764d0787Cody Northrop char* appTag = (char*) APP_SHORT_NAME; 403548a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop int argc = 0; 403648a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop char** argv = get_args(app, key, appTag, &argc); 403748a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 403848a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop __android_log_print(ANDROID_LOG_INFO, appTag, "argc = %i", argc); 403948a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop for (int i = 0; i < argc; i++) 404048a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop __android_log_print(ANDROID_LOG_INFO, appTag, "argv[%i] = %s", i, argv[i]); 404148a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 404248a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop demo_init(&demo, argc, argv); 404348a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 404448a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop // Free the argv malloc'd by get_args 404548a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop for (int i = 0; i < argc; i++) 404648a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop free(argv[i]); 404748a557e62b3516f4c02d6ca9af31139a98dfa649Cody Northrop 404871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo.window = (void*)app->window; 404971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo_init_vk_swapchain(&demo); 405071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo_prepare(&demo); 405171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine initialized = true; 405271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 405371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine break; 405471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 405571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine case APP_CMD_GAINED_FOCUS: { 405671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine active = true; 405771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine break; 405871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 405971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine case APP_CMD_LOST_FOCUS: { 406071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine active = false; 406171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine break; 406271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 406371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 406471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine} 406571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 406671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentinevoid android_main(struct android_app *app) 406771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine{ 4068e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#ifdef ANDROID 4069e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop int vulkanSupport = InitVulkan(); 4070e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop if (vulkanSupport == 0) 4071e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop return; 4072e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop#endif 4073e4c5dafc896460806200e46bb8d1e9ee899796c2Cody Northrop 4074815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott demo.prepared = false; 4075815e2a9d4a27f5d831d8e97659fe7094f2e5fc1cIan Elliott 407671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine app->onAppCmd = processCommand; 407771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine app->onInputEvent = processInput; 407871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 407971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine while(1) { 408071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine int events; 408171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine struct android_poll_source* source; 408271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void**)&source) >= 0) { 408371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (source) { 408471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine source->process(app, source); 408571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 408671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 408771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (app->destroyRequested != 0) { 408871ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo_cleanup(&demo); 408971ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine return; 409071ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 409171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 409271ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine if (initialized && active) { 409371ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine demo_run(&demo); 409471ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 409571ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine } 409671ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine 409771ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine} 40984bd81e481fdac06ba3af343dd29bae841d6fff82Tobin Ehlis#else 4099481756e168555e1bf150d3b8f1b81edca1d98c43Karl Schultzint main(int argc, char **argv) { 41004e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter struct demo demo; 41014e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 410240a8b0a8c11264de45f48ffc150e83dc5a88b14fCourtney Goeltzenleuchter demo_init(&demo, argc, argv); 4103028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) 41044b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour demo_create_xcb_window(&demo); 41054b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 41064b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour demo_create_xlib_window(&demo); 4107a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 4108a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo_create_window(&demo); 41090394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 4110a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#endif 4111a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 4112d9955e4e5584aaab9dc4b5df4b4fea86bc6f5e30Tony Barbour demo_init_vk_swapchain(&demo); 41134e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 41144e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_prepare(&demo); 4115a24c4b45fb177077f8f54cd3ea5866e248f68e4fTony Barbour 4116028bc78811ff9e3cabe349946ffe4e760fe4ba08Tony Barbour#if defined(VK_USE_PLATFORM_XCB_KHR) 41174b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour demo_run_xcb(&demo); 41184b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour#elif defined(VK_USE_PLATFORM_XLIB_KHR) 41194b6ebbc03cd137b6e7edc667755c4d9c68dcfef8Tony Barbour demo_run_xlib(&demo); 4120a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) 4121a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong demo_run(&demo); 41220394191ea288611bb919194d46fde101947df54aTony Barbour#elif defined(VK_USE_PLATFORM_MIR_KHR) 4123c35891c60db77ac9d70561e42f37548f335042b8Damien Leone#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) 4124c35891c60db77ac9d70561e42f37548f335042b8Damien Leone demo_run_display(&demo); 4125a7aac33cb2cf14e75f6c9c7f6651f0085174f817Mun Gwan-gyeong#endif 41264e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 41274e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter demo_cleanup(&demo); 41284e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter 412951940e40346835ebbf3a3fb8c06c07a3eb518e7bKarl Schultz return validation_error; 41304e8246e9deffb6fec4c3c6b87780e2a9939fba9dCourtney Goeltzenleuchter} 413171ed0bbee1985e6fe3c47e043bc1f66cc59b437bMichael Lentine#endif 4132