48#if !defined(VK_USE_PLATFORM_ANDROID_KHR)
64#if defined(VK_USE_PLATFORM_ANDROID_KHR)
66 bool libLoaded = vks::android::loadVulkanLibrary();
79#if defined(VK_USE_PLATFORM_ANDROID_KHR)
94 uint32_t gpuCount = 0;
99 std::vector<VkPhysicalDevice> physicalDevices(gpuCount);
100 err = vkEnumeratePhysicalDevices(
vkInstance, &gpuCount, physicalDevices.data());
110 uint32_t selectedDevice = 0;
127 if (res != VK_SUCCESS) {
134 if (res != VK_SUCCESS) {
144 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
145 VkDebugUtilsMessageTypeFlagsEXT messageType,
146 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
150 const char* prefix =
"\033[0;31mUNKNOWN\033[0m";
152 if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) {
153 prefix =
"\033[0;34mVERBOSE\033[0m";
155 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) {
156 prefix =
"\033[0;32mINFO \033[0m";
158 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
159 prefix =
"\033[0;33mWARNING\033[0m";
161 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
162 prefix =
"\033[0;31mERROR \033[0m";
165#if defined(__ANDROID__)
166 if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
167 LOGE(
"%s[%d][%s] : %s\n", prefix.c_str(), pCallbackData->messageIdNumber, pCallbackData->pMessageIdName, pCallbackData->pMessage);
170 LOGD(
"%s[%d][%s] : %s\n", prefix.c_str(), pCallbackData->messageIdNumber, pCallbackData->pMessageIdName, pCallbackData->pMessage);
173 printf(
"[%s][%d][%s] : %s\n", prefix, pCallbackData->messageIdNumber, pCallbackData->pMessageIdName, pCallbackData->pMessage);
186#if defined(_VALIDATION)
190 VkApplicationInfo appInfo = {};
191 appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
192 appInfo.pApplicationName =
name.c_str();
193 appInfo.pEngineName =
name.c_str();
196 std::vector<const char*> instanceExtensions = { VK_KHR_SURFACE_EXTENSION_NAME };
200 instanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
201#elif defined(VK_USE_PLATFORM_ANDROID_KHR)
202 instanceExtensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
203#elif defined(_DIRECT2DISPLAY)
204 instanceExtensions.push_back(VK_KHR_DISPLAY_EXTENSION_NAME);
205#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
206 instanceExtensions.push_back(VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME);
207#elif defined(VK_USE_PLATFORM_WAYLAND_KHR)
208 instanceExtensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
209#elif defined(VK_USE_PLATFORM_XCB_KHR)
210 instanceExtensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
211#elif defined(VK_USE_PLATFORM_IOS_MVK)
212 instanceExtensions.push_back(VK_MVK_IOS_SURFACE_EXTENSION_NAME);
213#elif defined(VK_USE_PLATFORM_MACOS_MVK)
214 instanceExtensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
218 uint32_t extCount = 0;
219 std::vector<std::string> supportedInstanceExtensions;
221 vkEnumerateInstanceExtensionProperties(
nullptr, &extCount,
nullptr);
224 std::vector<VkExtensionProperties> extensions(extCount);
225 if (vkEnumerateInstanceExtensionProperties(
nullptr, &extCount, &extensions.front()) == VK_SUCCESS)
227 for (VkExtensionProperties extension : extensions)
229 supportedInstanceExtensions.push_back(extension.extensionName);
240 if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), enabledExtension) == supportedInstanceExtensions.end())
242 std::cerr <<
"Enabled instance extension \"" << enabledExtension <<
"\" is not present at instance level\n";
244 instanceExtensions.push_back(enabledExtension);
248 VkInstanceCreateInfo instanceCreateInfo = {};
249 instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
250 instanceCreateInfo.pNext = NULL;
251 instanceCreateInfo.pApplicationInfo = &appInfo;
253 if (instanceExtensions.size() > 0)
257 instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
259 instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size();
260 instanceCreateInfo.ppEnabledExtensionNames = instanceExtensions.data();
264 VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{};
265 debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
266 debugCreateInfo.messageSeverity =
267 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
268 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
269 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
270 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
271 debugCreateInfo.messageType =
272 VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
273 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
274 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
278 VkValidationFeatureEnableEXT enabled[] = { VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT };
279 VkValidationFeaturesEXT validationFeatures{};
280 validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
281 validationFeatures.enabledValidationFeatureCount = 1;
282 validationFeatures.pEnabledValidationFeatures = enabled;
283 validationFeatures.disabledValidationFeatureCount = 0;
284 validationFeatures.pDisabledValidationFeatures =
nullptr;
286 debugCreateInfo.pNext = &validationFeatures;
292 const char* validationLayerName =
"VK_LAYER_KHRONOS_validation";
294 uint32_t instanceLayerCount;
295 vkEnumerateInstanceLayerProperties(&instanceLayerCount,
nullptr);
296 std::vector<VkLayerProperties> instanceLayerProperties(instanceLayerCount);
297 vkEnumerateInstanceLayerProperties(&instanceLayerCount, instanceLayerProperties.data());
298 bool validationLayerPresent =
false;
299 for (VkLayerProperties layer : instanceLayerProperties) {
300 if (strcmp(layer.layerName, validationLayerName) == 0) {
301 validationLayerPresent =
true;
305 if (validationLayerPresent) {
306 instanceCreateInfo.ppEnabledLayerNames = &validationLayerName;
307 instanceCreateInfo.enabledLayerCount = 1;
308 instanceCreateInfo.pNext = &debugCreateInfo;
311 std::cerr <<
"Validation layer VK_LAYER_KHRONOS_validation not present, validation is disabled";
312 instanceCreateInfo.enabledLayerCount = 0;
313 instanceCreateInfo.pNext =
nullptr;
316 VkResult result = vkCreateInstance(&instanceCreateInfo,
nullptr, &
vkInstance);
320 auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
vkInstance,
"vkCreateDebugUtilsMessengerEXT");
322 if (func !=
nullptr) {
325 if (r != VK_SUCCESS) {
326 std::cerr <<
"Failed to create VkDebugUtilsMessengerEXT" << std::endl;