- The borderless window has a frame style for resizing, snapping and its
shadow, with WM_NCCALCSIZE keeping the whole window client. Its edges
and corners resize it; maximised, it is inset by the frame Windows puts
past the screen.
- WM_GETMINMAXINFO holds it to the size it opens at.
- The swap chain's buffers follow the client size (Renderer::resize).
- Frames are drawn from WM_SIZE too, so dragging an edge (Windows' own
message loop) does not stretch the last frame.
Since 2.0.4 the DX12 backend compiles only the HDR-aware pixel shader at
runtime with D3DCompile(). Wine's builtin d3dcompiler (macOS, Apple's Game
Porting Toolkit) cannot build it, so ImGui_ImplDX12_CreateDeviceObjects()
failed and the launcher refused to open on every Mac.
Try the HDR-aware shader first, then the stock one 2.0.3 shipped (on a
failed compile or a failed pipeline). ImGui_ImplDX12_HasOutputTransfer()
tells the launcher and overlay which one is drawing, and they log it.
Windows keeps the HDR shader and HDR output as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A blank launcher window (Launcher/gui_renderer.cpp, Launcher/gui.cpp)
Reported as a launcher that showed nothing, from someone with a GT 1030.
The log named the card it had used: Intel HD Graphics 4600, the onboard
chip beside it.
- D3D12CreateDevice(nullptr, ...) takes whichever adapter DXGI lists
first, which on a PC with onboard graphics beside a real card is the
onboard one. It now walks EnumAdapterByGpuPreference with
HIGH_PERFORMANCE, skips software adapters and takes the first that
gives a device, as a game would. The old default adapter and WARP
remain behind it, so no working setup loses its device.
- That chip's Direct3D 12 driver cannot build a pipeline, and the ImGui
backend creates one on the first frame while ignoring whether it
worked (imgui_impl_dx12.cpp:792). Every draw then does nothing and the
window shows only ClearRenderTargetView's colour, which is near black.
Untextured shapes sample the font atlas's white pixel, so a failed
atlas looks identical -- the drawn background disappears with the
text. The pipeline and font texture are built in init now and checked,
and a failure says to update the driver and that the card may be below
what ReSkate and skate. need.
- None of this was diagnosable, because the renderer logged nothing at
all. It now records the adapter, its memory and whether it is the
software fallback; the window size, scale, system DPI and work area;
the font atlas size and whether it built; and the first frame drawn.
Those four lines are what turned "blank window, healthy log" into the
two bugs above, and they separate a missing device from a missing
pipeline from a window that draws and is still black.
World layers (Engine/Vfs/world_layer_scan.cpp)
- CoreGameAssets had a row like any other, and switching it off took the
world away with no clue which row had done it. essential_layer keeps
its node, so its children are still found and still switchable, and
drops its row -- which removes it from the menu, from "world <key>
off" and from layer sync at once, rather than hiding it in one place
and leaving it reachable from another.
- Choices are stored by row key, not by index, so no saved setting
shifts, and an "off" already stored for it has no row to apply to: a
profile that turned it off fixes itself on the next launch.
- The cache stamp goes to 2, so a cache written before this is rebuilt
instead of keeping the row alive on existing installs.
- The scan test asserted one row per node, which this breaks on purpose.
It now checks the counts differ, that no row's key holds
"coregameassets", and that the node is still there. Against a real
install: 262 rows to 261, six maps, passing.