From 6be726205977877ff7de2c0200ed22d42755c894 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 22 Jul 2024 11:05:30 +0300 Subject: [PATCH 1/4] fix debug macro definition when cmake is not invoked from cmd --- CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cf720b..487a02c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,10 +112,7 @@ LinkCurl(openVulkanoCpp) add_compile_definitions(LIBARCHIVE_STATIC) add_compile_definitions(NOMINMAX) - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - add_compile_definitions(DEBUG) -endif() +add_compile_definitions("DEBUG=$") SetGlmDefines(openVulkanoCpp) From bc02c0e937eb7a65a8f533116fb8115f1f30de08 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 22 Jul 2024 11:05:55 +0300 Subject: [PATCH 2/4] disable useless warnings for MSVC --- cmake/SetCompilerSettings.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/SetCompilerSettings.cmake b/cmake/SetCompilerSettings.cmake index 19ae152..4fd20bd 100644 --- a/cmake/SetCompilerSettings.cmake +++ b/cmake/SetCompilerSettings.cmake @@ -15,6 +15,11 @@ endfunction() function(SetWarningSettings TARGET) if (LINUX) target_compile_options(${TARGET} PRIVATE -Wall -Wno-unknown-pragmas) + elseif (WIN32) + if (MSVC) + set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "/wd4068") + set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/ignore:4099") + endif() endif() endfunction() From 6ed4136393e4e9e1bf4dd48318468a628d6ad10c Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 22 Jul 2024 11:07:33 +0300 Subject: [PATCH 3/4] move some options from swap chain to engine configuration and fix not working VSync --- examples/ExampleApps/BillboardExampleApp.cpp | 2 ++ openVulkanoCpp/Base/EngineConfiguration.cpp | 13 +++++++ openVulkanoCpp/Base/EngineConfiguration.hpp | 37 ++++++++++++++------ openVulkanoCpp/Vulkan/SwapChain.cpp | 17 ++++++--- openVulkanoCpp/Vulkan/SwapChain.hpp | 15 +------- 5 files changed, 55 insertions(+), 29 deletions(-) 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(); From fd9697aac63d515935b8ab21a428964cdddc825c Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 22 Jul 2024 13:04:47 +0300 Subject: [PATCH 4/4] fix 0 size vulkan index buffers --- openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp | 5 +++-- openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index c49030a..c97ed17 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -152,8 +152,9 @@ namespace OpenVulkano::Vulkan { ManagedBuffer::Ptr vertexBuffer = CreateDeviceOnlyBufferWithData(sizeof(Vertex) * geometry->GetVertexCount(), vk::BufferUsageFlagBits::eVertexBuffer, geometry->GetVertices()); - ManagedBuffer::Ptr indexBuffer = - CreateDeviceOnlyBufferWithData(Utils::EnumAsInt(geometry->indexType) * geometry->GetIndexCount(), vk::BufferUsageFlagBits::eIndexBuffer, geometry->GetIndices()); + ManagedBuffer::Ptr indexBuffer; + if (geometry->GetIndexCount()) + indexBuffer = CreateDeviceOnlyBufferWithData(Utils::EnumAsInt(geometry->indexType) * geometry->GetIndexCount(), vk::BufferUsageFlagBits::eIndexBuffer, geometry->GetIndices()); VulkanGeometry* vkGeo = new VulkanGeometry(geometry, vertexBuffer, indexBuffer); geometries.emplace_back(vkGeo); geometry->renderGeo = vkGeo; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp index 1392fea..eb5459f 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp @@ -47,7 +47,7 @@ namespace OpenVulkano::Vulkan void RecordBind(vk::CommandBuffer& cmdBuffer) { cmdBuffer.bindVertexBuffers(0, 1, &m_vertexBuffer->buffer, &m_offsets); - cmdBuffer.bindIndexBuffer(m_indexBuffer->buffer, 0, m_indexType); + if (m_indexBuffer) { cmdBuffer.bindIndexBuffer(m_indexBuffer->buffer, 0, m_indexType); } } void RecordDraw(vk::CommandBuffer& cmdBuffer)