diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index 6d8a4f0..5fddf5e 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -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); }