From e6464335af1cbe4144cd530dce67dc470afbbab8 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Mon, 18 Oct 2021 09:09:55 -0700 Subject: [PATCH] Fix Vulkan issues with VK_ERROR_OUT_OF_DATE caused by the swapchain not being updated on a resize (#4740) - Updated the RenderViewportWidget::event method to call 'SendWindowResizeEvent' on specific events - Moved the onResize to one of the events in RenderViewportWidget::event Signed-off-by: Steve Pham --- .../Viewport/RenderViewportWidget.h | 1 - .../Source/Viewport/RenderViewportWidget.cpp | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 69b99093f0..268285adc0 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -123,7 +123,6 @@ namespace AtomToolsFramework void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; // QWidget overrides ... - void resizeEvent(QResizeEvent *event) override; bool event(QEvent* event) override; void enterEvent(QEvent* event) override; void leaveEvent(QEvent* event) override; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index 83926ecc79..e8975c0b62 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -194,13 +194,21 @@ namespace AtomToolsFramework m_controllerList->UpdateViewport({GetId(), AzFramework::FloatSeconds(deltaTime), m_time}); } - void RenderViewportWidget::resizeEvent([[maybe_unused]] QResizeEvent* event) - { - SendWindowResizeEvent(); - } - bool RenderViewportWidget::event(QEvent* event) { + // On some types of QEvents, a resize event is needed to make sure that the current viewport window + // needs to be updated based on a potential new surface dimensions. + switch (event->type()) + { + case QEvent::ScreenChangeInternal: + case QEvent::UpdateLater: + case QEvent::Resize: + SendWindowResizeEvent(); + break; + + default: + break; + } return QWidget::event(event); }