diff --git a/base/VulkanAndroid.cpp b/base/VulkanAndroid.cpp index 35d6ff30..6e4892e4 100644 --- a/base/VulkanAndroid.cpp +++ b/base/VulkanAndroid.cpp @@ -1,7 +1,7 @@ /* * Android Vulkan function pointer loader * -* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -125,6 +125,18 @@ PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; PFN_vkCmdFillBuffer vkCmdFillBuffer; +PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; +PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; +PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; +PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; +PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; +PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; +PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; +PFN_vkQueuePresentKHR vkQueuePresentKHR; + +PFN_vkResetCommandBuffer vkResetCommandBuffer; + int32_t vks::android::screenDensity; void *libVulkan; @@ -289,6 +301,18 @@ namespace vks vkDestroySurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR")); vkCmdFillBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdFillBuffer")); + + vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR")); + vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")); + vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR")); + vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR")); + vkCreateSwapchainKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateSwapchainKHR")); + vkDestroySwapchainKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroySwapchainKHR")); + vkGetSwapchainImagesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR")); + vkAcquireNextImageKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkAcquireNextImageKHR")); + vkQueuePresentKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkQueuePresentKHR")); + + vkResetCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkResetCommandBuffer")); } void freeVulkanLibrary() diff --git a/base/VulkanAndroid.h b/base/VulkanAndroid.h index 966f2845..f5e8b799 100644 --- a/base/VulkanAndroid.h +++ b/base/VulkanAndroid.h @@ -1,7 +1,7 @@ /* * Android Vulkan function pointer prototypes * -* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -12,6 +12,7 @@ #define VULKANANDROID_H // Vulkan needs to be loaded dynamically on android +// While SDK 26 (and up) come with a loader, we also want to support older devices, so we manually load function pointers #pragma once @@ -158,6 +159,18 @@ extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; extern PFN_vkCmdFillBuffer vkCmdFillBuffer; +extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; +extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; +extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; +extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; +extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; +extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; +extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; +extern PFN_vkQueuePresentKHR vkQueuePresentKHR; + +extern PFN_vkResetCommandBuffer vkResetCommandBuffer; + namespace vks { namespace android diff --git a/base/VulkanSwapChain.cpp b/base/VulkanSwapChain.cpp index e12405dd..b43b6dd9 100644 --- a/base/VulkanSwapChain.cpp +++ b/base/VulkanSwapChain.cpp @@ -3,7 +3,7 @@ * * A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system * -* Copyright (C) 2016-2021 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -103,7 +103,7 @@ void VulkanSwapChain::initSurface(uint32_t width, uint32_t height) std::vector supportsPresent(queueCount); for (uint32_t i = 0; i < queueCount; i++) { - fpGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, &supportsPresent[i]); + vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, &supportsPresent[i]); } // Search for a graphics and a present queue in the array of queue @@ -157,11 +157,11 @@ void VulkanSwapChain::initSurface(uint32_t width, uint32_t height) // Get list of supported surface formats uint32_t formatCount; - VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, NULL)); + VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, NULL)); assert(formatCount > 0); std::vector surfaceFormats(formatCount); - VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, surfaceFormats.data())); + VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, surfaceFormats.data())); // If the surface format list only includes one entry with VK_FORMAT_UNDEFINED, // there is no preferred format, so we assume VK_FORMAT_B8G8R8A8_UNORM @@ -210,16 +210,6 @@ void VulkanSwapChain::connect(VkInstance instance, VkPhysicalDevice physicalDevi this->instance = instance; this->physicalDevice = physicalDevice; this->device = device; - fpGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR")); - fpGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")); - fpGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR")); - fpGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR")); - - fpCreateSwapchainKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR")); - fpDestroySwapchainKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR")); - fpGetSwapchainImagesKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR")); - fpAcquireNextImageKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR")); - fpQueuePresentKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkQueuePresentKHR")); } /** @@ -236,15 +226,15 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool // Get physical device surface properties and formats VkSurfaceCapabilitiesKHR surfCaps; - VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &surfCaps)); + VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &surfCaps)); // Get available present modes uint32_t presentModeCount; - VK_CHECK_RESULT(fpGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, NULL)); + VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, NULL)); assert(presentModeCount > 0); std::vector presentModes(presentModeCount); - VK_CHECK_RESULT(fpGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, presentModes.data())); + VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, presentModes.data())); VkExtent2D swapchainExtent = {}; // If width (and height) equals the special value 0xFFFFFFFF, the size of the surface will be set by the swapchain @@ -363,7 +353,7 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; } - VK_CHECK_RESULT(fpCreateSwapchainKHR(device, &swapchainCI, nullptr, &swapChain)); + VK_CHECK_RESULT(vkCreateSwapchainKHR(device, &swapchainCI, nullptr, &swapChain)); // If an existing swap chain is re-created, destroy the old swap chain // This also cleans up all the presentable images @@ -373,13 +363,13 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool { vkDestroyImageView(device, buffers[i].view, nullptr); } - fpDestroySwapchainKHR(device, oldSwapchain, nullptr); + vkDestroySwapchainKHR(device, oldSwapchain, nullptr); } - VK_CHECK_RESULT(fpGetSwapchainImagesKHR(device, swapChain, &imageCount, NULL)); + VK_CHECK_RESULT(vkGetSwapchainImagesKHR(device, swapChain, &imageCount, NULL)); // Get the swap chain images images.resize(imageCount); - VK_CHECK_RESULT(fpGetSwapchainImagesKHR(device, swapChain, &imageCount, images.data())); + VK_CHECK_RESULT(vkGetSwapchainImagesKHR(device, swapChain, &imageCount, images.data())); // Get the swap chain buffers containing the image and imageview buffers.resize(imageCount); @@ -425,7 +415,7 @@ VkResult VulkanSwapChain::acquireNextImage(VkSemaphore presentCompleteSemaphore, { // By setting timeout to UINT64_MAX we will always wait until the next image has been acquired or an actual error is thrown // With that we don't have to handle VK_NOT_READY - return fpAcquireNextImageKHR(device, swapChain, UINT64_MAX, presentCompleteSemaphore, (VkFence)nullptr, imageIndex); + return vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, presentCompleteSemaphore, (VkFence)nullptr, imageIndex); } /** @@ -451,7 +441,7 @@ VkResult VulkanSwapChain::queuePresent(VkQueue queue, uint32_t imageIndex, VkSem presentInfo.pWaitSemaphores = &waitSemaphore; presentInfo.waitSemaphoreCount = 1; } - return fpQueuePresentKHR(queue, &presentInfo); + return vkQueuePresentKHR(queue, &presentInfo); } @@ -469,7 +459,7 @@ void VulkanSwapChain::cleanup() } if (surface != VK_NULL_HANDLE) { - fpDestroySwapchainKHR(device, swapChain, nullptr); + vkDestroySwapchainKHR(device, swapChain, nullptr); vkDestroySurfaceKHR(instance, surface, nullptr); } surface = VK_NULL_HANDLE; diff --git a/base/VulkanSwapChain.h b/base/VulkanSwapChain.h index 8d591100..8163ad4c 100644 --- a/base/VulkanSwapChain.h +++ b/base/VulkanSwapChain.h @@ -3,7 +3,7 @@ * * A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system * -* Copyright (C) 2016-2017 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -39,16 +39,6 @@ private: VkDevice device; VkPhysicalDevice physicalDevice; VkSurfaceKHR surface; - // Function pointers - PFN_vkGetPhysicalDeviceSurfaceSupportKHR fpGetPhysicalDeviceSurfaceSupportKHR; - PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR fpGetPhysicalDeviceSurfaceCapabilitiesKHR; - PFN_vkGetPhysicalDeviceSurfaceFormatsKHR fpGetPhysicalDeviceSurfaceFormatsKHR; - PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fpGetPhysicalDeviceSurfacePresentModesKHR; - PFN_vkCreateSwapchainKHR fpCreateSwapchainKHR; - PFN_vkDestroySwapchainKHR fpDestroySwapchainKHR; - PFN_vkGetSwapchainImagesKHR fpGetSwapchainImagesKHR; - PFN_vkAcquireNextImageKHR fpAcquireNextImageKHR; - PFN_vkQueuePresentKHR fpQueuePresentKHR; public: VkFormat colorFormat; VkColorSpaceKHR colorSpace;