From ce1b52c1301601824063fb54366d1935247e0049 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 30 Jul 2024 14:04:20 +0200 Subject: [PATCH] Use dynamic viewport sizes --- openVulkanoCpp/Base/Utils.hpp | 6 +++ openVulkanoCpp/Scene/Shader/Shader.hpp | 1 + openVulkanoCpp/Vulkan/FrameBuffer.cpp | 4 ++ openVulkanoCpp/Vulkan/FrameBuffer.hpp | 54 +++++++------------- openVulkanoCpp/Vulkan/Renderer.cpp | 2 + openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 10 +++- openVulkanoCpp/Vulkan/SwapChain.cpp | 2 - openVulkanoCpp/Vulkan/SwapChain.hpp | 12 ----- 8 files changed, 39 insertions(+), 52 deletions(-) diff --git a/openVulkanoCpp/Base/Utils.hpp b/openVulkanoCpp/Base/Utils.hpp index 97def0c..0697990 100644 --- a/openVulkanoCpp/Base/Utils.hpp +++ b/openVulkanoCpp/Base/Utils.hpp @@ -46,6 +46,12 @@ namespace OpenVulkano return result; } + template + static auto MakeStdArray(N&&... args) -> std::array + { + return { std::forward(args)... }; + } + template static bool GetFlag(T var, U flag) { diff --git a/openVulkanoCpp/Scene/Shader/Shader.hpp b/openVulkanoCpp/Scene/Shader/Shader.hpp index 484165d..e743e8a 100644 --- a/openVulkanoCpp/Scene/Shader/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader/Shader.hpp @@ -80,6 +80,7 @@ namespace OpenVulkano::Scene bool alphaBlend = false; // TODO allow fine control over blending bool depthTest = true; bool depthWrite = true; + bool dynamicViewport = true; // If disabled the swapchains fullscreen viewport will always be used, regardless of framebuffer or viewport Shader() = default; ~Shader() override { /*if (renderShader) Shader::Close();*/ } diff --git a/openVulkanoCpp/Vulkan/FrameBuffer.cpp b/openVulkanoCpp/Vulkan/FrameBuffer.cpp index 3790955..e422736 100644 --- a/openVulkanoCpp/Vulkan/FrameBuffer.cpp +++ b/openVulkanoCpp/Vulkan/FrameBuffer.cpp @@ -18,6 +18,8 @@ void OpenVulkano::Vulkan::FrameBuffer::Init(Device* device, vk::Extent3D size, b depthBufferFormat = FindDepthFormat(); CreateDepthStencil(); } + fullscreenViewport = vk::Viewport{ 0, 0, (float)size.width, (float)size.height, 0, 1 }; + fullscreenScissor = vk::Rect2D{ { 0, 0 }, { size.width, size.height } }; } void OpenVulkano::Vulkan::FrameBuffer::RegisterRenderPass(RenderPass* renderPass) @@ -44,6 +46,8 @@ void OpenVulkano::Vulkan::FrameBuffer::Resize(vk::Extent3D size) { renderPass->Resize(size); } + fullscreenViewport = vk::Viewport{ 0, 0, (float)size.width, (float)size.height, 0, 1 }; + fullscreenScissor = vk::Rect2D{ { 0, 0 }, { size.width, size.height } }; } void OpenVulkano::Vulkan::FrameBuffer::CreateDepthStencil() diff --git a/openVulkanoCpp/Vulkan/FrameBuffer.hpp b/openVulkanoCpp/Vulkan/FrameBuffer.hpp index 9b78bf6..fcf54eb 100644 --- a/openVulkanoCpp/Vulkan/FrameBuffer.hpp +++ b/openVulkanoCpp/Vulkan/FrameBuffer.hpp @@ -24,8 +24,10 @@ namespace OpenVulkano::Vulkan vk::Format depthBufferFormat = vk::Format::eUndefined, colorFormat = vk::Format::eUndefined; vk::Extent3D size; std::vector renderPasses; - bool useDepthBuffer; + vk::Viewport fullscreenViewport; + vk::Rect2D fullscreenScissor; Device* device = nullptr; + bool useDepthBuffer; protected: uint32_t currentFrameBufferId = 0; @@ -38,15 +40,9 @@ namespace OpenVulkano::Vulkan void Init(Device* device, vk::Extent3D size, bool useDepthBuffer = true); - void SetCurrentFrameId(uint32_t id) - { - currentFrameBufferId = id; - } + void SetCurrentFrameId(uint32_t id) { currentFrameBufferId = id; } - uint32_t GetCurrentFrameId() const - { - return currentFrameBufferId; - } + [[nodiscard]] uint32_t GetCurrentFrameId() const { return currentFrameBufferId; } public: void RegisterRenderPass(RenderPass* renderPass); @@ -69,44 +65,30 @@ namespace OpenVulkano::Vulkan void DestroyFrameBuffer(); - virtual vk::Format FindColorFormat() = 0; + [[nodiscard]] virtual vk::Format FindColorFormat() = 0; - virtual vk::Format FindDepthFormat() + [[nodiscard]] virtual vk::Format FindDepthFormat() { return device->GetSupportedDepthFormat(); } public: - virtual vk::Format GetColorFormat() - { - return colorFormat; - } + [[nodiscard]] vk::Format GetColorFormat() const { return colorFormat; } - virtual vk::Format GetDepthFormat() - { - return depthBufferFormat; - } + [[nodiscard]] vk::Format GetDepthFormat() const { return depthBufferFormat; } - virtual std::vector GetImages() = 0; + [[nodiscard]] virtual std::vector GetImages() = 0; - bool UseDepthBuffer() const - { - return useDepthBuffer; - } + [[nodiscard]] bool UseDepthBuffer() const { return useDepthBuffer; } - vk::Extent3D GetSize3D() const - { - return size; - } + [[nodiscard]] const vk::Extent3D& GetSize3D() const { return size; } - vk::Extent2D GetSize2D() const - { - return { size.width, size.height }; - } + [[nodiscard]] vk::Extent2D GetSize2D() const { return { size.width, size.height }; } - vk::Framebuffer& GetCurrentFrameBuffer() - { - return frameBuffers[currentFrameBufferId]; - } + [[nodiscard]] vk::Framebuffer& GetCurrentFrameBuffer() { return frameBuffers[currentFrameBufferId]; } + + [[nodiscard]] const vk::Viewport& GetFullscreenViewport() const { return fullscreenViewport; } + + [[nodiscard]] const vk::Rect2D& GetFullscreenScissor() const { return fullscreenScissor; } }; } diff --git a/openVulkanoCpp/Vulkan/Renderer.cpp b/openVulkanoCpp/Vulkan/Renderer.cpp index dca2d6f..18e94a8 100644 --- a/openVulkanoCpp/Vulkan/Renderer.cpp +++ b/openVulkanoCpp/Vulkan/Renderer.cpp @@ -170,6 +170,8 @@ namespace OpenVulkano::Vulkan cmdHelper->Reset(); vk::CommandBufferInheritanceInfo inheritance = { context.swapChainRenderPass.renderPass, 0, context.swapChainRenderPass.GetFrameBuffer()->GetCurrentFrameBuffer() }; cmdHelper->cmdBuffer.begin(vk::CommandBufferBeginInfo{ vk::CommandBufferUsageFlagBits::eOneTimeSubmit | vk::CommandBufferUsageFlagBits::eRenderPassContinue, &inheritance }); + cmdHelper->cmdBuffer.setViewport(0, 1, &context.swapChainRenderPass.GetFrameBuffer()->GetFullscreenViewport()); + cmdHelper->cmdBuffer.setScissor(0, 1, &context.swapChainRenderPass.GetFrameBuffer()->GetFullscreenScissor()); Scene::Drawable** drawablePointer; VulkanDrawContext drawContext { poolId, currentImageId, cmdHelper->cmdBuffer, this }; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index 91fa821..2add4f8 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -100,8 +100,14 @@ namespace OpenVulkano::Vulkan CreatePipelineLayout(); - vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast(shaderStageCreateInfo.size()), shaderStageCreateInfo.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly, - nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, pipelineLayout, context->swapChainRenderPass.renderPass }; + const auto dynSates = Utils::MakeStdArray( vk::DynamicState::eViewport, vk::DynamicState::eScissor ); + vk::PipelineDynamicStateCreateInfo dynStateInfo { {}, dynSates.size(), dynSates.data() }; + + vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast(shaderStageCreateInfo.size()), + shaderStageCreateInfo.data(), &pipelineVertexInputStateCreateInfo, + &inputAssembly, nullptr, &viewportStateCreateInfo, &rasterizer, + &msaa, &depth, &colorInfo, shader->dynamicViewport ? &dynStateInfo : nullptr, pipelineLayout, + context->swapChainRenderPass.renderPass }; pipeline = this->device.createGraphicsPipeline({}, pipelineCreateInfo).value; } diff --git a/openVulkanoCpp/Vulkan/SwapChain.cpp b/openVulkanoCpp/Vulkan/SwapChain.cpp index 8d102b4..f3a4df6 100644 --- a/openVulkanoCpp/Vulkan/SwapChain.cpp +++ b/openVulkanoCpp/Vulkan/SwapChain.cpp @@ -118,8 +118,6 @@ namespace OpenVulkano::Vulkan for (size_t i = 0; i < images.size() + 1; i++) imageAvailableSemaphores.emplace_back(device->device.createSemaphore({})); - fullscreenViewport = vk::Viewport{ 0, 0, (float)size.width, (float)size.height, 0, 1 }; - fullscreenScissor = vk::Rect2D{ {0,0}, size }; Logger::RENDER->debug("Swap chain for window {0} created", window->GetWindowId()); } diff --git a/openVulkanoCpp/Vulkan/SwapChain.hpp b/openVulkanoCpp/Vulkan/SwapChain.hpp index 738205b..0841437 100644 --- a/openVulkanoCpp/Vulkan/SwapChain.hpp +++ b/openVulkanoCpp/Vulkan/SwapChain.hpp @@ -43,8 +43,6 @@ namespace OpenVulkano IVulkanWindow* window = nullptr; vk::SurfaceFormatKHR surfaceFormat; vk::PresentModeKHR presentMode; - vk::Viewport fullscreenViewport; - vk::Rect2D fullscreenScissor; std::vector imageAvailableSemaphores; uint32_t currentSemaphoreId = 0; vk::Extent2D size{0,0}; @@ -65,16 +63,6 @@ namespace OpenVulkano { return size; } - - [[nodiscard]] const vk::Viewport& GetFullscreenViewport() const - { - return fullscreenViewport; - } - - [[nodiscard]] const vk::Rect2D& GetFullscreenScissor() const - { - return fullscreenScissor; - } uint32_t AcquireNextImage(const vk::Fence& fence = vk::Fence());