Use dynamic viewport sizes

This commit is contained in:
Georg Hagen
2024-07-30 14:04:20 +02:00
parent 631d108be4
commit ce1b52c130
8 changed files with 39 additions and 52 deletions

View File

@@ -46,6 +46,12 @@ namespace OpenVulkano
return result;
}
template<typename T, typename... N>
static auto MakeStdArray(N&&... args) -> std::array<T, sizeof...(args)>
{
return { std::forward<N>(args)... };
}
template<typename T, typename U>
static bool GetFlag(T var, U flag)
{

View File

@@ -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();*/ }

View File

@@ -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()

View File

@@ -24,8 +24,10 @@ namespace OpenVulkano::Vulkan
vk::Format depthBufferFormat = vk::Format::eUndefined, colorFormat = vk::Format::eUndefined;
vk::Extent3D size;
std::vector<RenderPass*> 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<IImage*> GetImages() = 0;
[[nodiscard]] virtual std::vector<IImage*> 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; }
};
}

View File

@@ -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 };

View File

@@ -100,8 +100,14 @@ namespace OpenVulkano::Vulkan
CreatePipelineLayout();
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfo.size()), shaderStageCreateInfo.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, pipelineLayout, context->swapChainRenderPass.renderPass };
const auto dynSates = Utils::MakeStdArray<vk::DynamicState>( vk::DynamicState::eViewport, vk::DynamicState::eScissor );
vk::PipelineDynamicStateCreateInfo dynStateInfo { {}, dynSates.size(), dynSates.data() };
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(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;
}

View File

@@ -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());
}

View File

@@ -43,8 +43,6 @@ namespace OpenVulkano
IVulkanWindow* window = nullptr;
vk::SurfaceFormatKHR surfaceFormat;
vk::PresentModeKHR presentMode;
vk::Viewport fullscreenViewport;
vk::Rect2D fullscreenScissor;
std::vector<vk::Semaphore> 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());