diff --git a/examples/ExampleApps/BillboardExampleApp.cpp b/examples/ExampleApps/BillboardExampleApp.cpp index b579a17..4c54873 100644 --- a/examples/ExampleApps/BillboardExampleApp.cpp +++ b/examples/ExampleApps/BillboardExampleApp.cpp @@ -42,6 +42,8 @@ namespace OpenVulkano auto engineConfig = OpenVulkano::EngineConfiguration::GetEngineConfiguration(); engineConfig->SetNumThreads(4); engineConfig->SetPreferFramebufferFormatSRGB(false); + engineConfig->SetFpsCap(0); // monitor's refresh rate + engineConfig->SetVSync(true); std::srand(1); // Fix seed for random numbers m_scene.Init(); diff --git a/openVulkanoCpp/Base/EngineConfiguration.cpp b/openVulkanoCpp/Base/EngineConfiguration.cpp index 51c199e..bfc1340 100644 --- a/openVulkanoCpp/Base/EngineConfiguration.cpp +++ b/openVulkanoCpp/Base/EngineConfiguration.cpp @@ -21,6 +21,9 @@ namespace OpenVulkano const char* FRAMEBUFFER_CLEAR_COLOR_STR = "FramebufferClearColor"; const char* PREFER_FRAMEBUFFER_FORMAT_SRGB_STR = "PreferFramebufferFormatSRGB"; const char* LAZY_RENDERING_STR = "LazyRendering"; + const char* VSYNC_STR = "VSync"; + const char* FPSCAP_STR = "FpsCap"; + const char* PREFERRED_IMAGE_COUNT_STR = "PreferredImageCount"; } EngineConfiguration::EngineConfiguration() @@ -56,6 +59,16 @@ namespace OpenVulkano { root[LAZY_RENDERING_STR] >> m_lazyRendering; } + + if (root.has_child(VSYNC_STR)) { root[VSYNC_STR] >> m_vSync; } + if (root.has_child(FPSCAP_STR) && root[FPSCAP_STR].val().is_integer()) + { + root[FPSCAP_STR] >> m_fpsCap; + } + if (root.has_child(PREFERRED_IMAGE_COUNT_STR) && root[PREFERRED_IMAGE_COUNT_STR].val().is_integer()) + { + root[PREFERRED_IMAGE_COUNT_STR] >> m_preferredImageCount; + } } EngineConfiguration* EngineConfiguration::GetEngineConfiguration() diff --git a/openVulkanoCpp/Base/EngineConfiguration.hpp b/openVulkanoCpp/Base/EngineConfiguration.hpp index 2824815..27f299f 100644 --- a/openVulkanoCpp/Base/EngineConfiguration.hpp +++ b/openVulkanoCpp/Base/EngineConfiguration.hpp @@ -15,16 +15,7 @@ namespace OpenVulkano { class EngineConfiguration { - private: - EngineConfiguration(); - ~EngineConfiguration() = default; - - uint32_t m_numThreads = 1; - std::array m_frameBufferClearColor = { 0.39f, 0.58f, 0.93f, 1.0f }; - bool m_preferFramebufferFormatSRGB = true; - bool m_lazyRendering = false; - - public: + public: [[nodiscard]] static EngineConfiguration* GetEngineConfiguration(); void SetNumThreads(uint32_t numThreads) { m_numThreads = numThreads; } @@ -38,5 +29,31 @@ namespace OpenVulkano [[nodiscard]] bool GetLazyRendering() const { return m_lazyRendering; } void SetLazyRendering(bool lazyRender) { m_lazyRendering = lazyRender; } + + [[nodiscard]] bool GetVSync() const { return m_vSync; } + void SetVSync(bool vSync) { m_vSync = vSync; } + + [[nodiscard]] int32_t GetFpsCap() const { return m_fpsCap; } + void SetFpsCap(int32_t fpsCap) { m_fpsCap = fpsCap; } + + [[nodiscard]] uint32_t GetPrefferedSwapChainImageCount() const { return m_preferredImageCount; } + void SetPrefferedSwapChainImageCount(uint32_t preferredImageCount) { m_preferredImageCount = preferredImageCount; } + + private: + EngineConfiguration(); + ~EngineConfiguration() = default; + + uint32_t m_numThreads = 1; + std::array m_frameBufferClearColor = { 0.39f, 0.58f, 0.93f, 1.0f }; + bool m_preferFramebufferFormatSRGB = true; + bool m_lazyRendering = false; + bool m_vSync = false; + int32_t m_fpsCap = -1; // -1 = no fps cap. 0 = fps cap if vsync, no cap otherwise. > 0 = set fps cap + #ifdef __APPLE__ + uint32_t m_preferredImageCount = 3; + #else + uint32_t m_preferredImageCount = 2; + #endif + }; } \ No newline at end of file diff --git a/openVulkanoCpp/Vulkan/SwapChain.cpp b/openVulkanoCpp/Vulkan/SwapChain.cpp index eca6a43..dd7b4bc 100644 --- a/openVulkanoCpp/Vulkan/SwapChain.cpp +++ b/openVulkanoCpp/Vulkan/SwapChain.cpp @@ -81,10 +81,13 @@ namespace OpenVulkano::Vulkan { preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity; } else { preTransform = surfaceCapabilities.currentTransform; } - uint32_t usingImages = std::max(preferredImageCount, surfaceCapabilities.minImageCount); + EngineConfiguration* config = EngineConfiguration::GetEngineConfiguration(); + uint32_t usingImages = std::max(config->GetPrefferedSwapChainImageCount(), surfaceCapabilities.minImageCount); if (surfaceCapabilities.maxImageCount > 0) //GPU has limit of swap chain images usingImages = std::min(usingImages, surfaceCapabilities.maxImageCount); - Logger::RENDER->debug("GPU supports {0} to {1} swap chain images. Preferred: {2}, Using: {3}", surfaceCapabilities.minImageCount, surfaceCapabilities.maxImageCount, preferredImageCount, usingImages); + Logger::RENDER->debug("GPU supports {0} to {1} swap chain images. Preferred: {2}, Using: {3}", + surfaceCapabilities.minImageCount, surfaceCapabilities.maxImageCount, + config->GetPrefferedSwapChainImageCount(), usingImages); const vk::SwapchainCreateInfoKHR createInfo({}, surface, usingImages, surfaceFormat.format, surfaceFormat.colorSpace, size, 1, @@ -151,6 +154,9 @@ namespace OpenVulkano::Vulkan vk::PresentModeKHR SwapChain::ChosePresentMode() { std::vector presentModes = device->physicalDevice.getSurfacePresentModesKHR(surface); + EngineConfiguration* config = EngineConfiguration::GetEngineConfiguration(); + const bool useVSync = config->GetVSync(); + const int32_t fpsCap = config->GetFpsCap(); #ifdef DEBUG std::string availableModes = ""; for (const auto& presentMode : presentModes) @@ -158,12 +164,13 @@ namespace OpenVulkano::Vulkan if (availableModes.length() > 0) availableModes += ", "; availableModes += vk::to_string(presentMode); } - Logger::RENDER->debug("Available swap chain present modes {0}. Searching best mode for: vsync={1}", availableModes, useVsync); + Logger::RENDER->debug("Available swap chain present modes {0}. Searching best mode for: vsync={1}", availableModes, useVSync); #endif vk::PresentModeKHR mode = vk::PresentModeKHR::eFifo; - if (useVsync) + if (useVSync) { - if (Utils::Contains(presentModes, vk::PresentModeKHR::eMailbox)) mode = vk::PresentModeKHR::eMailbox; + if (fpsCap != 0 && Utils::Contains(presentModes, vk::PresentModeKHR::eMailbox)) + mode = vk::PresentModeKHR::eMailbox; } else { diff --git a/openVulkanoCpp/Vulkan/SwapChain.hpp b/openVulkanoCpp/Vulkan/SwapChain.hpp index 5dd5f02..738205b 100644 --- a/openVulkanoCpp/Vulkan/SwapChain.hpp +++ b/openVulkanoCpp/Vulkan/SwapChain.hpp @@ -10,6 +10,7 @@ #include "Image.hpp" #include "FrameBuffer.hpp" #include "Base/UI/IWindow.hpp" +#include "Base/EngineConfiguration.hpp" #include "Base/Logger.hpp" #include @@ -46,13 +47,6 @@ namespace OpenVulkano vk::Rect2D fullscreenScissor; std::vector imageAvailableSemaphores; uint32_t currentSemaphoreId = 0; - bool useVsync = false; - -#ifdef __APPLE__ - uint32_t preferredImageCount = 3; //TODO add option -#else - uint32_t preferredImageCount = 2; //TODO add option -#endif vk::Extent2D size{0,0}; public: @@ -99,13 +93,6 @@ namespace OpenVulkano } } - [[nodiscard]] bool UseVsync() const { return useVsync; } - - void SetVsync(bool vsync) - { //TODO change swap chain - this->useVsync = vsync; - } - [[nodiscard]] uint32_t GetImageCount() const { return images.size();