Use dynamic viewport sizes
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();*/ }
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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; }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user