Fix issue with resizing viewport
This commit is contained in:
@@ -1,4 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "vulkan/vulkan.hpp"
|
#include "vulkan/vulkan.hpp"
|
||||||
#include "../Device.hpp"
|
#include "../Device.hpp"
|
||||||
#include "../../Base/ICloseable.hpp"
|
#include "../../Base/ICloseable.hpp"
|
||||||
@@ -93,9 +100,7 @@ namespace openVulkanoCpp
|
|||||||
{
|
{
|
||||||
for (auto shader : shaders)
|
for (auto shader : shaders)
|
||||||
{
|
{
|
||||||
Scene::Shader* s = shader->shader;
|
shader->Resize();
|
||||||
shader->Close();
|
|
||||||
shader->Init(context, s, this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,8 +32,14 @@ namespace openVulkanoCpp::Vulkan
|
|||||||
this->device = context->device->device;
|
this->device = context->device->device;
|
||||||
this->shader = shader;
|
this->shader = shader;
|
||||||
this->owner = owner;
|
this->owner = owner;
|
||||||
|
this->context = context;
|
||||||
shaderModuleVertex = context->device->CreateShaderModule(shader->vertexShaderName + ".vert.spv");
|
shaderModuleVertex = context->device->CreateShaderModule(shader->vertexShaderName + ".vert.spv");
|
||||||
shaderModuleFragment = context->device->CreateShaderModule(shader->fragmentShaderName + ".frag.spv");
|
shaderModuleFragment = context->device->CreateShaderModule(shader->fragmentShaderName + ".frag.spv");
|
||||||
|
BuildPipeline();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanShader::BuildPipeline()
|
||||||
|
{
|
||||||
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfos(2);
|
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfos(2);
|
||||||
shaderStageCreateInfos[0] = { {}, vk::ShaderStageFlagBits::eVertex, shaderModuleVertex, "main" };
|
shaderStageCreateInfos[0] = { {}, vk::ShaderStageFlagBits::eVertex, shaderModuleVertex, "main" };
|
||||||
shaderStageCreateInfos[1] = { {}, vk::ShaderStageFlagBits::eFragment, shaderModuleFragment, "main" };
|
shaderStageCreateInfos[1] = { {}, vk::ShaderStageFlagBits::eFragment, shaderModuleFragment, "main" };
|
||||||
@@ -47,9 +53,7 @@ namespace openVulkanoCpp::Vulkan
|
|||||||
attributeDescriptions.emplace_back(4, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, textureCoordinates));
|
attributeDescriptions.emplace_back(4, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, textureCoordinates));
|
||||||
attributeDescriptions.emplace_back(5, 0, vk::Format::eR32G32B32A32Sfloat, offsetof(Vertex, color));
|
attributeDescriptions.emplace_back(5, 0, vk::Format::eR32G32B32A32Sfloat, offsetof(Vertex, color));
|
||||||
|
|
||||||
auto viewport = context->swapChain.GetFullscreenViewport();
|
vk::PipelineViewportStateCreateInfo viewportStateCreateInfo = { {}, 1, &context->swapChain.GetFullscreenViewport(), 1, &context->swapChain.GetFullscreenScissor() };
|
||||||
auto scissor = context->swapChain.GetFullscreenScissor();
|
|
||||||
vk::PipelineViewportStateCreateInfo viewportStateCreateInfo = { {}, 1, &viewport, 1, &scissor };
|
|
||||||
vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = { {}, 1, &vertexBindDesc,
|
vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = { {}, 1, &vertexBindDesc,
|
||||||
static_cast<uint32_t>(attributeDescriptions.size()), attributeDescriptions.data() };
|
static_cast<uint32_t>(attributeDescriptions.size()), attributeDescriptions.data() };
|
||||||
vk::PipelineInputAssemblyStateCreateInfo inputAssembly = { {}, ToVkTopology(shader->topology), 0 };
|
vk::PipelineInputAssemblyStateCreateInfo inputAssembly = { {}, ToVkTopology(shader->topology), 0 };
|
||||||
@@ -69,7 +73,12 @@ namespace openVulkanoCpp::Vulkan
|
|||||||
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfos.size()), shaderStageCreateInfos.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
|
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfos.size()), shaderStageCreateInfos.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
|
||||||
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, context->pipeline.pipelineLayout, context->swapChainRenderPass.renderPass };
|
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, context->pipeline.pipelineLayout, context->swapChainRenderPass.renderPass };
|
||||||
pipeline = this->device.createGraphicsPipeline({}, pipelineCreateInfo).value;
|
pipeline = this->device.createGraphicsPipeline({}, pipelineCreateInfo).value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanShader::Resize()
|
||||||
|
{
|
||||||
|
device.destroyPipeline(pipeline);
|
||||||
|
BuildPipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanShader::Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId)
|
void VulkanShader::Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId)
|
||||||
|
|||||||
@@ -23,15 +23,21 @@ namespace openVulkanoCpp::Vulkan
|
|||||||
vk::ShaderModule shaderModuleVertex, shaderModuleFragment;
|
vk::ShaderModule shaderModuleVertex, shaderModuleFragment;
|
||||||
vk::Pipeline pipeline;
|
vk::Pipeline pipeline;
|
||||||
IShaderOwner* owner;
|
IShaderOwner* owner;
|
||||||
|
Context* context;
|
||||||
|
|
||||||
VulkanShader() = default;
|
VulkanShader() = default;
|
||||||
~VulkanShader() override { if (shader) VulkanShader::Close(); }
|
~VulkanShader() override { if (shader) VulkanShader::Close(); }
|
||||||
|
|
||||||
void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner);
|
void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner);
|
||||||
|
|
||||||
|
void Resize();
|
||||||
|
|
||||||
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override;
|
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override;
|
||||||
|
|
||||||
void Close() override;
|
void Close() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void BuildPipeline();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ namespace openVulkanoCpp
|
|||||||
vk::SurfaceFormatKHR surfaceFormat;
|
vk::SurfaceFormatKHR surfaceFormat;
|
||||||
vk::PresentModeKHR presentMode;
|
vk::PresentModeKHR presentMode;
|
||||||
vk::Viewport fullscreenViewport;
|
vk::Viewport fullscreenViewport;
|
||||||
|
vk::Rect2D fullscreenScissor;
|
||||||
bool useVsync = false;
|
bool useVsync = false;
|
||||||
|
|
||||||
uint32_t preferredImageCount = 2; //TODO add option
|
uint32_t preferredImageCount = 2; //TODO add option
|
||||||
@@ -87,19 +88,19 @@ namespace openVulkanoCpp
|
|||||||
FrameBuffer::Resize(vk::Extent3D(size, 1));
|
FrameBuffer::Resize(vk::Extent3D(size, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::Extent2D GetSize() const
|
[[nodiscard]] vk::Extent2D GetSize() const
|
||||||
{
|
{
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::Viewport GetFullscreenViewport() const
|
[[nodiscard]] const vk::Viewport& GetFullscreenViewport() const
|
||||||
{
|
{
|
||||||
return fullscreenViewport;
|
return fullscreenViewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::Rect2D GetFullscreenScissor() const
|
[[nodiscard]] const vk::Rect2D& GetFullscreenScissor() const
|
||||||
{
|
{
|
||||||
return { {0,0}, GetSize() };
|
return fullscreenScissor;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t AcquireNextImage(const vk::Fence fence = vk::Fence())
|
uint32_t AcquireNextImage(const vk::Fence fence = vk::Fence())
|
||||||
@@ -127,14 +128,14 @@ namespace openVulkanoCpp
|
|||||||
1, &swapChain, ¤tFrameBufferId));
|
1, &swapChain, ¤tFrameBufferId));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UseVsync() { return useVsync; }
|
bool UseVsync() const { return useVsync; }
|
||||||
|
|
||||||
void SetVsync(bool useVsync)
|
void SetVsync(bool useVsync)
|
||||||
{ //TODO change swap chain
|
{ //TODO change swap chain
|
||||||
this->useVsync = useVsync;
|
this->useVsync = useVsync;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetImageCount() const
|
[[nodiscard]] uint32_t GetImageCount() const
|
||||||
{
|
{
|
||||||
return images.size();
|
return images.size();
|
||||||
}
|
}
|
||||||
@@ -175,6 +176,7 @@ namespace openVulkanoCpp
|
|||||||
CreateSwapChainImages();
|
CreateSwapChainImages();
|
||||||
|
|
||||||
fullscreenViewport = vk::Viewport{ 0, 0, (float)size.width, (float)size.height, 0, 1 };
|
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());
|
Logger::RENDER->debug("Swap chain for window {0} created", window->GetWindowId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user