From c598b1e7ab4ccb068967a972e5a96fa1eb0f7b7a Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Wed, 3 Jul 2024 21:28:20 +0200 Subject: [PATCH] Move entry point macros to separate header (#1120) * Move entry point macros to separate header * Minor code cleanup * Updated macos CI --- .github/workflows/build.yml | 2 +- base/Entrypoints.h | 185 ++++++++++++++++++ base/vulkanexamplebase.h | 150 +------------- .../conditionalrender/conditionalrender.cpp | 7 +- .../raytracingsbtdata/raytracingsbtdata.cpp | 44 ++--- 5 files changed, 212 insertions(+), 176 deletions(-) create mode 100644 base/Entrypoints.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index daf77f1f..be0cee67 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: build_macOS: name: Build macOS - runs-on: macos-11 + runs-on: macos-13 steps: - uses: actions/checkout@v4 with: diff --git a/base/Entrypoints.h b/base/Entrypoints.h new file mode 100644 index 00000000..24b8d533 --- /dev/null +++ b/base/Entrypoints.h @@ -0,0 +1,185 @@ +/* + * Vulkan entry points + * + * Platform specific macros for the example main entry points + * + * Copyright (C) 2024 by Sascha Willems - www.saschawillems.de + * + * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) + */ + +#if defined(_WIN32) +/* + * Windows + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \ +{ \ + if (vulkanExample != NULL) \ + { \ + vulkanExample->handleMessages(hWnd, uMsg, wParam, lParam); \ + } \ + return (DefWindowProc(hWnd, uMsg, wParam, lParam)); \ +} \ +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) \ +{ \ + for (int32_t i = 0; i < __argc; i++) { VulkanExample::args.push_back(__argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(hInstance, WndProc); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} + +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) +/* + * Android + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +void android_main(android_app* state) \ +{ \ + vulkanExample = new VulkanExample(); \ + state->userData = vulkanExample; \ + state->onAppCmd = VulkanExample::handleAppCommand; \ + state->onInputEvent = VulkanExample::handleAppInput; \ + androidApp = state; \ + vks::android::getDeviceConfig(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ +} + +#elif defined(_DIRECT2DISPLAY) +/* + * Direct-to-display + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +static void handleEvent() \ +{ \ +} \ +int main(const int argc, const char *argv[]) \ +{ \ + for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} + +#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT) +/* + * Direct FB + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +static void handleEvent(const DFBWindowEvent *event) \ +{ \ + if (vulkanExample != NULL) \ + { \ + vulkanExample->handleEvent(event); \ + } \ +} \ +int main(const int argc, const char *argv[]) \ +{ \ + for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} + +#elif (defined(VK_USE_PLATFORM_WAYLAND_KHR) || defined(VK_USE_PLATFORM_HEADLESS_EXT)) + /* + * Wayland / headless + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +int main(const int argc, const char *argv[]) \ +{ \ + for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} + +#elif defined(VK_USE_PLATFORM_XCB_KHR) +/* + * X11 Xcb + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +static void handleEvent(const xcb_generic_event_t *event) \ +{ \ + if (vulkanExample != NULL) \ + { \ + vulkanExample->handleEvent(event); \ + } \ +} \ +int main(const int argc, const char *argv[]) \ +{ \ + for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} + +#elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) || defined(VK_USE_PLATFORM_METAL_EXT)) +/* + * iOS and macOS (using MoltenVK) + */ +#if defined(VK_EXAMPLE_XCODE_GENERATED) +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +int main(const int argc, const char *argv[]) \ +{ \ + @autoreleasepool \ + { \ + for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(nullptr); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + } \ + return 0; \ +} +#else +#define VULKAN_EXAMPLE_MAIN() +#endif + +#elif defined(VK_USE_PLATFORM_SCREEN_QNX) +/* + * QNX Screen + */ +#define VULKAN_EXAMPLE_MAIN() \ +VulkanExample *vulkanExample; \ +int main(const int argc, const char *argv[]) \ +{ \ + for (int i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ + vulkanExample = new VulkanExample(); \ + vulkanExample->initVulkan(); \ + vulkanExample->setupWindow(); \ + vulkanExample->prepare(); \ + vulkanExample->renderLoop(); \ + delete(vulkanExample); \ + return 0; \ +} +#endif diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index f7ab3595..d4355dc3 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -414,152 +414,4 @@ public: #endif }; -// OS specific macros for the example main entry points -#if defined(_WIN32) -// Windows entry point -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) \ -{ \ - if (vulkanExample != NULL) \ - { \ - vulkanExample->handleMessages(hWnd, uMsg, wParam, lParam); \ - } \ - return (DefWindowProc(hWnd, uMsg, wParam, lParam)); \ -} \ -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) \ -{ \ - for (int32_t i = 0; i < __argc; i++) { VulkanExample::args.push_back(__argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(hInstance, WndProc); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#elif defined(VK_USE_PLATFORM_ANDROID_KHR) -// Android entry point -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -void android_main(android_app* state) \ -{ \ - vulkanExample = new VulkanExample(); \ - state->userData = vulkanExample; \ - state->onAppCmd = VulkanExample::handleAppCommand; \ - state->onInputEvent = VulkanExample::handleAppInput; \ - androidApp = state; \ - vks::android::getDeviceConfig(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ -} -#elif defined(_DIRECT2DISPLAY) -// Linux entry point with direct to display wsi -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -static void handleEvent() \ -{ \ -} \ -int main(const int argc, const char *argv[]) \ -{ \ - for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT) -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -static void handleEvent(const DFBWindowEvent *event) \ -{ \ - if (vulkanExample != NULL) \ - { \ - vulkanExample->handleEvent(event); \ - } \ -} \ -int main(const int argc, const char *argv[]) \ -{ \ - for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#elif (defined(VK_USE_PLATFORM_WAYLAND_KHR) || defined(VK_USE_PLATFORM_HEADLESS_EXT)) -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -int main(const int argc, const char *argv[]) \ -{ \ - for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#elif defined(VK_USE_PLATFORM_XCB_KHR) -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -static void handleEvent(const xcb_generic_event_t *event) \ -{ \ - if (vulkanExample != NULL) \ - { \ - vulkanExample->handleEvent(event); \ - } \ -} \ -int main(const int argc, const char *argv[]) \ -{ \ - for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) || defined(VK_USE_PLATFORM_METAL_EXT)) -#if defined(VK_EXAMPLE_XCODE_GENERATED) -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -int main(const int argc, const char *argv[]) \ -{ \ - @autoreleasepool \ - { \ - for (size_t i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(nullptr); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - } \ - return 0; \ -} -#else -#define VULKAN_EXAMPLE_MAIN() -#endif - -#elif defined(VK_USE_PLATFORM_SCREEN_QNX) -#define VULKAN_EXAMPLE_MAIN() \ -VulkanExample *vulkanExample; \ -int main(const int argc, const char *argv[]) \ -{ \ - for (int i = 0; i < argc; i++) { VulkanExample::args.push_back(argv[i]); }; \ - vulkanExample = new VulkanExample(); \ - vulkanExample->initVulkan(); \ - vulkanExample->setupWindow(); \ - vulkanExample->prepare(); \ - vulkanExample->renderLoop(); \ - delete(vulkanExample); \ - return 0; \ -} -#endif +#include "Entrypoints.h" \ No newline at end of file diff --git a/examples/conditionalrender/conditionalrender.cpp b/examples/conditionalrender/conditionalrender.cpp index 625942df..e180c809 100644 --- a/examples/conditionalrender/conditionalrender.cpp +++ b/examples/conditionalrender/conditionalrender.cpp @@ -6,7 +6,7 @@ * With conditional rendering it's possible to execute certain rendering commands based on a buffer value instead of having to rebuild the command buffers. * This example sets up a conditional buffer with one value per glTF part, that is used to toggle visibility of single model parts. * -* Copyright (C) 2018-2023 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2018-2024 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -14,12 +14,11 @@ #include "vulkanexamplebase.h" #include "VulkanglTFModel.h" - class VulkanExample : public VulkanExampleBase { public: - PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT; - PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT; + PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT{ VK_NULL_HANDLE }; + PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT{ VK_NULL_HANDLE }; vkglTF::Model scene; diff --git a/examples/raytracingsbtdata/raytracingsbtdata.cpp b/examples/raytracingsbtdata/raytracingsbtdata.cpp index 729f6696..46739460 100644 --- a/examples/raytracingsbtdata/raytracingsbtdata.cpp +++ b/examples/raytracingsbtdata/raytracingsbtdata.cpp @@ -5,7 +5,7 @@ * * Example by Nate Morrical (https://github.com/natevm) * -* Copyright (C) 2019-2023 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2019-2024 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ @@ -15,32 +15,32 @@ // Holds data for a ray tracing scratch buffer that is used as a temporary storage struct RayTracingScratchBuffer { - uint64_t deviceAddress = 0; - VkBuffer handle = VK_NULL_HANDLE; - VkDeviceMemory memory = VK_NULL_HANDLE; + uint64_t deviceAddress{ 0 }; + VkBuffer handle{ VK_NULL_HANDLE }; + VkDeviceMemory memory{ VK_NULL_HANDLE }; }; // Ray tracing acceleration structure struct AccelerationStructure { VkAccelerationStructureKHR handle; - uint64_t deviceAddress = 0; - VkDeviceMemory memory; + uint64_t deviceAddress{ 0 }; + VkDeviceMemory memory{ VK_NULL_HANDLE }; VkBuffer buffer; }; class VulkanExample : public VulkanExampleBase { public: - PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR; - PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR; - PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR; - PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR; - PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR; - PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR; - PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR; - PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR; - PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR; - PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR; + PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR{ VK_NULL_HANDLE }; + PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR{ VK_NULL_HANDLE }; + PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR{ VK_NULL_HANDLE }; + PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR{ VK_NULL_HANDLE }; + PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR{ VK_NULL_HANDLE }; + PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR{ VK_NULL_HANDLE }; + PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR{ VK_NULL_HANDLE }; + PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR{ VK_NULL_HANDLE }; + PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR{ VK_NULL_HANDLE }; + PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR{ VK_NULL_HANDLE }; VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingPipelineProperties{}; VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures{}; @@ -54,7 +54,7 @@ public: vks::Buffer vertexBuffer; vks::Buffer indexBuffer; - uint32_t indexCount; + uint32_t indexCount{ 0 }; vks::Buffer transformBuffer; std::vector shaderGroups{}; vks::Buffer raygenShaderBindingTable; @@ -66,7 +66,7 @@ public: VkImage image; VkImageView view; VkFormat format; - } storageImage; + } storageImage{}; struct UniformData { glm::mat4 viewInverse; @@ -74,10 +74,10 @@ public: } uniformData; vks::Buffer ubo; - VkPipeline pipeline; - VkPipelineLayout pipelineLayout; - VkDescriptorSet descriptorSet; - VkDescriptorSetLayout descriptorSetLayout; + VkPipeline pipeline{ VK_NULL_HANDLE }; + VkPipelineLayout pipelineLayout{ VK_NULL_HANDLE }; + VkDescriptorSet descriptorSet{ VK_NULL_HANDLE }; + VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE }; VulkanExample() : VulkanExampleBase() {