fix: recrea gameCanvas en setVideoMode per evitar sprites perduts en resize amb Vulkan/Windows

This commit is contained in:
2026-05-14 13:55:36 +02:00
parent 7a09c0aa89
commit cf436f0014
+22
View File
@@ -245,6 +245,21 @@ void Screen::setVideoMode(bool fullscreen) {
applyWindowedLayout();
}
applyLogicalPresentation(fullscreen);
// En SDL3 + Vulkan sobre Windows, després de SDL_SetWindowSize la render-
// target texture (gameCanvas) queda en un estat on SDL_RenderClear funciona
// però SDL_RenderTexture* no dibuixa res: el frame següent només mostra el
// fons net, els sprites desapareixen. Title se'n surt sense voler perquè
// createTiledBackground() crea/destrueix una textura target nova, i això
// reinicialitza l'estat intern del renderer. Recreem gameCanvas aquí
// mateix per garantir el mateix efecte en qualsevol escena.
if (gameCanvas != nullptr) {
SDL_DestroyTexture(gameCanvas);
gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight);
if (gameCanvas != nullptr) {
SDL_SetTextureScaleMode(gameCanvas, Options::video.scale_mode);
}
}
}
// Cambia entre pantalla completa y ventana
@@ -347,6 +362,13 @@ void Screen::applyWindowedLayout() {
// Modifica el tamaño de la ventana
SDL_SetWindowSize(window, windowWidth * Options::window.zoom, windowHeight * Options::window.zoom);
// Sense aquesta sincronia, en Windows + Vulkan el swapchain del SDL3 GPU
// es queda en estat out-of-date després del resize i SDL_AcquireGPU-
// SwapchainTexture deixa de tornar una textura vàlida → finestra negra.
// En Linux Mesa el driver ho tolera, però el patró segur (igual que
// jaildoctors_dilemma) és esperar que el WM completi el resize abans de
// reposicionar i continuar amb el render.
SDL_SyncWindow(window);
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
}