Skip to content

Commit d3721c3

Browse files
Fix render resolution at different UI scales (#514)
1 parent a3476c7 commit d3721c3

18 files changed

+128
-57
lines changed

src/Cafe/HW/Latte/Core/LatteOverlay.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,9 +513,9 @@ void LatteOverlay_render(bool pad_view)
513513

514514
sint32 w = 0, h = 0;
515515
if (pad_view && gui_isPadWindowOpen())
516-
gui_getPadWindowSize(&w, &h);
516+
gui_getPadWindowPhysSize(w, h);
517517
else
518-
gui_getWindowSize(&w, &h);
518+
gui_getWindowPhysSize(w, h);
519519

520520
if (w == 0 || h == 0)
521521
return;

src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -848,9 +848,9 @@ void LatteRenderTarget_getScreenImageArea(sint32* x, sint32* y, sint32* width, s
848848
{
849849
int w, h;
850850
if(padView && gui_isPadWindowOpen())
851-
gui_getPadWindowSize(&w, &h);
851+
gui_getPadWindowPhysSize(w, h);
852852
else
853-
gui_getWindowSize(&w, &h);
853+
gui_getWindowPhysSize(w, h);
854854

855855
sint32 scaledOutputX;
856856
sint32 scaledOutputY;

src/Cafe/HW/Latte/Core/LatteShaderCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
418418
continue;
419419

420420
int w, h;
421-
gui_getWindowSize(&w, &h);
421+
gui_getWindowPhysSize(w, h);
422422
const Vector2f window_size{ (float)w,(float)h };
423423

424424
ImGui_GetFont(window_size.y / 32.0f); // = 24 by default

src/Cafe/HW/Latte/Core/LatteThread.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ int Latte_ThreadEntry()
117117
{
118118
SetThreadName("LatteThread");
119119
sint32 w,h;
120-
gui_getWindowSize(&w,&h);
120+
gui_getWindowPhysSize(w,h);
121121

122122
// imgui
123123
ImGui::CreateContext();

src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,9 @@ void OpenGLRenderer::DrawBackbufferQuad(LatteTextureView* texView, RendererOutpu
556556
{
557557
int windowWidth, windowHeight;
558558
if (padView)
559-
gui_getPadWindowSize(&windowWidth, &windowHeight);
559+
gui_getPadWindowPhysSize(windowWidth, windowHeight);
560560
else
561-
gui_getWindowSize(&windowWidth, &windowHeight);
561+
gui_getWindowPhysSize(windowWidth, windowHeight);
562562
g_renderer->renderTarget_setViewport(0, 0, windowWidth, windowHeight, 0.0f, 1.0f);
563563
g_renderer->ClearColorbuffer(padView);
564564
}

src/Cafe/HW/Latte/Renderer/Renderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ bool Renderer::ImguiBegin(bool mainWindow)
3636
{
3737
sint32 w = 0, h = 0;
3838
if(mainWindow)
39-
gui_getWindowSize(&w, &h);
39+
gui_getWindowPhysSize(w, h);
4040
else if(gui_isPadWindowOpen())
41-
gui_getPadWindowSize(&w, &h);
41+
gui_getPadWindowPhysSize(w, h);
4242
else
4343
return false;
4444

src/Cafe/HW/Latte/Renderer/Vulkan/CocoaSurface.mm

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,23 @@ -(BOOL) wantsUpdateLayer { return YES; }
1313

1414
+(Class) layerClass { return [CAMetalLayer class]; }
1515

16-
-(CALayer*) makeBackingLayer { return [self.class.layerClass layer]; }
16+
// copied from https://github.com/KhronosGroup/MoltenVK/blob/master/Demos/Cube/macOS/DemoViewController.m
1717

18+
-(CALayer*) makeBackingLayer
19+
{
20+
CALayer* layer = [self.class.layerClass layer];
21+
CGSize viewScale = [self convertSizeToBacking: CGSizeMake(1.0, 1.0)];
22+
layer.contentsScale = MIN(viewScale.width, viewScale.height);
23+
return layer;
24+
}
25+
26+
-(BOOL) layer: (CALayer *)layer shouldInheritContentsScale: (CGFloat)newScale fromWindow: (NSWindow *)window
27+
{
28+
if (newScale == layer.contentsScale) { return NO; }
29+
30+
layer.contentsScale = newScale;
31+
return YES;
32+
}
1833
@end
1934

2035
VkSurfaceKHR CreateCocoaSurface(VkInstance instance, void* handle)

src/Cafe/HW/Latte/Renderer/Vulkan/SwapchainInfoVk.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -208,20 +208,14 @@ bool SwapchainInfoVk::AcquireImage(uint64 timeout)
208208

209209
VkSemaphore acquireSemaphore = m_acquireSemaphores[m_acquireIndex];
210210
VkResult result = vkAcquireNextImageKHR(m_logicalDevice, swapchain, timeout, acquireSemaphore, m_imageAvailableFence, &swapchainImageIndex);
211-
if (result == VK_TIMEOUT)
211+
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
212+
m_shouldRecreate = true;
213+
if (result < 0)
212214
{
213-
return false;
214-
}
215-
else if (result != VK_SUCCESS)
216-
{
217-
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
218-
m_shouldRecreate = true;
219-
220-
if (result == VK_ERROR_OUT_OF_DATE_KHR)
221-
return false;
222-
223-
if (result != VK_ERROR_OUT_OF_DATE_KHR && result != VK_SUBOPTIMAL_KHR)
215+
swapchainImageIndex = -1;
216+
if (result != VK_ERROR_OUT_OF_DATE_KHR)
224217
throw std::runtime_error(fmt::format("Failed to acquire next image: {}", result));
218+
return false;
225219
}
226220
m_currentSemaphore = acquireSemaphore;
227221
m_awaitableFence = m_imageAvailableFence;

src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ VulkanRenderer* VulkanRenderer::GetInstance()
643643
return (VulkanRenderer*)g_renderer.get();
644644
}
645645

646-
void VulkanRenderer::Initialize(const Vector2i& size, bool mainWindow)
646+
void VulkanRenderer::InitializeSurface(const Vector2i& size, bool mainWindow)
647647
{
648648
auto& windowHandleInfo = mainWindow ? gui_getWindowInfo().canvas_main : gui_getWindowInfo().canvas_pad;
649649

@@ -2564,20 +2564,20 @@ void VulkanRenderer::RecreateSwapchain(bool mainWindow, bool skipCreate)
25642564
if (mainWindow)
25652565
{
25662566
ImGui_ImplVulkan_Shutdown();
2567-
gui_getWindowSize(&size.x, &size.y);
2567+
gui_getWindowPhysSize(size.x, size.y);
25682568
}
25692569
else
25702570
{
2571-
gui_getPadWindowSize(&size.x, &size.y);
2571+
gui_getPadWindowPhysSize(size.x, size.y);
25722572
}
25732573

2574+
chainInfo.swapchainImageIndex = -1;
25742575
chainInfo.Cleanup();
25752576
chainInfo.m_desiredExtent = size;
25762577
if(!skipCreate)
25772578
{
25782579
chainInfo.Create(m_physicalDevice, m_logicalDevice);
25792580
}
2580-
chainInfo.swapchainImageIndex = -1;
25812581

25822582
if (mainWindow)
25832583
ImguiInit();
@@ -2644,13 +2644,12 @@ void VulkanRenderer::SwapBuffer(bool mainWindow)
26442644
presentInfo.pWaitSemaphores = &presentSemaphore;
26452645

26462646
VkResult result = vkQueuePresentKHR(m_presentQueue, &presentInfo);
2647-
if (result != VK_SUCCESS)
2647+
if (result < 0 && result != VK_ERROR_OUT_OF_DATE_KHR)
26482648
{
2649-
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
2650-
chainInfo.m_shouldRecreate = true;
2651-
else
2652-
throw std::runtime_error(fmt::format("Failed to present image: {}", result));
2649+
throw std::runtime_error(fmt::format("Failed to present image: {}", result));
26532650
}
2651+
if(result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
2652+
chainInfo.m_shouldRecreate = true;
26542653

26552654
chainInfo.hasDefinedSwapchainImage = false;
26562655

src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class VulkanRenderer : public Renderer
182182

183183
void GetDeviceFeatures();
184184
void DetermineVendor();
185-
void Initialize(const Vector2i& size, bool mainWindow);
185+
void InitializeSurface(const Vector2i& size, bool mainWindow);
186186

187187
const std::unique_ptr<SwapchainInfoVk>& GetChainInfoPtr(bool mainWindow) const;
188188
SwapchainInfoVk& GetChainInfo(bool mainWindow) const;

0 commit comments

Comments
 (0)