Window resize working
This commit is contained in:
parent
1a725c24e2
commit
e2b86545bb
|
@ -76,8 +76,8 @@ namespace Sandbox
|
|||
|
||||
// Create Stress Test Objects
|
||||
static const SHVec3 TEST_OBJ_SCALE = { 0.05f, 0.05f, 0.05f };
|
||||
constexpr int NUM_ROWS = 100;
|
||||
constexpr int NUM_COLS = 100;
|
||||
constexpr int NUM_ROWS = 10;
|
||||
constexpr int NUM_COLS = 10;
|
||||
static const SHVec3 TEST_OBJ_SPACING = { 0.05f, 0.05f, 0.05f };
|
||||
static const SHVec3 TEST_OBJ_START_POS = { - (NUM_COLS / 2 * TEST_OBJ_SPACING.x ) + 1.0f, -2.0f, -1.0f };
|
||||
|
||||
|
|
|
@ -98,6 +98,51 @@ namespace SHADE
|
|||
return *this;
|
||||
}
|
||||
|
||||
void SHVkFramebuffer::HandleResize(Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept
|
||||
{
|
||||
width = inWidth;
|
||||
height = inHeight;
|
||||
|
||||
for (auto& attachment : attachments)
|
||||
{
|
||||
// Not sure if its an error to pass in diff dimension images.
|
||||
if (attachment->GetParentImage()->GetWidth() != (*attachments.begin())->GetParentImage()->GetWidth() || attachment->GetParentImage()->GetHeight() != (*attachments.begin())->GetParentImage()->GetHeight())
|
||||
{
|
||||
SHLOG_ERROR("Dimensions of images not same as each other. Cannot create framebuffer.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<vk::ImageView> vkAttachments(attachments.size());
|
||||
|
||||
uint32_t i = 0;
|
||||
for(auto const& attachment : attachments)
|
||||
{
|
||||
vkAttachments[i] = attachment->GetImageView();
|
||||
++i;
|
||||
}
|
||||
|
||||
vk::FramebufferCreateInfo createInfo
|
||||
{
|
||||
.renderPass = renderpassHdl->GetVkRenderpass(),
|
||||
.attachmentCount = static_cast<uint32_t>(vkAttachments.size()),
|
||||
.pAttachments = vkAttachments.data(),
|
||||
.width = width,
|
||||
.height = height,
|
||||
.layers = 1 // TODO: Find out why this is 1
|
||||
};
|
||||
|
||||
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createFramebuffer(&createInfo, nullptr, &vkFramebuffer); result != vk::Result::eSuccess)
|
||||
{
|
||||
SHVulkanDebugUtil::ReportVkError(result, "Failed to create framebuffer. ");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
SHVulkanDebugUtil::ReportVkSuccess("Successfully created framebuffer. ");
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@ namespace SHADE
|
|||
SHVkFramebuffer(SHVkFramebuffer&& rhs) noexcept;
|
||||
SHVkFramebuffer& operator=(SHVkFramebuffer&& rhs) noexcept;
|
||||
|
||||
void HandleResize (Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SETTERS AND GETTERS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
|
|
@ -293,10 +293,13 @@ namespace SHADE
|
|||
barrier.subresourceRange.layerCount = layerCount;
|
||||
}
|
||||
|
||||
void SHVkImage::HandleResizeFramebufferImage(void) noexcept
|
||||
void SHVkImage::HandleResizeFramebufferImage(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||
{
|
||||
vmaDestroyImage(*vmaAllocator, vkImage, alloc);
|
||||
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
|
||||
CreateFramebufferImage();
|
||||
}
|
||||
|
||||
|
|
|
@ -137,7 +137,7 @@ namespace SHADE
|
|||
Handle<SHVkImageView> CreateImageView (Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) const noexcept;
|
||||
void TransferToDeviceResource (Handle<SHVkCommandBuffer> cmdBufferHdl) noexcept;
|
||||
void PrepareImageTransitionInfo (vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageMemoryBarrier& barrier) noexcept;
|
||||
void HandleResizeFramebufferImage(void) noexcept;
|
||||
void HandleResizeFramebufferImage(uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* GETTERS AND SETTERS */
|
||||
|
|
|
@ -67,6 +67,9 @@ namespace SHADE
|
|||
// Register callback to notify render context upon a window resize
|
||||
window->RegisterWindowSizeCallback([&]([[maybe_unused]] uint32_t width, [[maybe_unused]] uint32_t height)
|
||||
{
|
||||
if (width == 0 || height == 0)
|
||||
return;
|
||||
|
||||
renderContext.SetIsResized(true);
|
||||
});
|
||||
|
||||
|
@ -116,8 +119,8 @@ namespace SHADE
|
|||
screenCamera = resourceManager.Create<SHCamera>();
|
||||
screenCamera->SetLookAt(SHVec3(0.0f, 0.0f, -1.0f), SHVec3(0.0f, 0.0f, 1.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||
screenCamera->SetOrthographic(static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.01f, 100.0f);
|
||||
|
||||
worldCamera = resourceManager.Create<SHCamera>();
|
||||
//worldCamera->SetLookAt(SHVec3(1.0f, 0.0f, -1.0f), SHVec3(0.0f, 0.0f, 2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||
worldCamera->SetLookAt(SHVec3(0.0f, 0.0f, 0.0f), SHVec3(0.0f, 0.0f, -2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||
worldCamera->SetPerspective(90.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 100.0f);
|
||||
|
||||
|
@ -125,7 +128,7 @@ namespace SHADE
|
|||
defaultViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast<float>(window->GetWindowSize().first), static_cast<float>(window->GetWindowSize().second), 0.0f, 1.0f));
|
||||
|
||||
// Get render graph from default viewport world renderer
|
||||
auto worldRenderGraph = resourceManager.Create<SHRenderGraph>();
|
||||
worldRenderGraph = resourceManager.Create<SHRenderGraph>();
|
||||
|
||||
std::vector<Handle<SHVkCommandPool>> renderContextCmdPools{swapchain->GetNumImages()};
|
||||
for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i)
|
||||
|
@ -249,6 +252,10 @@ namespace SHADE
|
|||
// Begin recording the command buffer
|
||||
currentCmdBuffer->BeginRecording();
|
||||
|
||||
uint32_t w = viewports[vpIndex]->GetWidth();
|
||||
uint32_t h = viewports[vpIndex]->GetHeight();
|
||||
currentCmdBuffer->SetViewportScissor (static_cast<float>(w), static_cast<float>(h), w, h);
|
||||
|
||||
currentCmdBuffer->ForceSetPipelineLayout(SHGraphicsGlobalData::GetDummyPipelineLayout());
|
||||
|
||||
// Bind all the buffers required for meshes
|
||||
|
@ -512,6 +519,13 @@ namespace SHADE
|
|||
swapchain->Resize(surface, windowDims.first, windowDims.second);
|
||||
|
||||
renderContext.HandleResize();
|
||||
|
||||
worldRenderGraph->HandleResize(windowDims.first, windowDims.second);
|
||||
|
||||
defaultViewport->SetWidth(windowDims.first);
|
||||
defaultViewport->SetHeight(windowDims.second);
|
||||
|
||||
worldCamera->SetPerspective(90.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 100.0f);
|
||||
}
|
||||
|
||||
void SHGraphicsSystem::SetWindow(SHWindow* wind) noexcept
|
||||
|
|
|
@ -316,5 +316,7 @@ namespace SHADE
|
|||
|
||||
// Temp Materials
|
||||
Handle<SHMaterial> defaultMaterial;
|
||||
|
||||
Handle<SHRenderGraph> worldRenderGraph;
|
||||
};
|
||||
}
|
|
@ -73,4 +73,16 @@ namespace SHADE
|
|||
iter->Free();
|
||||
renderers.erase(iter);
|
||||
}
|
||||
|
||||
void SHViewport::SetWidth(uint32_t w) noexcept
|
||||
{
|
||||
viewport.width = w;
|
||||
}
|
||||
|
||||
void SHViewport::SetHeight(uint32_t h) noexcept
|
||||
{
|
||||
viewport.height = h;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -62,6 +62,12 @@ namespace SHADE
|
|||
Handle<SHRenderer> AddRenderer(ResourceManager& resourceManager, uint32_t numFrames, std::vector<Handle<SHVkCommandPool>>& cmdPools, Handle<SHVkDescriptorPool> descriptorPool, Handle<SHVkDescriptorSetLayout> cameraDescLayout, Handle<SHRenderGraph> renderGraph);
|
||||
void RemoveRenderer(Handle<SHRenderer> renderer);
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Setters */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
void SetWidth(uint32_t w) noexcept;
|
||||
void SetHeight (uint32_t h) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Getters */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
|
|
@ -46,7 +46,7 @@ namespace SHADE
|
|||
if (w == static_cast<uint32_t>(-1) && h == static_cast<uint32_t>(-1))
|
||||
{
|
||||
w = swapchainHdl->GetSwapchainImage(0)->GetWidth();
|
||||
w = swapchainHdl->GetSwapchainImage(0)->GetHeight();
|
||||
h = swapchainHdl->GetSwapchainImage(0)->GetHeight();
|
||||
format = swapchainHdl->GetSurfaceFormatKHR().format;
|
||||
}
|
||||
|
||||
|
@ -465,9 +465,6 @@ namespace SHADE
|
|||
// better way to manage these
|
||||
void SHRenderGraph::Execute(uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept
|
||||
{
|
||||
// TODO: DON'T HARDCODE THIS
|
||||
cmdBuffer->SetViewportScissor(1920.0f, 1080.0f, 1920, 1080);
|
||||
|
||||
for (auto& node : nodes)
|
||||
node->Execute(cmdBuffer, descPool, frameIndex);
|
||||
}
|
||||
|
@ -480,13 +477,16 @@ namespace SHADE
|
|||
}
|
||||
}
|
||||
|
||||
void SHRenderGraph::HandleResize(void) noexcept
|
||||
void SHRenderGraph::HandleResize(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||
{
|
||||
// resize resources
|
||||
for (auto& [name, resource]: graphResources)
|
||||
resource->HandleResize();
|
||||
|
||||
resource->HandleResize(newWidth, newHeight);
|
||||
|
||||
for (auto& node : nodes)
|
||||
{
|
||||
node->HandleResize();
|
||||
}
|
||||
}
|
||||
|
||||
Handle<SHRenderGraphNode> SHRenderGraph::GetNode(std::string const& nodeName) const noexcept
|
||||
|
|
|
@ -80,7 +80,7 @@ namespace SHADE
|
|||
void Generate (void) noexcept;
|
||||
void Execute (uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept;
|
||||
void FinaliseBatch(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool);
|
||||
void HandleResize (void) noexcept;
|
||||
void HandleResize (uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SETTERS AND GETTERS */
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||
#include "Graphics/Images/SHVkImageView.h"
|
||||
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
||||
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
||||
#include "SHRenderGraphResource.h"
|
||||
#include "SHSubpass.h"
|
||||
|
||||
|
@ -58,7 +59,29 @@ namespace SHADE
|
|||
|
||||
void SHRenderGraphNode::HandleResize(void) noexcept
|
||||
{
|
||||
renderpass->HandleResize();
|
||||
|
||||
for (uint32_t i = 0; i < framebuffers.size(); ++i)
|
||||
{
|
||||
std::vector<Handle<SHVkImageView>> imageViews(attResources.size());
|
||||
uint32_t fbWidth = std::numeric_limits<uint32_t>::max();
|
||||
uint32_t fbHeight = std::numeric_limits<uint32_t>::max();
|
||||
|
||||
for (uint32_t j = 0; j < attResources.size(); ++j)
|
||||
{
|
||||
uint32_t imageViewIndex = (attResources[j]->resourceType == SH_ATT_DESC_TYPE::COLOR_PRESENT) ? i : 0;
|
||||
imageViews[j] = attResources[j]->imageViews[imageViewIndex];
|
||||
|
||||
// We want the minimum dimensions for the framebuffer because the image attachments referenced cannot have dimensions smaller than the framebuffer's
|
||||
if (fbWidth > attResources[j]->width)
|
||||
fbWidth = attResources[j]->width;
|
||||
if (fbHeight > attResources[j]->height)
|
||||
fbHeight = attResources[j]->height;
|
||||
}
|
||||
|
||||
|
||||
framebuffers[i]->HandleResize(renderpass, imageViews, fbWidth, fbHeight);
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
|
|
@ -146,6 +146,7 @@ namespace SHADE
|
|||
, width{ rhs.width }
|
||||
, height{ rhs.height }
|
||||
, mipLevels{ rhs.mipLevels }
|
||||
, imageAspectFlags{ rhs.imageAspectFlags }
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -176,6 +177,7 @@ namespace SHADE
|
|||
width = rhs.width;
|
||||
height = rhs.height;
|
||||
mipLevels = rhs.mipLevels;
|
||||
imageAspectFlags = rhs.imageAspectFlags;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
@ -193,8 +195,11 @@ namespace SHADE
|
|||
|
||||
}
|
||||
|
||||
void SHRenderGraphResource::HandleResize(void) noexcept
|
||||
void SHRenderGraphResource::HandleResize(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||
{
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
|
||||
if (resourceType != SH_ATT_DESC_TYPE::COLOR_PRESENT)
|
||||
{
|
||||
// prepare image view details
|
||||
|
@ -211,7 +216,7 @@ namespace SHADE
|
|||
|
||||
for (uint32_t i = 0; i < images.size(); ++i)
|
||||
{
|
||||
images[i]->HandleResizeFramebufferImage();
|
||||
images[i]->HandleResizeFramebufferImage(width, height);
|
||||
imageViews[i]->ViewNewImage(images[i], viewDetails);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace SHADE
|
|||
SHRenderGraphResource& operator=(SHRenderGraphResource&& rhs) noexcept;
|
||||
~SHRenderGraphResource(void) noexcept;
|
||||
|
||||
void HandleResize (void) noexcept;
|
||||
void HandleResize (uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||
|
||||
friend class SHRenderGraphNode;
|
||||
friend class SHRenderGraph;
|
||||
|
|
|
@ -227,6 +227,7 @@ namespace SHADE
|
|||
, vkSubpassDeps{ std::move(rhs.vkSubpassDeps) }
|
||||
, clearColors{ std::move(rhs.clearColors) }
|
||||
, vkAttachmentDescriptions{ std::move(rhs.vkAttachmentDescriptions) }
|
||||
, numAttDescs{rhs.numAttDescs}
|
||||
{
|
||||
rhs.vkRenderpass = VK_NULL_HANDLE;
|
||||
}
|
||||
|
@ -243,6 +244,7 @@ namespace SHADE
|
|||
vkSubpassDeps = std::move(rhs.vkSubpassDeps);
|
||||
clearColors = std::move(rhs.clearColors);
|
||||
vkAttachmentDescriptions = std::move(rhs.vkAttachmentDescriptions);
|
||||
numAttDescs = std::move(rhs.numAttDescs);
|
||||
|
||||
rhs.vkRenderpass = VK_NULL_HANDLE;
|
||||
|
||||
|
@ -255,6 +257,31 @@ namespace SHADE
|
|||
}
|
||||
|
||||
|
||||
void SHVkRenderpass::HandleResize(void) noexcept
|
||||
{
|
||||
logicalDeviceHdl->GetVkLogicalDevice().destroyRenderPass(vkRenderpass, nullptr);
|
||||
|
||||
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
||||
|
||||
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkAttachmentDescriptions.size());
|
||||
renderPassCreateInfo.pAttachments = vkAttachmentDescriptions.data();
|
||||
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(vkSubpassDescriptions.size());
|
||||
renderPassCreateInfo.pSubpasses = vkSubpassDescriptions.data();
|
||||
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(vkSubpassDeps.size());
|
||||
renderPassCreateInfo.pDependencies = vkSubpassDeps.data();
|
||||
|
||||
|
||||
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createRenderPass(&renderPassCreateInfo, nullptr, &vkRenderpass); result != vk::Result::eSuccess)
|
||||
{
|
||||
SHVulkanDebugUtil::ReportVkError(result, "Failed to create Renderpass. ");
|
||||
}
|
||||
else
|
||||
{
|
||||
SHVulkanDebugUtil::ReportVkSuccess("Successfully created Renderpass. ");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
vk::RenderPass SHVkRenderpass::GetVkRenderpass(void) const noexcept
|
||||
{
|
||||
return vkRenderpass;
|
||||
|
|
|
@ -55,6 +55,8 @@ namespace SHADE
|
|||
SHVkRenderpass(SHVkRenderpass&& rhs) noexcept;
|
||||
SHVkRenderpass& operator=(SHVkRenderpass&& rhs) noexcept;
|
||||
|
||||
void HandleResize (void) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PUBLIC MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
|
Loading…
Reference in New Issue