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();
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user