Files
Invictus-potens 6c0ae157f0 Feat(Graphics): defaulted the render resolution to 1280x800 on the Steam Deck (#855) (#877)
A first start on a Steam Deck (LCD Jupiter or OLED Galileo, from the DMI names) now uses its own 1280 x 800 screen instead of 1920 x 1080 with black bars. A resolution saved in spartanport.ini still wins. Also removed the 1280 x 720 (Steam Deck) label and marked 1280x800, 1440x900 and 1360x768 as tested in the Ultrawide mod README, as docs/ultrawide.md already does.
2026-10-20 23:48:33 -03:00

12 KiB
Raw Permalink Blame History

Ultrawide (21:9 and 32:9) — beta

English | Português (Brasil)

The ultrawide sizes are built in: choose one in Render resolution (launcher or in-game menu); they are the ones nobody has confirmed in game yet are marked "(beta)" (2560x1080, 1440x1080, 2048x1536 and 2560x1920). Before that they were a mod, still available for older versions: the folder extras/mods/Ultrawide (install steps in its README). It uses the patch support of mods: a mod folder can carry game patches (XML files with signatures, in its patches/ folder), applied while the mod is ticked on the Mods page. See MODS.md.

The game's camera has a fixed horizontal field of view. Raising the render resolution to an ultrawide size without touching the camera only crops the 16:9 picture top and bottom, so it looks zoomed in. Each Resolution Patch - <width>x<height> entry fixes that: the picture fills the whole screen, the world keeps its proportions, and the vertical view is the same as at 16:9.

Render resolution Aspect Status
2560 × 1080 21:9 Tested in game
3440 × 1440 21:9 Tested in game
3840 × 1600 21:9 Tested in game
5120 × 1440 32:9 Tested in game
5120 × 2160 21:9 Tested in game by two players (issue #505); it uses the largest Video Arena the patch can hold (3.98 GiB)
1920 × 1200 16:10 Tested in game (taller than 16:9: no field of view change)
2560 × 1600 16:10 Tested in game (taller than 16:9: no field of view change)
1280 × 800 16:10 Tested in game (the Steam Deck's screen; chosen by default on a Steam Deck)
1280 × 960, 1440 × 1080, 1920 × 1440, 2048 × 1536, 2560 × 1920 4:3 1280 × 960 and 1920 × 1440 tested (menu and gameplay: 1280 × 960 on a 5:4 monitor, 1920 × 1440 by a player on a 4:3 CRT, issue #519); the others are not (taller than 16:9, but the game letterboxes on exactly 4:3: the patch avoids that)
1440 × 900 16:10 Tested in game
1360 × 768 16:9 Tested in game (the shape of the original picture; no aspect ratio or field of view change)

Every size but 1440x1080, 2048x1536 and 2560x1920 was tested in game: on an RX 6700 XT (Windows 11, reference build d85c8135…), and 3440x1440, 5120x1440, 1920x1200 and 2560x1600 also by players in issue #180, 5120x2160 by two players in #505 and 1920x1440 by a player in #519 (thank you!). They stay marked "(beta)" until a second screen or GPU confirms them: the sizes confirmed in game by players are not marked, so 2560x1080, 1440x1080, 2048x1536 and 2560x1920 still are. If something looks wrong on yours, please say how it looks (an issue): the resolution, your GPU, and whether anything is cropped, stretched or missing at the edges.

Known limitations (outside 16:9)

They come from the game, which is built for 16:9, and are already known; they will be fixed soon:

  • Menus: the darkened background covers only the middle 16:9 area, so the sides stay lighter, and on the start menu Kratos is half covered by the fade.
  • QTE prompts and some HUD elements keep a 16:9 layout.
  • The sides can flash black for a moment in the transition from a camera sequence back to gameplay.
  • Startup logo screens are stretched to the whole screen.
  • Pre-rendered videos (cutscenes, intros) keep their native 16:9 size, with black bars at the sides.

Using it

Choose a size in Render resolution (launcher, Home and Performance) or in the in-game menu (Insert or R3+L2 → Performance → Render resolution). Each one shows its exact size and aspect ratio, for example 2560 × 1080 · 21:9 (beta). Pick one and PLAY (in the game menu: "Apply and restart"). The Engine frame rate (60, 100, 120, 144, 180 or 240) is a separate choice that works with any resolution.

Older versions (before 2.4.0): put Ultrawide.zip (made with python tools/zip_mod.py extras/mods/Ultrawide) or the Ultrawide folder in the mods folder; a zip is unpacked by itself when the launcher or the game starts. The mod's resolutions then show up in Render resolution after the built-in ones. Untick the mod to go back.

What you get:

  • The world and the HUD fill the screen; characters keep their proportions. Menus are in the right proportion.
  • Cutscenes keep their borders. They are pre-rendered 16:9 videos, so they play with black bars at the sides (above and below at 16:10). Stretching them to fill the screen would distort the picture, and they cannot be re-rendered. The game draws a cutscene in a 16:9 picture in the middle and never clears the rest of the screen (at 16:9 there is no rest), so the last game frame used to stay in the bars. While the video decoder hands out pictures, the presenter now draws everything outside that picture black (video_core/renderer_vulkan/movie_bars.h; render sizes within 1% of 16:9 are left alone).
  • Menus are 16:9. The game fits its menus and HUD to a 16:9 area in the middle, so the darkened background of a menu does not reach the sides (the top and bottom at 16:10).
  • At 32:9 the field of view is multiplied by 2 horizontally. It is rectilinear, so objects at the very edges look stretched, as in any game with a very wide field of view.

16:10 (taller than 16:9)

The camera keeps the horizontal view, so on a taller screen the picture simply shows more at the top and bottom, without distortion. The 16:10 entries therefore only set the resolution and the aspect ratio (k = 1: no field of view change, no caves). 4:3: the game letterboxes its picture to 16:9 when the second aspect float is exactly 4/3 (function at 0x56fc60), so the 4:3 entries write that float one unit above (tools/make_ultrawide_patch.py, aspect_floats).

What it changes (wider than 16:9)

  1. The render resolution, as the built-in Resolution Patch entries do, and the Video Arena size.
  2. The display aspect ratio, two floats in the video mode (16/9 → width/height).
  3. The tangent t of the field of view, multiplied by k = (width/height) / (16/9) (43/32 at 3440x1440), in the four places the cameras read it. The projection is x = 2/t, y = 2A/t (A = aspect ratio), so with the new A and t·k the vertical view stays the one of a 16:9 picture and the horizontal one widens. The same t feeds the culling vectors (two builders) and the standard camera's tan(fov/2), so nothing is culled at the sides.

There is no room for a multiplication in place. Each of the four sites becomes a jmp into two chained 15-byte NOP pads between functions ("caves": the first runs the replaced instruction, the second multiplies by k and jumps back), and a ninth pad holds the constant k. Every site and pad is found by a signature (Pattern/At) like the built-in patches; a build that does not match skips the patch.

Other resolutions

tools/make_ultrawide_patch.py writes the entries of the mod (it needs the 6e72 eboot.bin and capstone):

python tools/make_ultrawide_patch.py path/to/eboot.bin 3840 1080 --mod extras/mods/Ultrawide/patches/Ultrawide.xml

The two numbers are the width and the height. A new size is marked "not tested" in the patch note until it is added to TESTED_IN_GAME in the tool. A mod's resolutions are listed by the launcher and the game menu from its patch file; to make a size built in, also add its entry to patches/CUSA01623.xml and its name to the resolution lists (scripts/graphics_options.py, gpu/shim/spartanport_graphics.h, spartanport_overlay.cpp).

Reference build addresses

The Address attributes the tool writes are addresses in the 6e72… build. The signatures are what is used. The built-in entries in patches/CUSA01623.xml were rebased to the reference build (d85c8135…); to do the same for a new entry, run with that build's eboot.bin, once per size:

python tools/make_ultrawide_patch.py --rebase path/to/eboot_d85c.bin 3440 1440 --mod extras/mods/Ultrawide/patches/Ultrawide.xml

Português (Brasil)

As resoluções ultrawide são embutidas: escolha em Resolução de renderização (launcher ou menu do jogo); as que ninguém confirmou ainda no jogo aparecem com "(beta)" (2560x1080, 1440x1080, 2048x1536 e 2560x1920). Antes eram um mod, que continua disponível para versões antigas: a pasta extras/mods/Ultrawide (o passo a passo está no README dela). Ele usa o suporte a patches dos mods: uma pasta de mod pode trazer patches de jogo (arquivos XML com assinaturas, na pasta patches/), aplicados enquanto o mod está marcado na página Mods. Veja MODS.pt-BR.md.

A câmera do jogo tem campo de visão horizontal fixo. Aumentar a resolução para um tamanho ultrawide sem mexer na câmera só corta a imagem de 16:9 em cima e embaixo, e ela parece com zoom. Cada entrada Resolution Patch - <largura>x<altura> corrige isso: a imagem enche a tela, o mundo mantém as proporções e a visão vertical é a mesma do 16:9.

Todas as resoluções, menos 1440x1080, 2048x1536 e 2560x1920, foram testadas no jogo: numa RX 6700 XT (Windows 11, build de referência d85c8135…), e 3440x1440, 5120x1440, 1920x1200 e 2560x1600 também por jogadores na issue #180, 5120x2160 por dois jogadores no #505 e 1920x1440 por um jogador (CRT 4:3) no #519. Elas continuam marcadas como "(beta)" até uma segunda tela ou placa confirmar: os tamanhos confirmados por jogadores no jogo não têm a marca, então 2560x1080, 1440x1080, 2048x1536 e 2560x1920 ainda têm; se algo parecer errado na sua, conte numa issue (a resolução, a placa de vídeo e o que aparece cortado, esticado ou faltando nas bordas). Os tamanhos 16:10 (1920x1200 e 2560x1600): como a câmera mantém o campo horizontal, uma imagem mais alta só mostra mais em cima e embaixo, então essas entradas mudam apenas a resolução e o aspect ratio.

Como usar: escolha um tamanho em Resolução de renderização (launcher, páginas Início e Desempenho) ou no menu do jogo (Insert ou R3+L2 → Performance → Render resolution). Cada opção mostra a resolução exata e a proporção, por exemplo 2560 × 1080 · 21:9 (beta). Escolha e clique em JOGAR. A Taxa de quadros do motor (60, 100, 120, 144, 180 ou 240) é uma escolha à parte e vale com qualquer resolução. Versões antigas (antes da 2.4.0): coloque o Ultrawide.zip (gerado com python tools/zip_mod.py extras/mods/Ultrawide) ou a pasta Ultrawide na pasta de mods; o zip é extraído sozinho ao abrir o launcher ou o jogo.

As cutscenes continuam com bordas: são vídeos 16:9 pré-renderizados, então tocam com barras pretas dos lados (em cima e embaixo no 16:10); esticá-los deformaria a imagem. O jogo desenha a cutscene num quadro 16:9 no meio e nunca limpa o resto da tela, então o último frame do jogo ficava nas barras; enquanto o decodificador de vídeo entrega quadros, o presenter agora pinta de preto tudo fora desse quadro. Os menus são 16:9: o fundo escurecido de um menu não chega aos lados (nem em cima e embaixo no 16:10). No 32:9 o campo de visão horizontal fica multiplicado por 2, e objetos nas bordas extremas parecem esticados.

Limitações conhecidas (fora do 16:9), que vêm do próprio jogo, feito para 16:9; já são conhecidas e serão corrigidas em breve: o fundo escurecido dos menus cobre só a área 16:9 do meio (os lados ficam mais claros); os prompts de QTE e parte do HUD ficam no layout 16:9; as laterais podem piscar em preto por um instante na transição de uma sequência de câmera para o gameplay; as telas de logo da abertura ficam esticadas; e os vídeos pré-renderizados mantêm o tamanho 16:9 com barras pretas.