fix: recrea gameCanvas en setVideoMode per evitar sprites perduts en resize amb Vulkan/Windows
This commit is contained in:
@@ -245,6 +245,21 @@ void Screen::setVideoMode(bool fullscreen) {
|
|||||||
applyWindowedLayout();
|
applyWindowedLayout();
|
||||||
}
|
}
|
||||||
applyLogicalPresentation(fullscreen);
|
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
|
// Cambia entre pantalla completa y ventana
|
||||||
@@ -347,6 +362,13 @@ void Screen::applyWindowedLayout() {
|
|||||||
|
|
||||||
// Modifica el tamaño de la ventana
|
// Modifica el tamaño de la ventana
|
||||||
SDL_SetWindowSize(window, windowWidth * Options::window.zoom, windowHeight * Options::window.zoom);
|
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);
|
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user